From a40eb57381275829cefc5cac445c0eae684d76b9 Mon Sep 17 00:00:00 2001 From: Sadegh Askari Date: Wed, 19 Jun 2024 19:08:29 +0330 Subject: [PATCH 1/6] fix for ComponentAssigner InvalidCastException --- Editor/Assigners/ComponentAssigner.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Editor/Assigners/ComponentAssigner.cs b/Editor/Assigners/ComponentAssigner.cs index 1a17677..1ba0374 100644 --- a/Editor/Assigners/ComponentAssigner.cs +++ b/Editor/Assigners/ComponentAssigner.cs @@ -24,7 +24,8 @@ public bool TryAssign(SerializedProperty property) if (property.objectReferenceValue != null) return true; - if (!property.HasPrefabInTheName()) + var isComponent = property.serializedObject.targetObject is Component; + if (!property.HasPrefabInTheName() && isComponent) { var root = (Component)property.serializedObject.targetObject; Component[] children = root.GetComponentsInChildren(fieldType, true); From c077e90e403347c6e45a3bd81632241edc4f3d2c Mon Sep 17 00:00:00 2001 From: Sadegh Askari Date: Wed, 19 Jun 2024 19:10:06 +0330 Subject: [PATCH 2/6] fix for prefab provider null reference exception --- Editor/Providers/PrefabProvider.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Editor/Providers/PrefabProvider.cs b/Editor/Providers/PrefabProvider.cs index fe2a18f..03b43b3 100644 --- a/Editor/Providers/PrefabProvider.cs +++ b/Editor/Providers/PrefabProvider.cs @@ -48,7 +48,8 @@ public static Component GetOne(Type t, string targetName) (string bestPath, _) = NameProcessor.GetMatching(paths, targetName); - return AssetDatabase.LoadAssetAtPath(bestPath).GetComponent(t); + var prefab = AssetDatabase.LoadAssetAtPath(bestPath); + return prefab != null ? prefab.GetComponent(t) : null; } public static GameObject GetOne(string targetName) From 8c950619729f841aaa572ecc0f0d2bb4b4b329fc Mon Sep 17 00:00:00 2001 From: Sadegh Askari Date: Fri, 21 Jun 2024 02:40:50 +0330 Subject: [PATCH 3/6] fix for ComponentArrayAssigner InvalidCastException --- Editor/Assigners/ComponentArrayAssigner.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Editor/Assigners/ComponentArrayAssigner.cs b/Editor/Assigners/ComponentArrayAssigner.cs index 716b0d4..30033b4 100644 --- a/Editor/Assigners/ComponentArrayAssigner.cs +++ b/Editor/Assigners/ComponentArrayAssigner.cs @@ -27,7 +27,8 @@ public bool TryAssign(SerializedProperty property) List all; - if (!property.HasPrefabInTheName()) + var isComponent = property.serializedObject.targetObject is Component; + if (!property.HasPrefabInTheName() && isComponent) { var root = (Component)property.serializedObject.targetObject; all = root.GetComponentsInChildren(element, true).ToList(); From da429d41ac48186b3737f78e6420b95a1ddaf27c Mon Sep 17 00:00:00 2001 From: Sadegh Askari Date: Fri, 21 Jun 2024 02:41:38 +0330 Subject: [PATCH 4/6] add support for AssetReferenceT<> --- Editor/Assigner.cs | 11 ++- Editor/Assigners/AssetReferenceTAssigner.cs | 80 +++++++++++++++++++ .../Assigners/AssetReferenceTAssigner.cs.meta | 3 + Editor/AutoAssigner.Editor.asmdef | 11 ++- Editor/SerializedPropertyExtensions.cs | 9 +++ 5 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 Editor/Assigners/AssetReferenceTAssigner.cs create mode 100644 Editor/Assigners/AssetReferenceTAssigner.cs.meta diff --git a/Editor/Assigner.cs b/Editor/Assigner.cs index 16feeb6..4644716 100644 --- a/Editor/Assigner.cs +++ b/Editor/Assigner.cs @@ -13,6 +13,9 @@ public static class Assigner new ObjectAssigner(), new ComponentArrayAssigner(), new ObjectArrayAssigner(), +#if UNITY_ADDRESSABLES + new AssetReferenceTAssigner(), +#endif }; public static void AssignObjectProperties(SerializedObject obj) @@ -24,6 +27,7 @@ public static void AssignObjectProperties(SerializedObject obj) { Logger.Log($"Assigning property: {property.propertyPath}"); + bool assigned = false; foreach (ISubAssigner assigner in _assigners) { using (new Timer($"Assigner `{assigner.GetType().Name}` for `{property.propertyPath}`")) @@ -31,17 +35,20 @@ public static void AssignObjectProperties(SerializedObject obj) if (assigner.TryAssign(property)) { Logger.Log($"Property `{property.propertyPath}` assigned by {assigner.GetType().Name}"); + assigned = true; break; } } } + //because of AssetReferenceTAssigner this function must be called here. + if (assigned) + obj.ApplyModifiedProperties(); + if (!property.NextVisible(true)) break; } } - - obj.ApplyModifiedProperties(); } } } \ No newline at end of file diff --git a/Editor/Assigners/AssetReferenceTAssigner.cs b/Editor/Assigners/AssetReferenceTAssigner.cs new file mode 100644 index 0000000..c0e9d9b --- /dev/null +++ b/Editor/Assigners/AssetReferenceTAssigner.cs @@ -0,0 +1,80 @@ +#if UNITY_ADDRESSABLES +using System; +using AutoAssigner.Providers; +using UnityEditor; +using UnityEngine.AddressableAssets; + +namespace AutoAssigner.Assigners +{ + public class AssetReferenceTAssigner : ISubAssigner + { + public bool TryAssign(SerializedProperty property) + { + if (property.propertyType != SerializedPropertyType.Generic) + return false; + + if (property.isArray || property.IsArrayElement()) + return false; + + property.GetFieldInfoAndStaticType(out Type fieldType); + + if (!IsAssignableToGenericType(fieldType, typeof(AssetReferenceT<>))) + return false; + + var obj = property.GetObject(); + if (obj is not AssetReference assetRef) + return false; + + if (assetRef.editorAsset != null) + return true; + + var genericType = GetGenericType(fieldType); + if (genericType == null) + return false; + + var targetName = $"{genericType.Name} {property.name}"; + var targetObj = ObjectProvider.GetOne(genericType, targetName); + if (targetObj == null) + targetObj = PrefabProvider.GetOne(genericType, targetName); + + assetRef.SetEditorAsset(targetObj); + assetRef.SetEditorSubObject(targetObj); + + //We must Update SerializedObject to read new values + property.serializedObject.Update(); + + return true; + } + + //It's tricky to detect both AssetReferenceT and AssetReferenceSprite + private bool IsAssignableToGenericType(Type givenType, Type genericType) + { + if (givenType == null || genericType == null) + return false; + + if (givenType.IsGenericType && + genericType.IsAssignableFrom(givenType.GetGenericTypeDefinition())) + return true; + + var baseType = givenType.BaseType; + return IsAssignableToGenericType(baseType, genericType); + } + + //Return Sprite for both AssetReferenceT and AssetReferenceSprite + private Type GetGenericType(Type givenType) + { + if (givenType == null) + return null; + + if (givenType.IsGenericType) + { + var genericArguments = givenType.GetGenericArguments(); + return genericArguments.Length == 0 ? null : genericArguments[0]; + } + + var baseType = givenType.BaseType; + return GetGenericType(baseType); + } + } +} +#endif \ No newline at end of file diff --git a/Editor/Assigners/AssetReferenceTAssigner.cs.meta b/Editor/Assigners/AssetReferenceTAssigner.cs.meta new file mode 100644 index 0000000..4466f93 --- /dev/null +++ b/Editor/Assigners/AssetReferenceTAssigner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1abb1bd52cec4813b7e7517441546e73 +timeCreated: 1718917066 \ No newline at end of file diff --git a/Editor/AutoAssigner.Editor.asmdef b/Editor/AutoAssigner.Editor.asmdef index 6007ee7..6724548 100644 --- a/Editor/AutoAssigner.Editor.asmdef +++ b/Editor/AutoAssigner.Editor.asmdef @@ -2,7 +2,8 @@ "name": "AutoAssigner.Editor", "rootNamespace": "AutoAssigner", "references": [ - "AutoAssigner" + "AutoAssigner", + "Unity.Addressables" ], "includePlatforms": [ "Editor" @@ -13,6 +14,12 @@ "precompiledReferences": [], "autoReferenced": true, "defineConstraints": [], - "versionDefines": [], + "versionDefines": [ + { + "name": "com.unity.addressables", + "expression": "", + "define": "UNITY_ADDRESSABLES" + } + ], "noEngineReferences": false } \ No newline at end of file diff --git a/Editor/SerializedPropertyExtensions.cs b/Editor/SerializedPropertyExtensions.cs index 902e244..f597ed4 100644 --- a/Editor/SerializedPropertyExtensions.cs +++ b/Editor/SerializedPropertyExtensions.cs @@ -76,5 +76,14 @@ public static bool IsArrayElement(this SerializedProperty property) && property.propertyPath.Contains("[") && property.propertyPath.Contains("]"); } + + public static object GetObject(this SerializedProperty property) + { + object obj = property.serializedObject.targetObject; + string path = property.propertyPath; + BindingFlags bindings = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; + FieldInfo field = obj.GetType().GetField(path, bindings); + return field != null ? field.GetValue(obj) : default(object); + } } } \ No newline at end of file From 82e60a2cf3bfcad3b3803112a781216a751b11ad Mon Sep 17 00:00:00 2001 From: Sadegh Askari Date: Fri, 21 Jun 2024 22:36:51 +0330 Subject: [PATCH 5/6] falback component assigner to use prefab provider if it cant find any matching component without this fix if property name does not contain prefab and there isn't any matching component in the scene, component assigner leaves the field as null! --- Editor/Assigners/ComponentAssigner.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Editor/Assigners/ComponentAssigner.cs b/Editor/Assigners/ComponentAssigner.cs index 1ba0374..953a90d 100644 --- a/Editor/Assigners/ComponentAssigner.cs +++ b/Editor/Assigners/ComponentAssigner.cs @@ -33,13 +33,12 @@ public bool TryAssign(SerializedProperty property) if (children.Length != 0) { (property.objectReferenceValue, _) = NameProcessor.GetMatching(children, property.GetTargetName()); + if (property.objectReferenceValue != null) + return true; } } - else - { - property.objectReferenceValue = PrefabProvider.GetOne(fieldType, property.GetTargetName()); - } + property.objectReferenceValue = PrefabProvider.GetOne(fieldType, property.GetTargetName()); return true; } } From 8b9e3d851a6e77da34731f72fa57762a4285b9f6 Mon Sep 17 00:00:00 2001 From: Sadegh Askari Date: Sun, 15 Dec 2024 18:47:46 +0330 Subject: [PATCH 6/6] fix odin inspector problem --- Editor/AutoAssigner.Editor.asmdef | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Editor/AutoAssigner.Editor.asmdef b/Editor/AutoAssigner.Editor.asmdef index 6724548..124d1a1 100644 --- a/Editor/AutoAssigner.Editor.asmdef +++ b/Editor/AutoAssigner.Editor.asmdef @@ -10,8 +10,10 @@ ], "excludePlatforms": [], "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [], + "overrideReferences": false, + "precompiledReferences": [ + "" + ], "autoReferenced": true, "defineConstraints": [], "versionDefines": [