56 lines
1.7 KiB
C#
56 lines
1.7 KiB
C#
|
using UnityEngine;
|
|||
|
#if UNITY_EDITOR
|
|||
|
using UnityEditor;
|
|||
|
#endif
|
|||
|
using System.Reflection;
|
|||
|
|
|||
|
namespace MoreMountains.Tools
|
|||
|
{
|
|||
|
[System.AttributeUsage(System.AttributeTargets.Field)]
|
|||
|
public class MMInspectorButtonAttribute : PropertyAttribute
|
|||
|
{
|
|||
|
public readonly string MethodName;
|
|||
|
|
|||
|
public MMInspectorButtonAttribute(string MethodName)
|
|||
|
{
|
|||
|
this.MethodName = MethodName;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#if UNITY_EDITOR
|
|||
|
[CustomPropertyDrawer(typeof(MMInspectorButtonAttribute))]
|
|||
|
public class InspectorButtonPropertyDrawer : PropertyDrawer
|
|||
|
{
|
|||
|
private MethodInfo _eventMethodInfo = null;
|
|||
|
|
|||
|
public override void OnGUI(Rect position, SerializedProperty prop, GUIContent label)
|
|||
|
{
|
|||
|
MMInspectorButtonAttribute inspectorButtonAttribute = (MMInspectorButtonAttribute)attribute;
|
|||
|
|
|||
|
float buttonLength = position.width;
|
|||
|
Rect buttonRect = new Rect(position.x, position.y, buttonLength, position.height);
|
|||
|
GUI.skin.button.alignment = TextAnchor.MiddleLeft;
|
|||
|
|
|||
|
if (GUI.Button(buttonRect, inspectorButtonAttribute.MethodName))
|
|||
|
{
|
|||
|
System.Type eventOwnerType = prop.serializedObject.targetObject.GetType();
|
|||
|
string eventName = inspectorButtonAttribute.MethodName;
|
|||
|
|
|||
|
if (_eventMethodInfo == null)
|
|||
|
{
|
|||
|
_eventMethodInfo = eventOwnerType.GetMethod(eventName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
|
|||
|
}
|
|||
|
|
|||
|
if (_eventMethodInfo != null)
|
|||
|
{
|
|||
|
_eventMethodInfo.Invoke(prop.serializedObject.targetObject, null);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Debug.LogWarning(string.Format("InspectorButton: Unable to find method {0} in {1}", eventName, eventOwnerType));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|