private static void AssignProperty(SerializedObject obj, SerializedProperty property) { property.GetFieldInfoAndStaticType(out Type fieldType); var root = obj.targetObject as Component; bool hasPrefabInName = property.name.Contains("prefab", StringComparison.InvariantCultureIgnoreCase); string targetName = typeof(T).Name + " " + property.name; if (typeof(ScriptableObject).IsAssignableFrom(typeof(T))) { targetName = obj.targetObject.name + " " + targetName; } if (property.isArray) { if (property.arraySize != 0) { return; } // Nasty trick incoming property.InsertArrayElementAtIndex(0); SerializedProperty elementProperty = property.GetArrayElementAtIndex(0); elementProperty.GetFieldInfoAndStaticType(out Type element); property.DeleteArrayElementAtIndex(0); // Nasty trick over if (typeof(Component).IsAssignableFrom(element)) { List <Component> all; if (root != null && !hasPrefabInName) { all = root.GetComponentsInChildren(element, true).ToList(); if (all.Count == 0) { all = PrefabProvider.GetAll(element, targetName); } } else { all = PrefabProvider.GetAll(element, targetName); } property.arraySize = all.Count; for (int i = 0; i < all.Count; i++) { property.GetArrayElementAtIndex(i).objectReferenceValue = all[i]; } } else if (typeof(Object).IsAssignableFrom(element)) { List <Object> all = ObjectProvider.GetAll(element, targetName); property.arraySize = all.Count; for (var i = 0; i < all.Count; i++) { property.GetArrayElementAtIndex(i).objectReferenceValue = all[i]; } } } else { if (property.propertyType != SerializedPropertyType.ObjectReference) { return; } if (property.objectReferenceValue != null) { return; } if (typeof(Component).IsAssignableFrom(fieldType)) { if (root != null && !hasPrefabInName) { Component[] children = root.GetComponentsInChildren(fieldType, true); if (children.Length != 0) { (property.objectReferenceValue, _) = NameProcessor.GetMatching(children, targetName); return; } } property.objectReferenceValue = PrefabProvider.GetOne(fieldType, targetName); } else if (typeof(GameObject).IsAssignableFrom(fieldType)) { property.objectReferenceValue = PrefabProvider.GetOne(targetName); } else if (typeof(Object).IsAssignableFrom(fieldType)) { property.objectReferenceValue = ObjectProvider.GetOne(fieldType, targetName); } } }