コード例 #1
0
        /// <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();
        }
コード例 #2
0
        /// <summary>
        /// Draw the GUI.
        /// </summary>
        public override void OnInspectorGUI()
        {
            myTarget = (EventResponder)target;

            Undo.RecordObject(target, "Event Update");
            GameObject sender = (GameObject)EditorGUILayout.ObjectField(new GUIContent("Sender", "Add the Game Object that holds the target component."), myTarget.sender, typeof(GameObject), true);

            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);
                }

                myTarget.typeName = typeName;

                if (myTarget.typeName != null && myTarget.typeName.Length > 0)
                {
                    events = GetEventNamesForType(myTarget.typeName);
                    if (events != null && events.Length > 0)
                    {
                        int eventIndex = System.Array.IndexOf(events, myTarget.eventName);
                        if (eventIndex == -1 || eventIndex >= events.Length)
                        {
                            eventIndex = 0;
                        }
                        string name = events[EditorGUILayout.Popup("Event", eventIndex, events)];
                        myTarget.eventName = name;

                        type = typeof(Character).Assembly.GetType("PlatformerPro." + typeName);
                        if (type == null)
                        {
                            type = typeof(Character).Assembly.GetTypes().Where(t => t.Name == typeName).FirstOrDefault();
                        }
                        eventInfo     = type.GetEvent(myTarget.eventName);
                        parameterType = eventInfo.EventHandlerType.GetMethod("Invoke").GetParameters()[1].ParameterType;

                        // 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);
                        }
                        // Activation event
                        if (parameterType != null && parameterType.IsAssignableFrom(typeof(ActivationEventArgs)))
                        {
                            myTarget.stringFilter = EditorGUILayout.TextField(new GUIContent("Item", "Name of the Activation Item or empty string for any item."),
                                                                              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++)
                {
                    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;
                        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;
                        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();
                        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();
        }