void CreateEditorButtonStates(MethodInfo[] methods) { editorButtonStates = new EditorButtonState[methods.Length]; int methodIndex = 0; foreach (var methodInfo in methods) { editorButtonStates [methodIndex] = new EditorButtonState(methodInfo.GetParameters().Length); methodIndex++; } }
void DrawButtonforMethod(object[] invokationTargets, MethodInfo methodInfo, EditorButtonState state) { EditorGUILayout.BeginHorizontal(); var foldoutRect = EditorGUILayout.GetControlRect(GUILayout.Width(10.0f)); state.opened = EditorGUI.Foldout(foldoutRect, state.opened, ""); bool clicked = GUILayout.Button(MethodDisplayName(methodInfo), GUILayout.ExpandWidth(true)); EditorGUILayout.EndHorizontal(); if (state.opened) { EditorGUI.indentLevel++; int paramIndex = 0; foreach (ParameterInfo parameterInfo in methodInfo.GetParameters()) { object currentVal = state.parameters [paramIndex]; state.parameters[paramIndex] = DrawParameterInfo(parameterInfo, currentVal); paramIndex++; } EditorGUI.indentLevel--; } if (clicked) { foreach (var invokationTarget in invokationTargets) { var monoTarget = invokationTarget as MonoBehaviour; object returnVal = methodInfo.Invoke(monoTarget, state.parameters); if (returnVal is IEnumerator) { monoTarget.StartCoroutine((IEnumerator)returnVal); } else if (returnVal != null) { Debug.Log("Method call result -> " + returnVal); } } } }
private void DrawButtonforMethod(MonoBehaviour target, MethodInfo methodInfo, EditorButtonState state) { EditorGUILayout.BeginHorizontal(); var ba = (InspectorButtonAttribute)Attribute.GetCustomAttribute(methodInfo, typeof(InspectorButtonAttribute)); GUI.enabled = !EditorApplication.isCompiling && (ba.Mode == InspectorDiplayMode.AlwaysEnabled || (EditorApplication.isPlaying ? ba.Mode == InspectorDiplayMode.EnabledInPlayMode : ba.Mode == InspectorDiplayMode.DisabledInPlayMode)); var paramsNum = methodInfo.GetParameters().Length; if (paramsNum > 0) { var foldoutRect = EditorGUILayout.GetControlRect(GUILayout.Width(10.0f)); state.Opened = EditorGUI.Foldout(foldoutRect, state.Opened, ""); } else { state.Opened = false; } var showName = string.IsNullOrEmpty(ba.MethodName) ? MethodDisplayName(methodInfo) : ba.MethodName; var clicked = GUILayout.Button(showName, GUILayout.ExpandWidth(true)); GUI.enabled = true; EditorGUILayout.EndHorizontal(); if (state.Opened) { EditorGUI.indentLevel++; var paramIndex = 0; foreach (var parameterInfo in methodInfo.GetParameters()) { var currentVal = state.Parameters[paramIndex]; state.Parameters[paramIndex] = DrawParameterInfo(parameterInfo, currentVal); paramIndex++; } EditorGUI.indentLevel--; } if (clicked) { var returnVal = methodInfo.Invoke(target, state.Parameters); if (returnVal is IEnumerator) { IEnumerator enumerator = returnVal as IEnumerator; target.StartCoroutine(enumerator); } else if (returnVal != null) { Debug.Log("Method call result -> " + returnVal); } } }