ルルのゲーム開発備忘録

主にUnityやC#に関する情報を気まぐれに投稿していきま~す

【Unity】シーンの一覧を表示して開くEditor拡張

はじめに

ゲームを実行するときに、最初のシーンをいちいちProjectウィンドウから検索して開くのが面倒くさかったので、シーン一覧を表示してその中から選ぶとシーンを開いてくれるエディタ拡張をピクセルブログさんのこちらのサイトをマネさせてもらって作りました。

エディタ拡張のプログラム

こちらをEditorフォルダ下に置くと、エディタができます。

using UnityEngine;
using System.Linq;
using UnityEditor;
using UnityEditor.SceneManagement;

public class SceneChangeWindow : EditorWindow
{
    // ファイル名保存用
    private string[] m_sceneNameArray;

    // シーンファイルの検索用パス
    private string m_folderPath = "Assets/Scenes/";

    // シーン変更ウィンドウを開く
    [MenuItem("Editor/SceneChangeWindow")]
    static void WindowOpen()
    {
        EditorWindow.GetWindow<SceneChangeWindow>();
    }

    // ウィンドウの見た目を描画
    private void OnGUI()
    {
        DisplayPathField();
        LoadSceneFile();
        DisplaySceneButtons();
    }

    // パスを入力するフィールドを表示
    private void DisplayPathField()
    {
        m_folderPath = EditorGUILayout.TextField("ファイルパス", m_folderPath);
    }

    // シーンファイルのファイル名を取得
    private void LoadSceneFile()
    {
        // フォルダ内のシーンファイルのパスを取得する
        // System.StringComparison.OrdinalIgnoreCaseはバイナリの並び替え規則を使用し、文字列の大文字と小文字の区別を無視して文字列を比較
        // メタファイルは除く
        m_sceneNameArray = System.IO.Directory.GetFiles(m_folderPath, "*", System.IO.SearchOption.TopDirectoryOnly).
            Where(s => !s.EndsWith(".meta", System.StringComparison.OrdinalIgnoreCase)).ToArray();

        // シーンファイルパスからファイル名のみを取得する
        // System.IO.Path.GetFileNameでパスのディレクトリ部分が取り除かれる
        for (int i = 0; i < m_sceneNameArray.Length; i++) {
            m_sceneNameArray[i] = System.IO.Path.GetFileName(m_sceneNameArray[i]);
        }
    }

    // シーン変更ボタンを表示
    private void DisplaySceneButtons()
    {
        // シーンのファイルの数ボタンを描画
        for(int i = 0; i < m_sceneNameArray.Length; i++) {
            if (GUILayout.Button(m_sceneNameArray[i])) {
                OpenScene(m_sceneNameArray[i]);
            }
        }
    }

    // シーンを開く
    private void OpenScene(string sceneName)
    {
        // シーンに変更があった場合に保存をするのかを訪ねる
        if (EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) {
            EditorSceneManager.OpenScene(m_folderPath + sceneName);
        }
    }
}

エディタの見た目


まとめ

こういう便利ツールはどんどん増やして開発効率を上げていきたいですね!(^^)