2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SerializeField の Null チェックをできるだけ簡単に行う

Last updated at Posted at 2024-10-26

やりたいこと

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();
	}
}
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?