Unity AddComponentMenuでメニューからコンポーネントを追加

前回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 内から自作コンポーネントなどは選ぶことができます。
メニューアイテムが無効の状態で表示される場合は、追加先のゲームオブジェクトを選択した状態再度メニューを開いてください。

Unity AddComponentMenu Attribute を付加していない場合 Component→Scripts 内にメニューアイテムはあります。

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

自作コンポーネントは Inspector ウィンドウの Add Component ボタンを押して表示されるリストの Scripts や検索結果から選べます。

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

Unity AddComponentMenu Attribute を付加すると Component の下位の任意の場所にメニューアイテムを配置できます。

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 より大きい場合かもしれません。

Unity AddComponentMenu Attribute の order の値による表示順の違い

Undo (AddComponent の取り消し) は何もしなくてもできる

前回 MenuItem の呼び出し先の関数では生成したゲームオブジェクトを消す Undo 処理を実装しました。
Undo の登録関数には、AddComponent の取り消しの静的関数もあります。

AddComponent ゲームオブジェクトにコンポーネントをアタッチし、その操作の Undo を登録します。
https://docs.unity3d.com/ja/2019.4/ScriptReference/Undo.html

しかし、 AddComponentMenu Attribute を使っている場合は、コンポーネントを追加する処理を書かなくても良いのと同様に、 Undo の処理をこちらで書く必要はありません

Unity AddComponentMenu により追加したコンポーネントは処理を書かなくても Undo で破棄されます。

注意点:Component → Scripts 内に表示されなくなる

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

Unity AddComponentMenu Attribute で別のパスにメニューアイテムを配置すると Scripts 内には表示されなくなります。

AddComponentMenu Attribute をコードから外すと、再び Scripts 内に表示されます。

まとめ

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

参照サイト Thank You!

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました