ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - コンポーネントの動作に関する Attribute

初めに

 Unity では、Attribute(属性)と呼ばれる対象の変数やクラスに情報を付与する機能があります。本記事では、コンポーネントの動作に関わる Attribute である RequireComponent, DisallowMultipleComponent, ContextMenu, ContextMenuAttribute を紹介します。


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

最後に

  • クラスや関数、プロパティ宣言時に、その上に Attribute を書くことで Attribute を付与することができる
  • RequireComponent はコンポーネントの付け忘れ対策
  • DisallowMultipleComponent はコンポーネントの重複を防ぐ
  • ContextMenu, ContextMenuAttribute は関数をランタイム以外で実行したい場合に用いる