【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 スクリプトリファレンス