LoginSignup
4
5

More than 5 years have passed since last update.

UnityのシーンIDを定数値で管理する

Last updated at Posted at 2016-01-16

目的

Unityにおいてシーンを切り替える際に
Application.LoadLevel("Test_1");
と文字列で行うと無駄なアロケートが発生するしTypoした際にコンパイルエラーで気づけない。
そこで静的にシーンIDを宣言するスクリプトを用意する。

Editorスクリプト

SceneListEditor.cs
using System.IO;
using System.Text;
using UnityEditor;
using UnityEngine;


/// <summary>
/// シーン名を定数で管理するクラスを作成する
/// </summary>
public static class SceneListEditor {
    private const string PATH = "Assets/Scripts/SceneList.cs";  // ※ファイルパスは任意
    private static readonly string CLASS_NAME = Path.GetFileNameWithoutExtension(PATH);

    /// <summary>
    /// ファイル出力
    /// </summary>
    [MenuItem("CreateFile/SceneList")]  // ※メニュー項目名は任意
    public static void Create() {
        StringBuilder builder = new StringBuilder();
        builder.AppendLine("/// <summary>");
        builder.AppendLine("/// シーン名を定数で管理するクラス");
        builder.AppendLine("/// </summary>");
        builder.AppendLine("public static class " + CLASS_NAME + " {");
        builder.AppendLine("\tpublic enum ID {");
        foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes) {
            // 無効なシーンはのぞく
            if (!scene.enabled)
                continue;
            string sceneId = Path.GetFileNameWithoutExtension(scene.path);
            builder.Append("\t\t").AppendFormat(@"{0},", sceneId.ToUpper()).AppendLine();
        }
        builder.AppendLine("\n\t\tMAX,");
        builder.AppendLine("\t}");
        builder.AppendLine("}");

        // ディレクトリ作成
        string directoryPath = Path.GetDirectoryName(PATH);
        if (!Directory.Exists(directoryPath))
            Directory.CreateDirectory(directoryPath);

        // ファイル作成
        File.WriteAllText(PATH, builder.ToString(), Encoding.UTF8);
        AssetDatabase.Refresh(ImportAssetOptions.ImportRecursive);

        // 完了通知
        // ※出力先を明示してあげると親切
        EditorUtility.DisplayDialog(Path.GetFileName(PATH), "Created [" + Path.GetFullPath(PATH) + "]", "OK");
    }
}

出力されるスクリプト

SceneList.cs
/// <summary>
/// シーン名を定数で管理するクラス
/// </summary>
public static class SceneList {
    public enum ID {
        TEST_0,
        TEST_1,
        TEST_2,

        MAX,
    }
}

使用例

Application.LoadLevel((int)SceneList.ID.TEST_1);

注意

1.スペース等の記号を含むシーン名を使用している場合は置換する等の処理が別途必要になる
2.シーン数を変更、シーンを無効にした場合にIDがズレるのでファイルを作り直す必要がある
3.シーンIDは0からの連番になるためenumで定義したがconst intにするかは好み

4
5
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
4
5