以前に Unity の ContextMenu Attribute を使って、Inspector ウィンドウの独自コンポーネントの設定画面のコンテキストメニューに追加したメニューアイテムからメンバ関数を呼び出す手順を紹介しました。
スクリプトのメンバ関数の前に記述するだけで、簡単にメニューアイテムを追加し関数を呼び出せました。
今回は、コンポーネントよりもさらに細かく、フィールド(変数)ごとのコンテキストメニューを設定できる ContextMenuItem Attribute を紹介します。
変数ごとのコンテキストメニューなので、その変数に関するメニューをまとめておくと、メニューがわかりやすくなり、作業効率の向上が期待できます。
ContextMenuItem Attribute の実装例
ContextMenuItem Attribute を使ったコードの例です。
using UnityEngine;
public class StudyPropertyAttribute : MonoBehaviour
{
// IntValue フィールドのコンテキストメニューを設定します。
[ContextMenuItem("Set Random Value", "SetRandomValue")]
public int IntValue = 0;
// IntValue フィールドのコンテキストメニュー "Set Random Value" を選択されたときに呼ばれる関数です。
public void SetRandomValue()
{
IntValue = Random.Range(0, 10);
}
}
6 行目の ContextMenuItem は、その次に宣言されている変数 IntValue のコンテキストメニューのメニューアイテムを追加します。
10 行目に書かれている関数は ContextMenuItem で追加したメニューアイテムから呼び出される関数です。
関数名はContextMenuItem の第二引数の文字列と同じにします。
ContextMenuItem コンストラクタの引数
ContextMenuItem のコンストラクタは 1 つです。
- public ContextMenuItemAttribute (string name, string function);
引数は以下の 2 つです。
- 第 1 引数 string name
コンテキストメニューに表示されるメニューアイテムの文字列です。 - 第 2 引数 string function
メニューアイテムが選択された際に呼び出す関数名です。該当するメンバ関数が呼び出されます。
関数の型は公式サイトの例では void 関数名() だったので、コードの例でも戻り値なし、引数なしの関数を定義しました。
また、オプション引数として int order があり、そのコンテキストメニュー内での表示の順番を変更することができます。
order の値を設定したい場合は次のように記述します。
[ContextMenuItem("Set Random Value", "SetRandomValue", order = 1)]
ContextMenuItem を適用したフィールドのコンテキストメニュー
先ほどのスクリプトをゲームオブジェクトにコンポーネントとして追加して、変数名を右クリックすると、そのフィールドのコンテキストメニューに先ほど ContextMenuItem で指定した “Set Random Value” が追加されています。
メニューアイテムが呼び出す SetRandomValue メンバ関数は IntValue の値を 0 ~ 9 の範囲でランダムに変更します。
ContextMenuItem Attribute で追加した IntValue フィールドのコンテキストメニューのメニューアイテムからメンバ関数を呼び出すたびにランダムな値が設定されました。
まとめ
今回は Unity の Inspector ウィンドウのコンポーネント設定画面で、フィールド(変数)単位で作られるコンテキストメニューにメニューアイテムを追加し、メンバ関数を呼び出す ContextMenuItem Attribute について紹介しました。
コンポーネント全体に関する処理は ContextMenu で、変数ごとの処理は ContextMenuItem と分けるとメニューが使いやすくなりそうです。
コメント