スポンサーリンク

【Unity】シーンを切り替えるボタンを表示するエディタ拡張

スポンサーリンク
Unity

シーンを開くEditor拡張

Unityでは通常、シーンを切り替えるときに、Asstesフォルダにあるシーンファイルを選択して開きます。シーンを開くたびにフォルダのシーンファイルをクリックして、開くのは正直手間がかかるので、簡単にシーンを開くことが出来るボタンを、今回は作っていきます。

実装

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

//シーン切り替えEditor拡張
public class SceneChangeWindow : EditorWindow
{
    private string[] _sceneNameArray;                   //ファイル名保存用
    private string _folderPath = "Assets/Scenes/";      //シーンファイルの検索用パス

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

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

    //パスを入力するフィールドを表示
    private void DisplayPathField()
    {
        _folderPath = EditorGUILayout.TextField("ファイルパス", _folderPath);
    }
    // シーンファイルのファイル名を取得
    private void LoadSceneFile()
    {
        //フォルダ内のシーンファイルのパスを取得する
        _sceneNameArray = System.IO.Directory.GetFiles(_folderPath, "*", System.IO.SearchOption.TopDirectoryOnly).
            Where(s => !s.EndsWith(".meta", System.StringComparison.OrdinalIgnoreCase)).ToArray();

        //シーンファイルパスからファイル名のみを取得する
        for (int i = 0; i < _sceneNameArray.Length; i++)
        {
            _sceneNameArray[i] = System.IO.Path.GetFileName(_sceneNameArray[i]);
        }
    }

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

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

上記のコードは、シーンを切り替えるEditor拡張の全体のコードとなります。

コードの流れとしては、AssetsフォルダにあるScenesフォルダの中にあるSceneファイルのパスを取得して、取得したファイルパスのファイル名の部分を取り出して、配列に格納しています。

配列に格納されたファイル名を使用して、シーンを開くことが出来るボタンをウィンドウに表示しています。

WindowOpen関数

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

この関数は、シーンを切り替えるための、Editor拡張で実装した、オリジナルのWindowを開くための関数です。

[MenuItem()]は、Unity画面の上にあるメニューバーに、自作の関数を実行するメニューを表示することが出来ます。

OnGUI関数

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

この関数は、ウィンドウの見た目を描画するための関数です。

DisplayPathField関数

この関数では、ファイルのパスを入力できるように、string型の入力欄を表示しています。

LoadSceneFile関数

// シーンファイルのファイル名を取得
    private void LoadSceneFile()
    {
        //フォルダ内のシーンファイルのパスを取得する(.metaファイルを除く)
        _sceneNameArray = System.IO.Directory.GetFiles(_folderPath, "*", System.IO.SearchOption.TopDirectoryOnly).
            Where(s => !s.EndsWith(".meta", System.StringComparison.OrdinalIgnoreCase)).ToArray();

        //シーンファイルパスからファイル名のみを取得する
        for (int i = 0; i < _sceneNameArray.Length; i++)
        {
            _sceneNameArray[i] = System.IO.Path.GetFileName(_sceneNameArray[i]);
        }
    }

この関数は、指定したパスのフォルダから、シーンファイルの名前の一覧を取得する関数です。

GetFiles関数を使って、指定したフォルダの中からファイルのパス一覧を取得しています。
GetFiles関数リファレンス

s.EndsWith関数を使って、.metaファイルを除くように処理をしています。

s.EndsWith関数リファレンス

DisplaySceneButtons関数

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

この関数は、オリジナルのウィンドウにボタンを表示する関数です。ロードしたファイルの数だけボタンを表示するように、for文でボタンを表示しています。

OpenScene関数

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

この関数は、開きたいシーンのファイル名を渡すことで、シーンを切り替えることが出来ます。元のシーンに変更があった場合、保存せずにシーンが移動しては困るので、シーンを切り替える前に、保存をするかのダイアログを出すようにしています。

タイトルとURLをコピーしました