UnityでSerializeFieldを再帰的にnull check

UnityでSerializeFieldを再帰的にnull check

        public static void AssertNotNullSerializeFieldsRecursive(
            MonoBehaviour checking, 
            string projectNameSpace, 
            List<MonoBehaviour> checkedList)
        {
#if UNITY_EDITOR
            bool isRoot = checkedList.Count == 0;
            var fields = checking.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
            checkedList.Add(checking);

            foreach (var field in fields)
            {
                if (field.GetCustomAttribute(typeof(SerializeField), true) == null) continue;

                var fieldValue = field.GetValue(checking);
                
                if (fieldValue == null ||
                    TryAccessGameObject(fieldValue) is UnassignedReferenceException)
                {
                    Debug.LogError( 
                        $"<color=#76b900>{field.Name}</color> is null in <color=#76b900>{checking.name}</color>");
                }

                var fieldType = field.FieldType;
                if (fieldType.Namespace == null) continue;
                if (fieldType.Namespace.StartsWith(projectNameSpace) == false) continue;
                if (fieldValue is MonoBehaviour fieldMonoBehaviour && checkedList.Contains(fieldMonoBehaviour) == false)
                    AssertNotNullSerializeFieldsRecursive(fieldMonoBehaviour, projectNameSpace, checkedList);
            } 
            if (isRoot) Debug.Log("done null check: " + checkedList.Count);
#endif
        }
        
        public static Exception? TryAccessGameObject(object? fieldValue)
        {
            if (fieldValue is not GameObject fieldGameObject) return null;
            try
            {
                _ = fieldGameObject.activeSelf;
            }
            catch (Exception e)
            {
                return e;
            }
            return null;
        }

AudioClipとかのnullを検出できてない気がするのでまだ未完成