
UnityのScene管理をEnumで行う話
-
2021年6月2日
こんにちは。
ポケコロツインというサービスでclientエンジニアをやっているHです。
さて、今回はUnityでScene管理をやりやすくするための小ネタ紹介です。
特に難しい話はなく色々なところに応用もできると思うのでぜひ最後までお付き合いください。
UnityのScene遷移機能をおさらい
まずScene遷移の基本をおさらいします
Build SettingsにSceneを登録
コードからSceneManagerを使ってLoad
UnityEngine.SceneManagement.SceneManager.LoadScene( “SampleScene” );
簡単ですね
LoadSceneの呼び出しの問題点
SceneManager.LoadSceneは引数に選択肢があります。
Unityのスクリプトリファレンス
- Scene名をstringで指定する
- BuildSettingsで登録されたIndexを使用する
それぞれの呼び出しについて考察してみます
Scene名をstringで指定する
Scene名=ファイル名をstringとして指定する必要があるため呼び出し側に “SampleScene” などの埋め込みが発生する
ファイル名などを変更した場合、埋め込んであるコードが動かなくなる+ただのstringなのでどこから呼ばれているのかを把握しづらい
BuildSettingsで登録されたIndexを使用する
BuildSettingsで設定されたIndexを指定する必要があるため呼び出し側にint値の埋め込みが発生する
Sceneの追加や削除などがあったときにIndexがずれると動かなくなる+ただのint値なのでなんのシーンを呼び出しているのかがわからない
シンプルな機能なのでわかりやすいのですがどちらもそのまま使うと変更に弱そうな気がしますね…
SceneをEnumで管理する
呼び出し側がどのSceneを呼び出しているのかわかりやすい+変更に強くするためにポケコロツインで行っているSceneをEnumで管理する方法を説明します。
1. Sceneに合わせてEnumを定義する
まずEnumを定義します
enum SceneType { Unknown, Sample, Hoge, Fuga, }
2. Enumにstringを紐付ける
SceneManager.LoadSceneを呼び出すときに string or index どちらを使うかですが、indexの場合BuildSettingsを変更すれば変わってしまうので意図せず変わってしまう可能性があるためstringを使うことにします。
Dictionaryを使って紐付けてみる
Enumにstringを紐付ける方法ですが、単純に考えると以下の用にDictionaryなどで定義しておく方法があると思います。
Dictionary<SceneType, string> TypeToName = new() { [SceneType.Unknown] = "", [SceneType.Sample] = "SampleScene", [SceneType.Hoge] = "HogeScene", [SceneType.Futa] = "FugaScene", };
UnityEngine.SceneManagement.SceneManager.LoadScene( TypeToName[SceneType.Sample] );
直接文字列を埋め込むところがDictionaryに登録するところだけなのでファイル名を変えたときに変更するのが1箇所になった+呼び出し側もどのシーンを呼び出しているのかわかりやすくなりましたね。
ただ、呼び出し側でEnumからstringに変換するためにいちいちDictionaryを経由しているのが少しめんどくさい気がします。
Enum自体にstringを紐付ける
LoadSceneの呼び出しをもっと簡潔にするためこちらを参考にEnum自体にstringを登録してみます
enum SceneType { [Japanease("")] Unknown, [Japanease("SampleScene")] Sample, [Japanease("HogeScene")] Hoge, [Japanease("FugaScene")] Fuga, }
UnityEngine.SceneManagement.SceneManager.LoadScene( SceneType.Sample.ToJpnName() );
Enumの定義とシーン名の登録が1箇所でできファイル名の変更した場合に変更しなければならない場所も1箇所することができ、なおかつ呼び出し側もとてもシンプルになりましたね。
まとめ
というわけで、Enum自体にstringを登録しScene呼び出しをわかりやすく、かつ変更に強くするための小ネタ紹介でした。
Enumにstringを登録できるとScene管理以外にも色々なところで活用できそうですね。
ココネでは一緒に働く仲間を募集中です。
ご興味のある方は、以下のリンクから是非ご応募ください。