複数のシーンをコードでシンプルに同居させる方法

2024年10月22日

Unityでは、シーンウィンドウに複数のシーンをあわせることができます。
シーン間は影響し合いますので、チーム開発などで、それぞれのシーンを作成し、あわせることで1つのプロジェクトとすることもできます。

実行していない状態での方法

設計時に複数のシーンをドラッグすることで実現

キャプチャ

コードで差し替え

スクリプトでの差し替えもできます。
メインとなるシーンを置いておいて、サブのシーンを切り替えることでシーンのコントロールも可能です。
次のキャプチャを参考にプロジェクトを作ってみましょう

キャプチャ

コード

実行時の操作方法は考えてみましょう

using UnityEngine;

public class SceneSelecter : MonoBehaviour
{
    SceneLoader sceneLoader;

    [SerializeField]
    string gameScene;

    void Start()
    {
        sceneLoader = GetComponent<SceneLoader>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.L))
        {
            sceneLoader.Load(gameScene);
        }
        else if (Input.GetKeyDown(KeyCode.U))
        {
            sceneLoader.UnLoad(gameScene);
        }
    }
}

理解のため、単機能に絞ったコードになります。また、エラー処理も最小限にしています。通常に使う分にはこれでもOKです。
複数のシーンを様々な方法で切り替える場合は、変更作業が必要になります。

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneLoader : MonoBehaviour
{
    // ロード済み?
    bool isLoaded = false;

    public void UnLoad(string sc)
    {
        if (!isLoaded) return;

        // 非同期でアンロード。完了したらメソッドを呼び出す(コールバックという)
        SceneManager.UnloadSceneAsync(sc).completed += OnUnLoadComplate;
    }

    // シーンのアンロードが終了した時
    void OnUnLoadComplate(AsyncOperation obj)
    {
        isLoaded = false;
        Debug.Log("アンロードが完了しました");
    }

    public void Load(string sc)
    {
        if (isLoaded) return;
        // 非同期でロード。完了したらメソッドを呼び出す(コールバックという)
        SceneManager.LoadSceneAsync(sc, LoadSceneMode.Additive).completed += OnLoadComplate;
    }

    // シーンのロードが終了した時
    void OnLoadComplate(AsyncOperation obj)
    {
        isLoaded = true;
        Debug.Log("ロードが完了しました");
    }
}

参考

Unity

Posted by hidepon