SceneLoader

class

名前空間:SilCilSystem.Singletons

継承:SingletonMonoBehaviour<T>


シーンのロード処理を行うシングルトンです。

メンバ一覧

プロパティ

member description
static bool IsBusy 処理中はtrueになります。
static IEnumerator WaitLoading IsBusyがfalseになるまで待機するコルーチンです。
ISceneLoader Loader シーンのロード処理を行うインターフェースを設定/取得します。

メソッド

member description
static void LoadScene(string sceneName) シーンのロード処理を開始します。IsBusyがtrueの場合は無効になります。

使用例

LoadSceneメソッドの呼び出しでシーンを読み込みます。 キーを入力するとシーンを読み込む場合は以下のようになります。

using UnityEngine;
using SilCilSystem.Singletons;

public class Test : MonoBehaviour
{
    [SerializeField] private string m_nextSceneName = "TestScene";

    private void Update()
    {
        if (Input.anyKeyDown)
        {
            SceneLoader.LoadScene(m_nextSceneName);
        }
    }
}

シーンの遷移処理が終了するまで待ちたいことも多いので、WaitLoadingコルーチンを用意しています。

IEnumetator Start()
{
    // 処理を待ちたいときはコルーチンでyield returnする.
    yield return SceneLoader.WaitLoading;
}

使用上の注意点

IsBusyがtrueの場合はLoadSceneを呼び出しても何も起こりません。

実装

実際のロード処理はLoaderに委譲しています。 つまり、シングルトンというよりはサービスロケーターに近い実装になっています。 これは画面エフェクト込みのロードやマルチシーンの対応など、カスタマイズできるようにするためです。

private IEnumerator LoadSceneCoroutine(string sceneName)
{
    m_isBusy = true;
    yield return Loader?.LoadScene(sceneName);
    m_isBusy = false;
}

ISceneLoaderの実装

Loaderはグローバルにアクセスが可能なため、独自の処理を作成し指定できます。 独自に作成する場合はISceneLoaderインターフェースを実装してください。

ISceneLoaderは以下のメソッドが定義されたインターフェースです。

member description
IEnumerator StartEffect() SceneLoaderのStartメソッドで呼ばれるコルーチンです。
IEnumerator LoadScene(string sceneName) シーンのロード処理を行うコルーチンです。

例えば、以下のように、ISceneLoaderを継承したコンポーネントを作成してStartやAwakeメソッドでLoaderに設定して独自の処理を行います。

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using SilCilSystem.Singletons;

public class CustomSceneLoader : MonoBehaviour, ISceneLoader
{
    private void Start()
    {
        // Loaderを自分自身に設定.
        SceneLoader.Instance.Loader = this;
    }

    public IEnumerator StartEffect()
    {
        // SceneLoaderのStartで呼ばれるコルーチンです.
        yield break; // 何もしない.
    }

    public IEnumerator LoadScene(string sceneName)
    {
        // 例えば、1秒待ってからシーンを読み込み.
        yield return new WaitForSeconds(1f);
        SceneManager.LoadScene(sceneName);
    }
}

トップへ