/// <summary> /// Draw the GUI. /// </summary> public override void OnInspectorGUI() { myTarget = (EventResponder)target; GameObject sender = (GameObject)EditorGUILayout.ObjectField(new GUIContent("Sender", "Add the Game Object that holds the target component."), myTarget.sender, typeof(GameObject), true); if (sender != myTarget.sender) { myTarget.sender = sender; if (myTarget.sender != null) { types = GetComponentsOnGameObject(myTarget.sender); } } if (myTarget.sender == null) { myTarget.sender = myTarget.gameObject; } if (myTarget.sender != null) { string typeName = null; if (types == null) { types = GetComponentsOnGameObject(myTarget.sender); } int typeIndex = System.Array.IndexOf(types, myTarget.typeName); if (typeIndex == -1 || typeIndex >= types.Length) { typeIndex = 0; } if (types != null && types.Length > 0) { typeName = types[EditorGUILayout.Popup("Component", typeIndex, types)]; } else { EditorGUILayout.HelpBox("No components found on this GameObject.", MessageType.Info); } if (typeName != myTarget.typeName && typeName != null) { myTarget.typeName = typeName; if (myTarget.typeName != null) { events = GetEventNamesForType(myTarget.typeName); } } if (myTarget.typeName != null && myTarget.typeName.Length > 0) { if (events == null) { events = GetEventNamesForType(myTarget.typeName); } int eventIndex = System.Array.IndexOf(events, myTarget.eventName); if (eventIndex == -1 || eventIndex >= events.Length) { eventIndex = 0; } if (events != null && events.Length > 0) { string name = events[EditorGUILayout.Popup("Event", eventIndex, events)]; if (name != myTarget.eventName || parameterType == null) { myTarget.eventName = name; //try //{ type = myTarget.GetType().Assembly.GetType(this.GetType().Namespace + "." + typeName); eventInfo = type.GetEvent(myTarget.eventName); parameterType = eventInfo.EventHandlerType.GetMethod("Invoke").GetParameters()[1].ParameterType; //} //catch (System.Exception ex) { // Debug.Log (ex.Message); //} } // Animation event if (parameterType != null && parameterType.IsAssignableFrom(typeof(AnimationEventArgs))) { myTarget.animationStateFilter = (AnimationState)EditorGUILayout.EnumPopup(new GUIContent("Animation State", "The animation state which will trigger this event response, use NONE for any state"), myTarget.animationStateFilter); } // Damage event if (parameterType != null && parameterType.IsAssignableFrom(typeof(DamageInfoEventArgs))) { myTarget.damageTypeFilter = (DamageType)EditorGUILayout.EnumPopup(new GUIContent("Damage Type", "The damage type which will trigger this event response, use NONE for any type"), myTarget.damageTypeFilter); } // Button event if (parameterType != null && parameterType.IsAssignableFrom(typeof(ButtonEventArgs))) { myTarget.buttonStateFilter = (ButtonState)EditorGUILayout.EnumPopup(new GUIContent("Button State", "The button state which triggers this response, use ANY for any type"), myTarget.buttonStateFilter); } // Phase event if (parameterType != null && parameterType.IsAssignableFrom(typeof(PhaseEventArgs))) { myTarget.stringFilter = EditorGUILayout.TextField(new GUIContent("Phase", "Name of the phase or empty string for any phase."), myTarget.stringFilter); } // State event if (parameterType != null && parameterType.IsAssignableFrom(typeof(StateEventArgs))) { myTarget.stringFilter = EditorGUILayout.TextField(new GUIContent("State", "Name of the state or empty string for any state."), myTarget.stringFilter); } } else { EditorGUILayout.HelpBox("No events found on this component.", MessageType.Info); } } } if (myTarget.actions != null) { for (int i = 0; i < myTarget.actions.Length; i++) { RenderAction(myTarget, myTarget, myTarget.actions[i]); } } GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1)); EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); // Add new actions if (GUILayout.Button("Add Action")) { if (myTarget.actions == null) { myTarget.actions = new EventResponse[1]; } else { // Copy and grow array EventResponse[] tmpActions = myTarget.actions; myTarget.actions = new EventResponse[tmpActions.Length + 1]; System.Array.Copy(tmpActions, myTarget.actions, tmpActions.Length); } } EditorGUILayout.EndHorizontal(); }
/// <summary> /// Draw the GUI. /// </summary> public override void OnInspectorGUI() { myTarget = (EventResponder)target; GameObject sender = (GameObject)EditorGUILayout.ObjectField(new GUIContent("Sender", "Add the Game Object that holds the target component."), myTarget.sender, typeof(GameObject), true); if (sender != myTarget.sender) { myTarget.sender = sender; if (myTarget.sender != null) { types = GetComponentsOnGameObject(myTarget.sender); } } if (myTarget.sender == null) { myTarget.sender = myTarget.gameObject; } if (myTarget.sender != null) { string typeName = null; if (types == null) { types = GetComponentsOnGameObject(myTarget.sender); } int typeIndex = System.Array.IndexOf(types, myTarget.typeName); if (typeIndex == -1 || typeIndex >= types.Length) { typeIndex = 0; } if (types != null && types.Length > 0) { typeName = types[EditorGUILayout.Popup("Component", typeIndex, types)]; } else { EditorGUILayout.HelpBox("No components found on this GameObject.", MessageType.Info); } if (typeName != myTarget.typeName && typeName != null) { myTarget.typeName = typeName; if (myTarget.typeName != null) { events = GetEventNamesForType(myTarget.typeName); } } if (myTarget.typeName != null && myTarget.typeName.Length > 0) { if (events == null) { events = GetEventNamesForType(myTarget.typeName); } int eventIndex = System.Array.IndexOf(events, myTarget.eventName); if (eventIndex == -1 || eventIndex >= events.Length) { eventIndex = 0; } if (events != null && events.Length > 0) { string name = events[EditorGUILayout.Popup("Event", eventIndex, events)]; if (name != myTarget.eventName || parameterType == null) { myTarget.eventName = name; //try //{ type = myTarget.GetType().Assembly.GetType(this.GetType().Namespace + "." + typeName); eventInfo = type.GetEvent(myTarget.eventName); parameterType = eventInfo.EventHandlerType.GetMethod("Invoke").GetParameters()[1].ParameterType; //} //catch (System.Exception ex) { // Debug.Log (ex.Message); //} } // Animation event if (parameterType != null && parameterType.IsAssignableFrom(typeof(AnimationEventArgs))) { myTarget.animationStateFilter = (AnimationState)EditorGUILayout.EnumPopup(new GUIContent("Animation State", "The animation state which will trigger this event response, use NONE for any state"), myTarget.animationStateFilter); } // Damage event if (parameterType != null && parameterType.IsAssignableFrom(typeof(DamageInfoEventArgs))) { myTarget.damageTypeFilter = (DamageType)EditorGUILayout.EnumPopup(new GUIContent("Damage Type", "The damage type which will trigger this event response, use NONE for any type"), myTarget.damageTypeFilter); } // Button event if (parameterType != null && parameterType.IsAssignableFrom(typeof(ButtonEventArgs))) { myTarget.buttonStateFilter = (ButtonState)EditorGUILayout.EnumPopup(new GUIContent("Button State", "The button state which triggers this response, use ANY for any type"), myTarget.buttonStateFilter); } // Phase event if (parameterType != null && parameterType.IsAssignableFrom(typeof(PhaseEventArgs))) { myTarget.stringFilter = EditorGUILayout.TextField(new GUIContent("Phase", "Name of the phase or empty string for any phase."), myTarget.stringFilter); } // State event if (parameterType != null && parameterType.IsAssignableFrom(typeof(StateEventArgs))) { myTarget.stringFilter = EditorGUILayout.TextField(new GUIContent("State", "Name of the state or empty string for any state."), myTarget.stringFilter); } // Attack event if (parameterType != null && parameterType.IsAssignableFrom(typeof(AttackEventArgs))) { myTarget.stringFilter = EditorGUILayout.TextField(new GUIContent("Attack", "Name of the attack or empty string for any attack."), myTarget.stringFilter); } // Extra Damage event if (parameterType != null && parameterType.IsAssignableFrom(typeof(ExtraDamageInfoEventArgs))) { myTarget.stringFilter = EditorGUILayout.TextField(new GUIContent("Attack", "Name of the attack or empty string for any attack."), myTarget.stringFilter); } // Item event if (parameterType != null && parameterType.IsAssignableFrom(typeof(ItemEventArgs))) { myTarget.stringFilter = EditorGUILayout.TextField(new GUIContent("Item Type", "Name of the item type or empty for any item."), myTarget.stringFilter); myTarget.intFilter = EditorGUILayout.IntField(new GUIContent("Amount", "Minimum amount that must be in the inventory."), myTarget.intFilter); } } else { EditorGUILayout.HelpBox("No events found on this component.", MessageType.Info); } } } if (myTarget.actions != null) { for (int i = 0; i < myTarget.actions.Length; i++) { EditorGUILayout.BeginVertical("HelpBox"); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (i == 0) { GUI.enabled = false; } if (GUILayout.Button("Move Up", EditorStyles.miniButtonLeft)) { EventResponse tmp = myTarget.actions[i - 1]; myTarget.actions[i - 1] = myTarget.actions[i]; myTarget.actions[i] = tmp; EditorUtility.SetDirty(target); break; } GUI.enabled = true; if (i == myTarget.actions.Length - 1) { GUI.enabled = false; } if (GUILayout.Button("Move Down", EditorStyles.miniButtonRight)) { EventResponse tmp = myTarget.actions[i + 1]; myTarget.actions[i + 1] = myTarget.actions[i]; myTarget.actions[i] = tmp; EditorUtility.SetDirty(target); break; } GUI.enabled = true; // Remove GUILayout.Space(4); bool removed = false; if (GUILayout.Button("Remove", EditorStyles.miniButton)) { myTarget.actions = myTarget.actions.Where(a => a != myTarget.actions[i]).ToArray(); EditorUtility.SetDirty(target); removed = true; } GUILayout.EndHorizontal(); if (!removed) { RenderAction(myTarget, myTarget, myTarget.actions[i]); } EditorGUILayout.EndVertical(); } } EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); // Add new actions if (GUILayout.Button("Add Action")) { if (myTarget.actions == null) { myTarget.actions = new EventResponse[1]; } else { // Copy and grow array EventResponse[] tmpActions = myTarget.actions; myTarget.actions = new EventResponse[tmpActions.Length + 1]; System.Array.Copy(tmpActions, myTarget.actions, tmpActions.Length); } } EditorGUILayout.EndHorizontal(); }