目的
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にするかは好み