3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Editor拡張 - Windowを作ろう

Posted at

導入

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」が追加されています。
こちらをクリックするとウインドウが開きます。

696b3cf0-887f-9967-adef-b645317b9a3f.png

2. 特定のAssetのInspector上に表示する

特定のデータアセットのInspectorにWindow開くボタンを配置します。
808e6de4-1717-bf4d-c1fd-cd7ffee85d41.png

ソースコード

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は凄く簡単に作れます。
後はそれをどのようにカスタマイズするかだけです。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?