ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - EditorBuildSettingsScene:シーン名を全取得する

初めに

 Unity のエディタ拡張をして、Build in Scenes に加えてあるシーンをすべて取得する方法をまとめます。本記事では、取得したシーン名を Scriptable Object に格納してみます。

EditorBuildSettingsScene

 EditorBuildSettings.scenes と組み合わせてこのクラスを使用することにより、ビルドに加えるシーンのリストをスクリプトをとおして作成することができます。

docs.unity3d.com

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" という名前で保存されます。


(実行結果)