うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】MonoBehaviour クラスのシリアライズされた変数の Inspector をカスタマイズ する Attribute の作り方

例えば RangeAttribute を利用すると Inspector にスライダーUIを表示することができる

f:id:hacchi_man:20200801195119p:plain

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 の描画 処理

これを継承しない場合は下図のようにエラー的な文言が表示される

f:id:hacchi_man:20200801200042p:plain

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 に表示できる

f:id:hacchi_man:20200801200749p:plain

using UnityEngine;

public class SampleMonoBehaviour : MonoBehaviour
{
    [SerializeField, Sample("Test")]
    private int _test;
}