プレイするゲームがないなら、自分で作ればいいじゃない!
ということで初心者が Unity を使って「ゲームを作る」ゲームをやっていきます!
今回は「シーンの切り替え」の記事です
内容
「タイトル⇒ゲームメイン」のように
シーンからシーンの切り替えを実装していきます
シーンを作成
アセットにシーンを作成します
シーンを追加
シーンの追加は「ビルド設定」から行います
ビルド設定
プロジェクトビューから
追加したいシーンをドラッグアンドドロップ
※タイトルなどの起動時に実行したいシーンは1番上にしておくといい
作成したシーンの編集
今回はタイトルのシーンを作成したので
タイトルの画像を用意しました
これをシーンに配置して、C#スクリプトをアタッチします
※画像がない場合は空のオブジェクトを作成して、C#スクリプトをアタッチする
スクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Title : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
// コルーチン開始
StartCoroutine(LoadScene());
}
}
// シーンをロードする(非同期)
IEnumerator LoadScene()
{
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("SampleScene");
// ロードがまだなら次のフレームへ
while (!asyncLoad.isDone)
{
yield return null;
}
}
}
using UnityEngine.SceneManagement;
SceneManager を書きやすくするための1文
この1文がない場合は「UnityEngine.SceneManagement.SceneManager.~」
と書かなければならない
StartCoroutine(LoadScene());
コルーチンを実行する
コルーチンについては後述
SceneManager.LoadSceneAsync(シーン名 or シーン番号);
シーンを非同期でロードする
AsyncOperation を返し、isDone が true になったら
ロードが完了し、シーンが切り替わる
SceneManager.LoadScene(シーン名 or シーン番号);
今回は使っていないが
これでもシーンを同期でロードし切り替えることができる
ロードの時間分、動作が停止してしまうため
LoadSceneAsync の使用が推奨されている
実行すると
キー押下でタイトルからゲームメインに切り替わりました!
コルーチンについて
雑に説明すると
「少し機能が追加された関数=コルーチン」
IEnumerator 関数名(~) でコルーチン実行が可能になる
処理を一旦止められる
コルーチンは処理を一時中断して、その続きから処理を再開することができる
今回の処理で言うとロードが完了するまで
whileの中身を1フレームに1回処理しています
yield return null;
この処理が走ると、処理を中断して
次のフレームで Update 関数がすべて呼び出された後に処理を続行する
yield return new WaitForSeconds(float seconds);
この処理が走ると、指定した秒数の間処理を中断して
Update 関数がすべて呼び出された後に処理を続行する
yield return new WaitForFixedUpdate();
この処理が走ると、処理を中断して
すべてのスクリプトで FixedUpdate 呼び出された後に処理を続行する
他にもありますが、詳しくはこちら
これだけでは使い方がピンとこないですが
重要な要素っぽいので積極的に使っていこうと思います
サンプル動画
タイトル、ゲームメイン、ゲームオーバーのシーンを作り
「タイトル⇒ゲームメイン⇒ゲームオーバー⇒タイトル」
と遷移するようにしてみました!
さいごに
シーンの切り替えというより、コルーチンがメインになってました(笑)
次はタイトル画面を改良する予定です
コメント