Unity - コンポーネントの動作に関する Attribute
初めに
Unity では、Attribute(属性)と呼ばれる対象の変数やクラスに情報を付与する機能があります。本記事では、コンポーネントの動作に関わる Attribute である RequireComponent, DisallowMultipleComponent, ContextMenu, ContextMenuAttribute を紹介します。
Index
Attribute(属性)
Attribute(属性)とは
Attribute(属性) とは、
対象の変数やクラスに付与する情報
のことです。属性(Attribute)を付与する事で他の変数と区別したり、特別な挙動を設定することが出来ます。
Attribute の使い方
クラスや関数、プロパティ宣言時に、その上に Attribute を書くことで Attribute を付与することができます。
[HideInInspector] //これがAttribute, []で囲んで記述する public float strength;
RequireComponent
RequireComponent を使ったスクリプトをゲームオブジェクトにアタッチすると、必要なコンポーネントが自動的にそのゲームオブジェクトに加えられるようになります。
Rigidbody の付け忘れなどセットアップエラーの予防になります。
using UnityEngine; [RequireComponent(typeof(Rigidbody))] //これを追加 public class AttributeTest : MonoBehaviour { void Start() { } }
スクリプトをゲームオブジェクトにつけると自動で、コンポーネントも追加されます。また、RequireComponent で付けられたコンポーネントを外そうとすると、Can't Remove Component Because (Script) depend on it (スクリプトがコンポーネントに依存しているので、削除できない)と表示してくれます。
DisallowMultipleComponent
2つ以上同じコンポーネントをアタッチできないようにするための Attribute です。
using UnityEngine; [DisallowMultipleComponent] //これを追加 public class AttributeTest : MonoBehaviour { void Start() { } }
同じコンポーネントを追加しようとすると、上の画像のように表示されます。
ContextMenu
ContextMenu は関数に付けることで、コンテキストメニューにコマンドを追加し、関数を実行できるようにします。
using UnityEngine; public class AttributeTest : MonoBehaviour { //引数は string. コンテキストメニューに表示するテキストになります [ContextMenu("これをクリックするとTestMethodが呼び出されるで")] void TestMethod() { Debug.Log("TestMethodが呼び出された"); } }
コンテキストメニューはスクリプトの右上にある三点をクリックすると開けます。
ContextMenuAttribute
ContextMenuItemAttribute はフィールド(変数)に関数を設定することができます。
using UnityEngine; public class AttributeTest : MonoBehaviour { //第一引数はメニューに表示させるテキスト //第二引数は実行する関数 [ContextMenuItem("変数を 1 → 2 に", "ChangeNum")] //フィールドにつける public int number = 1; void ChangeNum() { Debug.Log($"number:{number}"); number = 2; Debug.Log($"number:{number}"); } }
呼び出す場合は ContextMenuItem をつけたフィールドを右クリックするとメニューが開けるので、そこから実行します。
他の Attribute について
以前、Inspector を整理するための Attribute をまとめた記事を書きました。ぜひご覧下さい。
fineworks-fine.hatenablog.com