コンテキストメニューとは?
インスペクターの各コンポーネントのヘッダー部分右端にある三点ボタンをクリックした時に表示されるメニューです。
こちらは、コンポーネントごとにメニューが表示されますが、スクリプトを書いて自由に追加することが出来ます。
コンポーネント用にメニューを追加する。
以下の様なスクリプトを用意し、GameObject
に追加してみます。
using UnityEngine;
public class ContextMenuTest : MonoBehaviour
{
[ContextMenu("NewContextMenu")]
private void NewFunction()
{
}
}
するとコンテキストメニューにNewContextMenu
が追加されました。
メニュー名を/(スラッシュ)で区切ると階層化することも出来ます。
MenuItemでコンテキストメニューを追加する
MenuItem
属性を使うと、UnityEditor
のメニューに項目を追加することが出来ますが、
パスの先頭をCONTEXT
とすることで、コンポーネントのコンテキストメニューに項目を追加することが出来ます。
CONTEXT
を使用する場合は、
CONTEXT/コンポーネントの型/メニュー
のように指定します。
例えば以下の様な場合、コンポーネントにImage
を指定してるので全てのImage
コンポーネントにメニューが追加されます。
using UnityEditor;
public static class MenuTest
{
[MenuItem("CONTEXT/Image/ForImage")]
private static void ForImageMenu()
{
}
}
コンポーネントの型として、親クラスも指定することが出来るので、Component
やObject
を指定した場合、
全てのコンポーネントにメニューが追加されることになります。
using UnityEditor;
public static class MenuTest
{
[MenuItem("CONTEXT/Object/ForObject")]
private static void ForObjectMenu()
{
}
}
フィールドにメニューを追加する
using UnityEngine;
public class ContextMenuTest : MonoBehaviour
{
[SerializeField, ContextMenuItem("Clear", "ClearText")] private string _text;
private void ClearText()
{
_text = string.Empty;
}
}
このようなスクリプトを書いた場合、インスペクタ上のTextというフィールド上で右クリックすると表示されるメニューに
Clear
という項目を追加し、実行するとClearText
というメソッドが呼ばれるようになります。
メニューを追加してみて
コンポーネントにメニューを追加する手順について解析しました。
エディタ拡張の入門のような内容だったと思います。
こういったメニューを活用すれば、
SerializeField
にいれるコンポーネントをコードからGetComponent
で設定する- 子オブジェクトをまとめてリストに追加する
- 複数のフィールドをまとめて特定の値に変更する
といったインスペクタ上の操作も簡単に行えるようになります。