やりたいこと
SerializeField で null になってたらダメなフィールドが null だったら起動時に警告されるようにしたい。
実装
Null を許さないフィールドにつける用のアトリビュートを作成
using System;
[AttributeUsage(AttributeTargets.Field)]
public class NonNullable : Attribute
{
}
MonoBehaviour
を拡張して、 NonNullable
がついているフィールドが null ならエラーログを出す NullCheck
メソッドを生やす。
using System;
using System.Reflection;
using UnityEngine;
namespace MyExtension
{
public static class ExtenstionNullCheck
{
[RuntimeInitializeOnLoadMethod()]
public static void NullCheck(this MonoBehaviour obj)
{
var fields = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var field in fields)
{
// クラスの名前
var className = obj.GetType().ToString();
// 値
var val = field.GetValue(obj);
// NonNullable属性があるかどうかを確認
var isNonNullable = Attribute.GetCustomAttribute(field, typeof(NonNullable)) != null;
// チェック処理
if (isNonNullable && (val.Equals(null) || val == null))
{
Debug.LogError(string.Format("{0} クラスの {1} フィールドは NonNullable ですが、値が null です", className, field.Name));
}
}
}
}
}
あとは以下のよう null チェックをしたいフィールドに NonNullable
をつけて、NullCheck
を呼び出すだけで Start()
時に null だったら警告が出るようになる。
using UnityEngine;
using MyExtension;
public class Hoge : MonoBehaviour
{
[NonNullable, SerializeField] private string _name;
[NonNullable, SerializeField] private GameObject _panel;
public void Start()
{
this.NullCheck();
}
}