どうも、初投稿です。AiginaCoderです。
さっそく本題に入っていきます
SceneManager.LoadScene("遷移先のシーン名文字列");
こんな感じでシーン遷移をしてらっしゃる方が多いと思います
これには以下の様な問題があります
-
存在しないシーン名文字列を指定しまう可能性がある
-
実行時にしかエラーが起きないので間違いが気が付きにくい
-
シーン名を途中で変更したい場合、変更箇所が多くなる可能性がある
これは引数がstring型だから起きている問題です
以下の様に、引数がenum型のシーン遷移関数を自分で作れば問題が解決できます
public enum SceneID {
Title,
Game
}
// enumからシーン名を取得するために必要
private Dictionary<SceneID, string> m_sceneNameDictionary = new Dictionary<SceneID, string> {
{SceneID.Game, "Game"},
{SceneID.Title, "Title"}
};
// これを呼んでシーン遷移を行う
public void LoadSceneEX(SceneID sceneID) {
SceneManager.LoadScene(m_sceneNameDictionary[sceneID]);)
}
// 文字列を渡すとそもそも型が違うのでエラー
// SceneIDで定義している値しか受け付けない
SceneManager.LoadScene(SceneID.Title);
これで問題は解決されたわけですが、シーンが追加するたびに自分で正確にそのシーン名をenumに定義してやる必要があります
なんと実はBuildSetteingsに追加したScene名を取得する方法があります
// BuildSettingsに登録した全てのシーン名文字列が格納された配列が取得できる
var sceneNames = UnityEditor.EditorBuildSettings.scenes
.Select (scene => Path.GetFileNameWithoutExtension (scene.path))
.Distinct ()
Add a comment to this line
.ToArray();
これを使い、enumで宣言していきたいですが動的にenumを宣言はできないので「シーン遷移をするためのクラスファイルを出力する」方向で解決します
ファイル出力なら、先ほどのシーン名配列を使用してenumを宣言したクラスファイルが作れます
私はUnityの拡張エディタで作成した独自メニューを選んだら、シーン遷移をおこなうためのラッパークラスを出力するようにしました
「BuildSettingsにシーンを追加した」というイベントが取得できれば完全な自動化が可能なのですが、自分が調べた限り方法がわかりませんでした。知っている方がいれば教えていただきたいです
メニューを選んだら、シーン遷移をおこなうためのラッパークラスを出力するソースファイルはgithubにあげておきました
良ければお使いください
https://github.com/AiginaCoder/UnityTools/blob/master/SampleProject/Assets/Editor/CreateSceneTransitionManagerScriptEditor.cs
使い方はCreateSceneTransitionManagerScriptEditor.csをAssets/Editorに入れてメニューに追加されたAiginaCoder/Create/MakeSceneTransitionManagerScriptを選択してOKを選ぶとScene遷移クラスがScriptsフォルダに出力されます
シーンをBuildSettingsに追加するたびにこの操作が必要です
あとはシーン遷移したいところで
AC.SceneTransition.Instance.LoadScene (AC.SceneTransition.SceneID."シーン名");
という感じです
自動でシーンID候補が出てくれるので簡単にシーン遷移ができます
なにかありましたらコメントお願いします