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を検出できてない気がするのでまだ未完成