Unity - EditorBuildSettingsScene:シーン名を全取得する
初めに
Unity のエディタ拡張をして、Build in Scenes に加えてあるシーンをすべて取得する方法をまとめます。本記事では、取得したシーン名を Scriptable Object に格納してみます。
Index
EditorBuildSettingsScene
EditorBuildSettings.scenes と組み合わせてこのクラスを使用することにより、ビルドに加えるシーンのリストをスクリプトをとおして作成することができます。
EditorBuildSettings.scenes
ビルドに加えたいシーンのリストです。 これは、ビルド設定ウィンドウに表示されるシーンのリスト(Build in Scenes に加えてあるシーン)と同じものです。
シーン名のすべて取得し、Scriptable Object に格納する
スクリプト全文
(エディタ拡張用)※Editorフォルダ内に入れる
using UnityEngine; using UnityEditor; using UnityEditor.SceneManagement; public class SceneListGenerator : ScriptableObject { [MenuItem("Assets/Generate Scene List")] private static void GenerateSceneList() { string[] scenePaths = EditorBuildSettingsScene.GetActiveSceneList(EditorBuildSettings.scenes); string[] SceneNames = new string[scenePaths.Length]; char[] del = { '/', '.' }; int num = 0; foreach (string child in scenePaths) { string[] split = child.Split(del); SceneNames[num] = split[2]; num++; } SceneListObject sceneList = ScriptableObject.CreateInstance<SceneListObject>(); sceneList.scenePaths = SceneNames; string savePath = "Assets/SceneList.asset"; AssetDatabase.CreateAsset(sceneList, savePath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.Log("Scene list generated and saved at: " + savePath); } }
(Scriptable Object の変数定義用)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SceneListObject : ScriptableObject { public string[] scenePaths; }
スクリプトの説明
[MenuItem("Assets/Generate Scene List")] private static void GenerateSceneList() { //省略 }
ManuItem Attribute を使うことで、メインメニューとインスペクターのコンテキストメニューにメニューアイテムを追加できます。上の例では、Assets メニュー内に Generate Scene List というメニューを作成しています。
このメニューをクリックすることで、GenerateSceneList という関数が実行されます。
string[] scenePaths = EditorBuildSettingsScene.GetActiveSceneList(EditorBuildSettings.scenes);
EditorBuildSettingsScene.GetActiveSceneList(EditorBuildSettings.scenes); では、下の画像のようにシーン名だけでなくシーンが保存されているフォルダ名から取得します。
string[] SceneNames = new string[scenePaths.Length]; char[] del = { '/', '.' }; int num = 0; foreach (string child in scenePaths) { string[] split = child.Split(del); SceneNames[num] = split[2]; num++; }
シーン名だけを取得するために、"/" と "." で string を分割しています。
SceneListObject sceneList = ScriptableObject.CreateInstance<SceneListObject>(); sceneList.scenePaths = SceneNames; string savePath = "Assets/SceneList.asset"; //保存先 AssetDatabase.CreateAsset(sceneList, savePath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh();
Scriptable Object である SceneListObject のインスタンスを生成し、シーン名を保存しています。保存先を "savePath" で指定しています。本記事ではアセット直下に "SceneList" という名前で保存されます。
(実行結果)