【Unity】BuildSettingsにセットしたシーンをenumとして自動生成して扱えるようにする

シーンマネージャを使ってシーンを呼び出すとき、
引数にSceneの文字列またはIndex番号を渡します。
docs.unity3d.com

こんな感じのソースコードを書いていた時期がありました。

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneChangeButton : MonoBehaviour
{
    // TODO: インスペクターで入力!
    [SerializeField]
    private string m_loadSceneName = "";
   
    //// TODO: インスペクターで入力!
    //[SerializeField]
    //private int m_loadSceneIndex = -1;

    /// <summary>
    /// ボタン押下時
    /// </summary>
    public void OnButtonPush()
    {
        SceneManager.LoadSceneAsync(loadSceneName);
        //SceneManager.LoadSceneAsync(m_loadSceneIndex);
    }
}

この手法の欠点として、値を間違えてはならないという問題があります。
手打ちはヒューマンエラーを起こす最大の要素。

そこで、ビルド設定にシーンを入れたときに自動的にEnumとして生成させることで
インスペクター・ソースコードともに扱いやすいようにします。

ソースコード

ソースコードこちら。

ゆる解説

EditorBuildSettings.sceneListChanged
ビルド設定のシーンが追加・削除されたときに呼ばれるActionです。 docs.unity3d.com

EditorBuildSettings.scenesでシーンのリストを取得できます。
StreamWriterを使ってファイルに直接書き込んでいく形です。
learn.microsoft.com

使い方

使い方は簡単。 ビルド設定にシーンを放り込むだけで、自動的に生成します。

こんな感じの.csファイルが生成されます。

// SceneTypeGenerator.csで生成

namespace NasanUtility.SceneManager
{
    /// <summary> シーンタイプ </summary>
    [System.Serializable]
    public enum ESceneType
    {
        None = -1,
        New_Scene,
        SampleScene,
        Max,
    }
}

ソースコードでは使用したい行でintにキャストして使用します。

using UnityEngine;
using UnityEngine.SceneManagement;
using NasanUtility.SceneManager;

public class SceneChangeButton : MonoBehaviour
{
    [SerializeField]
    private ESceneType m_type = ESceneType.None ;

    /// <summary>
    /// ボタン押下時
    /// </summary>
    public void OnButtonPush()
    {
        SceneManager.LoadSceneAsync((int)m_type );
        //SceneManager.LoadSceneAsync(loadSceneIndex);
    }
}

参考にしたサイト

ビルド設定

SceneManagement.SceneManager-LoadSceneAsync - Unity スクリプトリファレンスEditorBuildSettings-sceneListChanged - Unity スクリプトリファレンスEditorBuildSettings-scenes - Unity スクリプトリファレンス

生成

System.IO 名前空間 | Microsoft Learn