お米 is ライス

C#やらUnityやらを勉強していて、これはメモっといたほうがええやろ、ということを書くつもりです

Unityで自動実装プロパティにSerializeFieldをつけるだけでインスペクタにまともな名前を表示させる

追記

???
Unity 2019にしたら動かなくなったのでUnity 2020でしか動かないっぽい

出典元

この記事では9割9分9厘下記サイトに書いてある通りのことをやっています。
baba-s.hatenablog.com

[field: SerializeField]をつけただけで名前をまともに表示してほしい

出典元様のソースコードが非常に便利で重宝していたのですが、これに加えてやりたいことが2つ出てきました。

  • Attributeを1つで済ませたい
  • 変数名から自動でインスペクタ上の名前も表示してほしい

以上の要件を満たすためには次のようなスクリプトを書けばよいです。

using UnityEditor;
using UnityEngine;

#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(SerializeField))]
public class FieldNameDrawer : PropertyDrawer
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        if (!property.isArray)  //arrayでダメな理由は知らん
        {
            label.text = property.displayName;
        }

        EditorGUI.PropertyField(position, property, label, true);
    }
}
#endif

SerializeFieldのCustomPropertyDrawerを直接定義しています。
こう書いておけばあとはプロパティの定義のところで以下のように書くだけでインスペクタに自然に表示されます。

public class SampleBehaviour : MonoBehaviour
{
    [field: SerializeField]
    public float SampleProperty { get; private set; }
}

f:id:spi_8823:20200314004737p:plain

SerializeField様の挙動をいじるのはかなり危なそうで気が引けますが、手元ではチラリと試してみた限りでは問題なく動いてそうに見えます。
どこで弊害が出てくるかはわからないので使用は自己責任で。