MRが楽しい

MRやVRについて学習したことを書き残す

Unityで自作のメニュー項目を追加する その3(コンポーネントにメニューを追加する)

本日は Unity の小ネタ枠です。
Unityでスクリプトからコンポーネントにメニュー項目を実行する方法です。

Unityで自作のメニュー項目を追加するにはMenuItemを属性として指定します。
MenuItemは静的関数(static)のみが利用可能です。
docs.unity3d.com

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

以下のパスはコンポーネント用の特別なパスとして利用されます。
・CONTEXT/

例えば、BoxColliderコンポーネントにメニューを追加したい場合は以下のパスを指定してMenuItem属性を利用します。

[MenuItem("CONTEXT/BoxCollider/(メニュー名)")]

また引数にMenuCommand型を受け取ることで実行したコンポーネントの参照を受け取ることも可能です。
docs.unity3d.com

[MenuItem("CONTEXT/BoxCollider/ShowLog")]
private static void BoxColliderShowLogTest(MenuCommand command)
{
    BoxCollider instance = (BoxCollider)command.context;
    // 処理
}

サンプルスクリプト

BoxColliderにメニューを追加するサンプルスクリプトを作成しました。
・ComponentMenuItemTest.cs

using UnityEditor;
using UnityEngine;

public class ComponentMenuItemTest : MonoBehaviour
{
    /// <summary>
    /// BoxColliderのメニューに表示されるアイテムを追加する
    /// </summary>
    [MenuItem("CONTEXT/BoxCollider/ShowLog")]
    private static void BoxColliderShowLogTest(MenuCommand command)
    {
        BoxCollider instance = (BoxCollider)command.context;
        Debug.Log($"{instance.name}に設定された{instance.GetType()}のメニューを実行した");
    }
}

以下のようにBoxColliderの[:]アイコンをクリックしてメニューを実行するとログが表示されました。


ビルド時の注意事項

MenuItemはUnityエディター上でのみ動作するため、ビルド時に以下のエラーが発生します。

error CS0246: The type or namespace name 'MenuItemAttribute' could not be found (are you missing a using directive or an assembly reference?)

スクリプトをEditorフォルダに配置することでエディター用のスクリプトとして扱われ、ビルド時には参照しないようにできます。