10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Scene遷移の引数を文字列ではなくenum型にしてタイプセーフにしてみた

Last updated at Posted at 2016-07-27

どうも、初投稿です。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候補が出てくれるので簡単にシーン遷移ができます

なにかありましたらコメントお願いします

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?