Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away