using System; using System.Collections; using UnityEngine; using UnityEditor; [CustomPropertyDrawer(typeof(AutoInjector), true)] public class AutoInjectorDrawer : PropertyDrawer { AutoInjector AutoInjector => attribute as AutoInjector; public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { Type fieldType = fieldInfo.FieldType; if (!fieldType.IsSubclassOf(typeof(Component)) || fieldType.IsSubclassOf(typeof(IEnumerable)) || fieldType.IsArray) { return; } if (property.objectReferenceValue == null || !property.objectReferenceValue.GetType().IsSubclassOf(fieldType)) { Component target = property.serializedObject.targetObject as Component; Transform pwd = RecursiveFind(target.transform, AutoInjector.Path.Split('/'), 0); if (pwd != null) { property.objectReferenceValue = pwd.GetComponent(fieldType); } else { property.objectReferenceValue = null; } } var guiEnabled = GUI.enabled; GUI.enabled = false; EditorGUI.PropertyField(position, property, new GUIContent(label.text, AutoInjector.Path), true); GUI.enabled = guiEnabled; } Transform RecursiveFind(Transform pwd, string[] chunk, int pwdIndex) { if(pwd is null || pwdIndex >= chunk.Length) return pwd; return RecursiveFind(pwd.Find(chunk[pwdIndex]), chunk, pwdIndex + 1); } }