導入
Editor拡張で自作のWindowを作る方法について取り上げます
作り方
EditorWindowクラスを派生させたクラスを作る
using UnityEngine;
using UnityEditor;
public class MyWindow : EditorWindow {
}
これだけで自作のWindowが作成できました。
単純に「EditorWindow」を継承するという事がポイントです。
本当にただそれだけ。
後は、このWindowを開けば良いだけです。
Windowを開く関数
private static MyWindow _myWindow;
public static void Open() {
if (_myWindow == null) {
_myWindow = CreateInstance<Example>();
}
_myWindow.Show();
}
既にInstanceが存在する場合のチェックをしないと、どんどんWindowが増えていってしまうので、ローカル変数にキャッシュしています。
ただ、これらの処理をUnity側で内部的にやってくれる便利関数があるので、基本的にはそちらを使いましょう。
public static void Open ()
{
// 既に EditorWindow が存在すればそのインスタンスを取得する。なければ生成する。最後に Show 関数を実行する。
GetWindow<MyWindow>();
}
関数を呼ぶ
関数を呼ぶ方法は色々あります。
自分がよく行う方法は以下の2つ
1. Unityのヘッダーメニューに追加する
Windowメニュー内に「My Window」が追加されています。
こちらをクリックするとウインドウが開きます。
2. 特定のAssetのInspector上に表示する
特定のデータアセットのInspectorにWindow開くボタンを配置します。
ソースコード
1. ヘッダーメニューに追加する
####ソースコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class MyWindow : EditorWindow {
[MenuItem("Window/My Window")]
private static void Open() {
EditorWindow.GetWindow(typeof(MyWindow));
}
}
####ポイント
[MenuItem("Window/My Window")]
です。
このAttributeを静的な関数に付与するとUnityのヘッダー内に追加されます。
Unity側のヘッダーメニューから、ボタンを選択すると関数がコールされます。
2. 特定のAssetのInspector上に表示する
####ソースコード
using UnityEngine;
using UnityEditor;
/// <summary>
/// SampleAssetEditor
/// </summary>
[CustomEditor(typeof(SampleAsset), true)]
public class SampleAssetEditor : Editor
{
#region unity_script
/// <summary>
/// インスペクタ拡張
/// </summary>
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (GUILayout.Button("Open Editor") && target is SampleAsset) {
EditorWindow.GetWindow(typeof(MyWindow));
}
}
#endregion
}
####ポイント
[CustomEditor(typeof(SampleAsset), true)]
です。
・Editorクラスを拡張したクラスを作成する
・CustomEditorの中にInspector拡張したいクラスを指定する
・第二引数のtrue, falseは、SampleAssetの継承先にも適当させるかどうかの指定です。
####豆知識
CustomEditorを指定した場合、以下の変数に自動で、指定したクラスのパラメータが格納されています。
・「serializedObject」変数に、そのクラスのSerializedObject
・「target」変数にUnityEngine.Object型で、そのクラスのComponentが格納 (キャストが必要)
これを利用して、OnInspectorGUIではパラメータを変更するのが定石です。
ただし、SerializedObject経由で値の変更を行うとUndoの実装が不要になるので、そちらを利用した変更がオススメです。
また、private変数にもSerializedObject経由ならばアクセスできます。
Editor拡張のためにpublicにする、アクセサを作る事も不要です。
(SerializedFieldが設定されていないと駄目ですが)
最後に
Windowは凄く簡単に作れます。
後はそれをどのようにカスタマイズするかだけです。