WisdomSoft - for your serial experiences.

メニュー表示と階層化

Unity のアセットとしてビルドされるスクリプトはコンポーネントとして Unity のメニュー上に列挙されます。既定ではクラス名がコンポーネントと名前として表示されますが、明示的にメニュー上に表示する名前と階層を設定することも可能です。

メニューに表示されるコンポーネントをグループ化する

Unity の Assets フォルダ内にある C# や JavaScript などのソースファイルは Unity によって自動的にコンパイルされ、コンポーネントとして認識されます。C# の場合は MonoBehaviour を継承している必要があります。JavaScript で書かれたコードは、暗黙的に MonoBehaviour クラスを継承しています。

MonoBehaviour を継承するクラスは、Unity のゲームオブジェクトに追加可能なコンポーネントとして扱われます。認識されているカスタムのコンポーネントは、Unity の「Component」メニューの「Script」項目内に列挙されます。 複数のスクリプトを追加して図1のようにメニュー項目を開いてください。正しくコンパイルされていれば、コンポーネント名が表示されます。

図1 メニュー項目に表示されるスクリプト
図1 メニュー項目に表示されるスクリプト

もしくは、任意のゲームオブジェクトを選択している状態で「Inspector」ウィンドウの下部にある「Add Component」を押しても、ゲームオブジェクトに追加可能なコンポーネントの一覧が表示されます。ここでも、メニュー項目と同じように「Scripts」項目内にコンポーネントとして追加可能なスクリプトが表示されます。これらは、スクリプトを見つけるのに便利でしょう。

図2 「Inspector」に表示されるスクリプト
図2 「Inspector」に表示されるスクリプト

ただし、スクリプトの数が膨大になるとフラットに並べられただけでは目的の機能を探すのが難しくなってきます。また、スクリプト名(クラス名)だけでは機能が予測し難い場合もあり、名前だけの一覧では目的のコンポーネントを発見することが難しいでしょう。

これらのメニューに表示されるスクリプト名は、コンポーネントとなるクラスに対して UnityEngine.AddComponentMenu 属性を指定します。

UnityEngine.AddComponentMenu クラス
public sealed class AddComponentMenu : Attribute

AddComponentMenu 属性は、対象のクラスを図1や図2のような Unity のメニューで表示するときのコンポーネントの名前を宣言します。

AddComponentMenu クラスのコンストラクタ
public AddComponentMenu(string menuName);

属性の menuName パラメータには、パスを含むコンポーネントの名前となる文字列を指定します。単純な名前だけを指定すれば「Components」メニューのトップに表示され、スラッシュ / で区切ることで、コンポーネントを階層化することもできます。同じ名前の階層に属するコンポーネントは、同一のメニュー階層に並べられるため、グループ化できます。

コード1
using UnityEngine;

[AddComponentMenu("Stars/Nanoha")]
public class Nanoha : MonoBehaviour {}
using UnityEngine;

[AddComponentMenu("Lightning/Fate")]
public class Fate : MonoBehaviour {}
using UnityEngine;

[AddComponentMenu("Stars/Vita")]
public class Vita : MonoBehaviour {}
using UnityEngine;

[AddComponentMenu("Lightning/Signum")]
public class Signum : MonoBehaviour {}
実行結果
コード1 実行結果

コード1は異なる4つのクラスをスクリプトとして作成し、AddComponentMenu 属性でメニューに表示する名前を指定しています。通常は、クラス名と同じ(または、複数単語で構成されるクラス名の場合、読みやすいように単語をスペースで区切った名前)にしますが、一致させる必要はありません。実行結果を見れば、属性に指定した文字列の / 記号で区切ったパスごとにグループ化されていることが確認できます。

さらに、"Riot Force 6/Stars/Nanoha" というように、複数の / 記号で階層を深くすることも可能です。