シーンを開く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ファイルを除くように処理をしています。
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);
}
}
この関数は、開きたいシーンのファイル名を渡すことで、シーンを切り替えることが出来ます。元のシーンに変更があった場合、保存せずにシーンが移動しては困るので、シーンを切り替える前に、保存をするかのダイアログを出すようにしています。