logo

【Unity】複数のシーンがあるアプリでシーン遷移を軽くするための工夫

投稿日2023-10-11

更新日2024-05-03

Picture of the logo

タグ一覧

目次(タップして移動)

Unityでゲームアプリを作る際にシーンをまたぐ時に少しでもシーン遷移を軽くする方法を個人的備忘録も兼ねて書き残しておきます。

シーン読み込みは非同期で

以下のようにコルーチンでLoadSceneAsyncを使用する事で非同期でシーンを読み込む事が出来ます。非同期処理中のステータスはAsyncOperation型の変数、この場合asyncLoadに記録されています。処理が完了するとisDoneがtrueになります。

private IEnumerator LoadSceneAsyncCoroutine(string sceneName)
    {
        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneName);
        
        while (!asyncLoad.isDone)
        {
            float progress = Mathf.Clamp01(asyncLoad.progress / 0.9f);
            //ローディング中の処理を記載
            Debug.Log(progress);
            yield return null;
        }
        Debug.Log("Done.");
    }

任意のタイミングで発動

下記の例では予め非同期処理でシーンの読み込みをしておき、任意のタイミングで素早くシーン切り替えがされるようにしました。

具体的には、asyncLoad.allowSceneActivationをfalseにする事で、読み込みが完了しても次のシーンに移行しなくなります。この場合、asyncLoad.allowSceneActivationの値をtrueに書き換えた瞬間シーン遷移がなされます(読み込みが完了していれば)。

using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;

public class SceneLoader : MonoBehaviour
{
    private AsyncOperation asyncLoad;

    // 非同期でシーンを読み込むメソッド
    public void LoadSceneAsync(string sceneName)
    {
        asyncLoad = SceneManager.LoadSceneAsync(sceneName);
        asyncLoad.allowSceneActivation = false; // シーン遷移を一時的にブロックする
    }

    // シーン遷移を瞬時に行うメソッド
    public void ActivateLoadedScene()
    {
        if (asyncLoad != null)
        {
            asyncLoad.allowSceneActivation = true; // シーン遷移を許可して瞬時に遷移
        }
    }

    // 進捗を確認するためのメソッド
    public float GetLoadingProgress()
    {
        if (asyncLoad != null)
        {
            return asyncLoad.progress;
        }
        return 0f;
    }
}

注意点

asyncLoad.allowSceneActivationをfalseにしてシーン遷移を保留にしている時にはasyncLoad.progressが1になる事もisDoneがtrueになる事もありませんので、もしif文などでprogressなどを処理の条件にする場合は注意しましょう。

ローディング画面を表示する方法

シーンに限らず何かロード中に、ユーザーを飽きさせないためにローディング画面を表示することはよくある事です。以下の例ではシーンのロード中に簡単なローディング画面を表示します。進捗度合いがバーになって表示されます(一瞬で終わるかもしれませんが・・・)。

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneLoader : MonoBehaviour
{
    public GameObject loadingScreen;
    public Slider loadingProgressBar;

    public void LoadSceneAsync(string sceneName)
    {
        StartCoroutine(LoadSceneAsyncCoroutine(sceneName));
    }

    private IEnumerator LoadSceneAsyncCoroutine(string sceneName)
    {
        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneName);
        loadingScreen.SetActive(true);

        while (!asyncLoad.isDone)
        {
            float progress = Mathf.Clamp01(asyncLoad.progress / 0.9f);
            loadingProgressBar.value = progress;
            yield return null;
        }

        loadingScreen.SetActive(false);
    }
}

このサンプルでは進捗バーにスライダーコンポーネントを使います。 public変数に設定して実行する事で簡単なロード画面を作る事ができます。

以上、簡単ではありますがシーン遷移の高速化とロード画面の実装を紹介しました。






このサイトをシェアする