using System.Reflection; using UnityEditor; using UnityEngine; namespace Jovian.InspectorTools { public class OnValueChangedAttribute : PropertyAttribute { public readonly string methodName; public OnValueChangedAttribute(string methodName) { this.methodName = methodName; } } } #if UNITY_EDITOR namespace Jovian.InspectorTools.Internal { [CustomPropertyDrawer(typeof(OnValueChangedAttribute))] public class OnValueChangedAttributeDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.BeginChangeCheck(); EditorGUI.PropertyField(position, property, label); if(EditorGUI.EndChangeCheck()) { property.serializedObject.ApplyModifiedProperties(); Object target = property.serializedObject.targetObject; string methodName = ((OnValueChangedAttribute)attribute).methodName; MethodInfo methodInfo = target.GetType().GetMethod(methodName); if (methodInfo != null) { methodInfo.Invoke(target, null); } else { Debug.LogError($"No method named '{methodName}' found on {target}", target); } } } } } #endif