Weed.nagoya - 挑戦&物欲プログラマー

HoloLensの出張授業をする会社で、教材を開発しています

Unityのシーン管理を全部enumで行うことで補完を効かせタイプミスを無くすヘルパークラス

f:id:weed_7777:20180222084626p:plain

Unityのスクリプトでは、シーン名をそのまま使うと、シーン数が多くなってくるとタイプミスなどが怖いところです。ここはenumでシーンのリストを定義して、補完できるようにしましょう。簡単なコードで実現できます。DictionaryとLinqを使っています。

ヘルパークラス

static public class MyHelper
{
    // シーンのリストをenumで作る
    public enum MyScene { Operation, Point, Scene2D, Scene3D }
    public static MyScene scene;

    // シーン名とenumのシーンとを対応させる
    static Dictionary<string, MyScene> sceneDic = new Dictionary<string, MyScene>() {
        {"Operation", MyScene.Operation },
        {"Point",     MyScene.Point },
        {"Scene2D",   MyScene.Scene2D },
        {"Scene3D",   MyScene.Scene3D }
    };

    // 現在のシーンを取得する
    public static MyScene MyGetScene()
    {
        string sceneName = SceneManager.GetActiveScene().name;
        scene = sceneDic[sceneName];
        return scene;
    }

    // enumのシーンで指定したシーンをロードする
    public static void MyLoadScene (MyScene scene)
    {
        SceneManager.LoadScene(sceneDic.FirstOrDefault(x => x.Value == scene).Key);
    }
}

使用例

    // 現在のシーンを再度ロードする
    public void ReloadCurrentSchene()
    {
        MyHelper.MyScene scene = MyHelper.MyGetScene();
        MyHelper.MyLoadScene(scene);
    }

    // 現在のシーンの次のシーンに遷移する
    public void LoadNextSchene()
    {
        MyHelper.MyScene scene = MyHelper.MyGetScene();

        if (scene == MyHelper.MyScene.Operation)
        {
            MyHelper.MyLoadScene(MyHelper.MyScene.Point);
        }
        else if (scene == MyHelper.MyScene.Point)
        {
            MyHelper.MyLoadScene(MyHelper.MyScene.Scene2D);
        }
        else if (scene == MyHelper.MyScene.Scene2D)
        {
            MyHelper.MyLoadScene(MyHelper.MyScene.Scene3D);
        }
        else if (scene == MyHelper.MyScene.Scene3D)
        {
            MyHelper.MyLoadScene(MyHelper.MyScene.Operation);
        }
    }

Unityってusing staticできないんですかねえ…