【Unity】AddComponentMenuでスクリプトを整理して表示

自分で作成したスクリプトは、デフォルトだとコンポーネントメニューからスクリプトとしてアタッチできます。
これだけでも特に不自由することはないのですが、AddComponentMenuのAttributeを使うことで、コンポーネントメニューからスクリプトをアタッチする際、整理して表示することができます。
デフォルトだと全部『Scripts』の下に入っており、スクリプト数が多くなるようなプロジェクトだと探すのが大変なんです。
「検索欄でスクリプト名を検索すればいいんじゃね?」
とは言ってはいけないのだポッター。
環境
macOS 10.13 High Sierra
Unity2018.1.0f2
まずはスクリプトの準備
まずは簡単にスクリプトを作ります。
複雑なことさせるつもりもなくて、Constant Forceコンポーネントのように、一定の力を加えるスクリプトにしてみましょ。
FixedUpdate()の中でAddForceを1回だけ呼ぶスクリプトにしました。
この中で注目して欲しいのが、クラス名の上の行。
[]で囲った部分に、AddComponentMenuと書いてあります。
これをつけることで、コンポーネントメニュー内で任意のパスにスクリプトを追加することができます。
デフォルトだと『Scripts』の下に全部のスクリプトが表示されますが、この属性によってコンポーネントメニュー内で整理することができるんです。
試しにスクリプトをアタッチしようとすると、以下の画像のように[ExplorersLab] -> [ObjectMover]のパスで表示されます。あ、ExplorersLabってのは私のアセット開発者名ね(唐突な宣伝)

Unityのスクリプトリファレンスでは「再起動してね」と書かれていますが、Unity2018でやってみたらUnityを再起動しなくても反映されています。まぁした方が安全かもだけど。
通常、『Scripts』内に表示されるスクリプトが任意のパスで表示されることとなり、『Scripts』内には出てこなくなりました。
デフォルトではコンポーネントの並び順はアルファベットの順番になっているので、以下の例だとNとSの間にObjectMoverが来るはず。だけどAddComponentMenuでパスを指定したので、こちらには表示されません。

コンポーネントメニューでの表示順指定
上でも触れた通り、デフォルトではコンポーネントメニューでの表示順はアルファベットの順番です。
試しに、『ObjectMover』の他に、『AppleEater』『BananaEater』『CherryEater』を追加してみます。
Start()でメッセージを出力するだけのクラスです。
こちらも同じく。
おや? 嘘つきクラスがいるようですね。
本当のクラス名は『CherryEater』なのに、コンポーネントメニューでは『PeachEater』だと主張しているようです。
これらのスクリプトを追加してコンポーネントメニューを確認するとこんな感じ。
AddComponentMenuの引数で指定した名前がアルファベット順に並んでいます。

ファイル名が『CherryEater』のスクリプトは、AddComponentMenuでは『PeachEater』として表示されています。選択してみると本来のクラス名である『CherryEater』がアタッチされます。なんという嘘つき。

次は順番を指定しましょ。
順番を指定する場合は、パスの文字列の後ろにint型で順番を指定します。以下の例では『AppleEater』の表示順として[1]を指定しています。
同様に、以下のように順番を指定しました。
スクリプト名 | 表示名 | 順番の指定 |
AppleEater | AppleEater | 1 |
BananaEater | BananaEater | – |
CherryEater | PeachEater | 0 |
ObjectMover | ObjectMover | 2 |
『BananaEater』は順番を指定していません。というのは、順番指定のあるものとないものを混ぜたらどうなるか確認したかったんです。
この状態でコンポーネントメニューを開くと以下のようになりました。

まさかの変化なし。Unityを再起動しても変わらなかったので、ゲームオブジェクトのコンポーネントメニューだと反映されないのね。
じゃあどこの順番を指定したの?
と思って画面上のメニューバーを見れば、[Component]があるじゃないですか。普段こっちからコンポーネントを追加することがないから忘れてました。
指定したパスを追っていくと以下のようになってました。

順番指定をしていない『BananaEater』が一番上に来ていました。その後に指定した順序でスクリプトが並んでいます。
順番が反映されるのはメニューバーの方なのね。
まとめ
今回のポイントをまとめると、
- AddComponentMenuでスクリプトのパスを指定できる
- ゲームオブジェクトの[Add Component]ボタンではアルファベット順に表示される
- 順番指定できるのは、画面上のメニューバーから開くコンポーネントメニューのみ
かな。
いつも使っている、ゲームオブジェクト側のコンポーネントメニューで順番指定したかったなーと思わんでもないので、Unityさんお願いします!
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】AddForceで力を加える時のモードを変えて動きを観察 2018.06.04
-
次の記事
【Unity】手っ取り早くコンポーネントをアタッチするなら検索で 2018.06.05
コメントを書く