コンテキストメニューとは?

インスペクターの各コンポーネントのヘッダー部分右端にある三点ボタンをクリックした時に表示されるメニューです。

こちらは、コンポーネントごとにメニューが表示されますが、スクリプトを書いて自由に追加することが出来ます。

コンポーネント用にメニューを追加する。

以下の様なスクリプトを用意し、GameObjectに追加してみます。

using UnityEngine;

public class ContextMenuTest : MonoBehaviour
{
    [ContextMenu("NewContextMenu")]
    private void NewFunction()
    {
    }
}

するとコンテキストメニューにNewContextMenuが追加されました。

メニュー名を/(スラッシュ)で区切ると階層化することも出来ます。

MenuItem属性を使うと、UnityEditorのメニューに項目を追加することが出来ますが、

パスの先頭をCONTEXTとすることで、コンポーネントのコンテキストメニューに項目を追加することが出来ます。

CONTEXTを使用する場合は、

CONTEXT/コンポーネントの型/メニュー

のように指定します。

例えば以下の様な場合、コンポーネントにImageを指定してるので全てのImageコンポーネントにメニューが追加されます。

using UnityEditor;

public static class MenuTest
{
    [MenuItem("CONTEXT/Image/ForImage")]
    private static void ForImageMenu()
    {
    }
}

コンポーネントの型として、親クラスも指定することが出来るので、ComponentObjectを指定した場合、

全てのコンポーネントにメニューが追加されることになります。

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で設定する
  • 子オブジェクトをまとめてリストに追加する
  • 複数のフィールドをまとめて特定の値に変更する

といったインスペクタ上の操作も簡単に行えるようになります。

🔗関連ページ