前回は MenuItem Attribute を使ってメニューを Unity エディタに追加して、シーンにゲームオブジェクトを追加し、それを Undo で取り消す手順を紹介しました。

今回は、自作コンポーネントをゲームオブジェクトに付加するメニューを追加する AddComponentMenu Attribute について紹介します。
機能が特化しているので、処理を書かなくても、Undo の設定まで自動で行ってくれる便利な属性です。
※ Unity は 2022.3.14.f1、Visual Studio は Community 2022 Version 17.2.5 です。
AddComponentMenu Attribute とは?
AddComponentMenu Attribute はコンポーネントの class 定義の前に付加するだけで、メニューアイテムを追加し、そのメニューアイテムを選択するとゲームオブジェクトにそのコンポーネントを追加できるようになります。
using UnityEngine;
[AddComponentMenu("My/StudyAddComopnentMenuAttribute")]
public class StudyAddComponentMenuAttribute : MonoBehaviour { }
メニューバーに追加する機能としては MenuItem Attribute の方が汎用性がありますが、コンポーネントを追加するという目的に限定すれば、AddComponentMenu Attribute のほうが手間がかかりません。
これを使わなくてもメニューバー [Component] → Scripts 内から自作コンポーネントなどは選ぶことができます。
※メニューアイテムが無効の状態で表示される場合は、追加先のゲームオブジェクトを選択した状態で再度メニューを開いてください。

Inspector ウィンドウの下側の Add Component ボタンを押して Scripts カテゴリの一覧から選んだり、検索して選択することでも同様のことはできます。

しかし、スクリプトの個数が増えると Scripts 内の一覧ではわかりにくいです。
また、検索するにはそのスクリプトの名前の一部でも覚えておく必要があります。
AddComponentMenu Attribute では階層を指定できるので、分類ができ、メニューを使いやすくできます。
※公式サイトにはエディタの再起動が必要とありましたが現行バージョンでは再起動しなくてもすぐに反映されました。

AddComponentMenu Attribute
AddComponentMenu Attribute のコンストラクタは 2 つあるので順に紹介します。
public AddComponentMenu (string menuName);
第 1 引数 string menuName はメニューに追加するメニューアイテムの名前(パス)です。
前回紹介した ContextMenu Attribute の itemName と同じように「/」で区切って階層を表現できます。
using UnityEngine;
[AddComponentMenu("My/StudyAddComopnentMenuAttribute")]
public class StudyAddComponentMenuAttribute : MonoBehaviour { }
上のコードでは、先ほどメニューバー Component の下に配置したように、[Component]→[My]→[StudyAddComopnentMenuAttribute] とアクセスできます。
public AddComponentMenu (string menuName, int order);
第 2 引数 int order はメニューバーの Component メニュー内の表示の順番に影響します。
値が大きいほどメニューの下の方に表示されます。
using UnityEngine;
[AddComponentMenu("My/StudyAddComopnentMenuAttribute", 11)]
public class StudyAddComponentMenuAttribute : MonoBehaviour { }
order の値をいろいろと試すと 0 がデフォルトのようで、大きくすると優先度が下がり、リストの下側に移動しました。
また、線で仕切られるのは 11 を超えてからだったので差が 10 より大きい場合かもしれません。

Undo (AddComponent の取り消し) は何もしなくてもできる
前回 MenuItem の呼び出し先の関数では生成したゲームオブジェクトを消す Undo 処理を実装しました。
Undo の登録関数には、AddComponent の取り消しの静的関数もあります。
AddComponent | ゲームオブジェクトにコンポーネントをアタッチし、その操作の Undo を登録します。 |
しかし、 AddComponentMenu Attribute を使っている場合は、コンポーネントを追加する処理を書かなくても良いのと同様に、 Undo の処理をこちらで書く必要はありません。

注意点:Component → Scripts 内に表示されなくなる
AddComponentMenu Attribute によって、任意の場所にメニューアイテムを表示すると、 メニューバー[Component]→[Scripts] の中のメニューアイテムには表示されなくなります。

AddComponentMenu Attribute をコードから外すと、再び Scripts 内に表示されます。
まとめ
今回は Unity エディタにメニューを追加する AddComponentMenu Attribute を紹介しました。
class 定義の前に付加するだけ、関数も書かずにその class のコンポーネントをゲームオブジェクトに追加でき、 Undo にも対応し、メニュー内でカテゴライズする便利さを説明しました。
コメント