属性とは?
Unityではなく、C#の機能として属性というものがあります。
以前にはUnityのインスペクタを拡張する属性について説明しました。
今回はコンポーネントに付与する属性について説明します。
コンポーネントクラスに設定する属性
RequireComponent
RequireComponentは、コンポーネントが必要とするコンポーネントを指定することが出来ます。
以下の様なコンポーネントを作成し、シーン上に追加すると、
自動的にImageコンポーネントが追加されます。
またImageコンポーネントだけ削除できなくなります。
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Image))]
public class ImageTest : MonoBehaviour
{
[SerializeField] private Image _image;
}

UI系のコンポーネントを追加するとCanvasRendererコンポーネントが追加されますが、
こういうのもRequireComponent属性が使われています。
ExecuteAlways
ExecuteAlways属性は、「常に実行する」といった意味合いになりますが、
この属性をつけておくと編集中でも実行されるようになります。
以下の場合、Consoleにログが表示されます。
using UnityEngine;
[ExecuteAlways]
public class ImageTest : MonoBehaviour
{
private void Update()
{
Debug.Log("Update");
}
}
以前は、ExecuteInEditModeという属性も使われていましたが、
廃止予定なので今後はExecuteAlwaysを使いましょう。
ScriptableObjectに設定する属性
CreateAssetMenu
ScriptableObjectを継承したクラスにCreateAssetMenu属性をつけると、
UnityEditorのメニューのAssets→Create以下にメニューが追加され、
そこからアセットを生成できるようになります。
引数を指定すれば、メニュー上のパスを変更することも出来ます。
using UnityEngine;
namespace Inspector
{
[CreateAssetMenu(menuName = "TestData")]
public class TestData : ScriptableObject
{
}
}

通常のclassに設定する属性
Serializable
SerializeFieldと間違えやすいですが、この属性をつけるとシリアライズ可能になります。
以下のコードの場合、TestDataクラスはシリアライズされないためインスペクタ上に表示されません。
using UnityEngine;
public class TestData
{
public string _name;
public int _value;
}
public class SerializeTest : MonoBehaviour
{
[SerializeField] private TestData _data;
}

TestDataにSerializable属性をつけると、インスペクタ上にも表示されるようになります。
using System;
using UnityEngine;
[Serializable]
public class TestData
{
public string _name;
public int _value;
}
public class SerializeTest : MonoBehaviour
{
[SerializeField] private TestData _data;
}

Editor専用の属性
InitializeOnLoad
InitializeOnLoadをクラスに付与するとそのクラスのstaticコンストラクタが呼ばれるようになります。
呼ばれるのは、
UnityEditorの起動時- スクリプト更新時
- エディター上での実行時
です。
UnityEditor上で必ず初期化したい処理がある場合に使用します。
Editor用なのでビルド後のアプリでは使用できません。
using UnityEditor;
using UnityEngine;
[InitializeOnLoad]
public class InitializeOnLoadTest
{
static InitializeOnLoadTest()
{
Debug.Log("InitializeOnLoadTest");
}
}
CustomEditor
CustomEditorは独自のエディターを作成するために使用されます。
Unityのインスペクタ上でのコンポーネントの表示をカスタマイズできます。
Editorというフォルダを作りその中に以下の様なファイルを作成すると、
CustomEditor属性で指定したコンポーネントのエディタ拡張を作ることが出来ます。
以下の例では、InspectorTestというコンポーネントにボタンを追加しています。
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(InspectorTest))]
public class InspectorTestEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (GUILayout.Button("ボタン"))
{
}
}
}

CustomEditorについてはまたの機会に説明します。
まとめ
クラスに付与する属性について説明しました。
属性を適切に使用することで、Unityの開発がよりスムーズで効率的になります。
これらの属性が提供する機能を理解し、最大限に活用してください。