例えば RangeAttribute
を利用すると Inspector にスライダーUIを表示することができる
public class SampleAttribute : MonoBehaviour { [SerializeField, Range(0, 10)] private int _range; }
テンプレート
これを定義すると 通常と何も変わらないが [Sample]
という Attribute を利用することができる
using UnityEngine; public class SampleAttribute : PropertyAttribute { }
using UnityEditor; [CustomPropertyDrawer(typeof(SampleAttribute))] public class SampleAttributeDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.PropertyField(position, property, label); } }
PropertyDrawer の拡張時に編集する関数
OnGUI
Inspector の描画 処理
これを継承しない場合は下図のようにエラー的な文言が表示される
GetPropertyHeight
Inspector 上の高さ
baseメソッドでは 18 という定数が記述されているが、これは EditorGUIUtility.singleLineHeight
の値と同一
public virtual float GetPropertyHeight(SerializedProperty property, GUIContent label) { return 18f; }
Attribute にパラメータを追加したい場合
コンストラクタを利用すれば Attribute にパラメータを追加することができる
using UnityEngine; public class SampleAttribute : PropertyAttribute { public string Name; pubic SampleAttribute(string name) { Name = name; } }
Drawer 側で Attribute を取得できるので、キャストすることでパラメータにアクセスできる
using UnityEditor; [CustomPropertyDrawer(typeof(SampleAttribute))] public class SampleAttributeDrawer : PropertyDrawer { private SampleAttribute attr => attribute as SampleAttribute; public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.LabelField(position, attr.Name); } }
これで Attribute の引数を Inspector に表示できる
using UnityEngine; public class SampleMonoBehaviour : MonoBehaviour { [SerializeField, Sample("Test")] private int _test; }