シーンを読み込む

Unity

同期的にシーンを読み込む

同期的にシーンを読み込むやつです。手間が少なく簡単です。

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            // シーンを読み込む
            SceneManager.LoadScene("SceneTest");
        }
    }

非同期でシーンを読み込む

非同期でシーンを読み込む方法です。
AsyncOperationクラスを使うことにより、読み込みの進捗を表示したりもできます。 プログレッシブバーを作りたい場合はこっちですね。

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            // 次のシーンへ
            StartCoroutine("LoadScene");
        }
    }

    IEnumerator LoadScene()
    {
        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("SceneTest");
        asyncLoad.allowSceneActivation = false;

        while (true)
        {
            yield return null;

            // 読み込み完了したら
            if(asyncLoad.progress >= 0.9f)
            {
                // シーン読み込み
                asyncLoad.allowSceneActivation = true;
                break;
            }
        }
    }

AsyncOperationクラスにはisDoneという、シーン読み込みが完了しているか確認できるbool型がありますが、
シーン遷移が完了してからtrueになるみたいなので注意が必要です。
isDoneがtrueになったら、allowSceneActivationをtrueにする。といった処理をしてしまうとずっとシーン遷移できないです。

上記コード内の

if(asyncLoad.progress >= 0.9f)

の部分が 0.9f以上となっている部分も気を付けたいですね。

ローディング画面の実装

Test.cs

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            // シーンを読み込む
            loadSceneManager.LoadScene("PolygonScfiCity Demo");
        }
    }

LoadSceneManager.cs

    [SerializeField] GameObject canvas;
    [SerializeField] Slider slider;


    /// <summary>
    /// シーンを読み込む
    /// </summary>
    /// <param name="name"></param>
    public void LoadScene(string name)
    {
        // コルーチンでロード画面を実行
        StartCoroutine(LoadSceneExecute(name));
    }

    IEnumerator LoadSceneExecute(string name)
    {
        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(name);
        asyncLoad.allowSceneActivation = false;

        // スライダーの値更新とロード画面の表示
        slider.value = 0f;
        canvas.SetActive(true);

        while (true)
        {
            yield return null;

            slider.value = asyncLoad.progress;

            if(asyncLoad.progress >= 0.9f)
            {
                slider.value = 1f;
                asyncLoad.allowSceneActivation = true;

                // ロードバーが100%になっても1秒だけ表示維持
                yield return new WaitForSeconds(1f);

                break;
            }
        }

        // ロード画面の非表示
        canvas.SetActive(false);
    }

© Unity Technologies Japan/UCL

コメント

タイトルとURLをコピーしました