ゼニガネブログ

ゲーム開発のための小ネタなど。現在はUnityメインでやってます

【Unity】全コンポーネント共通のInspector上の右クリックメニューを作成するエディタ拡張

簡単なやり方のおさらい

f:id:zenigane138:20191109222544p:plain

例えば、GameObject or Prefabを選択した状態でInspector上に表示される自作コンポーネントで右クリックをした時のメニュー(上記画像、以降右クリックメニュー)を作成したい場合は下記のように記述します。

Unityエディタ拡張ではお馴染みのMenuItemアトリビュートに対してCONTEXTから始まる文字列を設定すると右クリックメニューから呼び出す事が出来ます。

 ※MyComponent.cs外で記述する事も出来ます

問題点

しかしこの方法ですと100個の自作コンポーネントに対して同じ処理を実装したい場合は100個のMenuItemを作成する必要があります。
Unityエディタ上では自作や既定のコンポーネントに関係なく右クリックメニューからResetやらCopyComponentが実行出来ているのでどうにかする手段があるはず・・・

 こうやって書く

f:id:zenigane138:20191109223323p:plain

この画像は先程のMyComponent.csとは別にTestMenuItem.csを追加した状態になります。

一言で説明すると継承が反映される事を利用して設定するだけです!

この[MenuItem("CONTEXT/XXXX/Func")]のXXXXにあたる部分を上手く設定する事で全コンポーネント共通であったり特定コンポーネントを継承したクラス限定であったりと挙動を変える事が出来るのでうまく利用していきましょう!

発見経緯とか

試しにMonoBehaviourを継承したMonoBehaviourBaseとMonoBehaviourBaseを継承したクラスでテストをした所、継承元で設定された右クリックメニューが継承先でも有効でした。
それならMonoBehaviour、Component、Objectでも有効になるのではないかと思い、予想通りの結果となりました。
気がついてしまえばどうと言うことはないのですが、自分が検索したときには見つからなかったので公開しておきます。
エディタ拡張まわりの検索ワード難しい・・・。
この記事もエディタを拡張してはいるけどEditorWindowを継承したものではないのでそっちを期待して来た人はごめんね!