属性とは?
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
の開発がよりスムーズで効率的になります。
これらの属性が提供する機能を理解し、最大限に活用してください。