private static bool DrawArrowsPlusAndMinus(int index, int arraySize, ref SerializedObject m_Object, ref SerializedProperty triggersProperty, AIBehaviorsStyles styles, string propertyName, string firstTriggerType)
        {
            SerializedProperty prop = triggersProperty.GetArrayElementAtIndex(index);

            if (prop != null)
            {
                Object obj = prop.objectReferenceValue;

                if (obj != null)
                {
                    bool oldEnabled = GUI.enabled;

                    GUI.enabled = index > 0;
                    if (GUILayout.Button(styles.blankContent, styles.upStyle, GUILayout.MaxWidth(styles.arrowButtonWidths)))
                    {
                        triggersProperty.MoveArrayElement(index, index - 1);
                    }

                    GUI.enabled = index < arraySize - 1;
                    if (GUILayout.Button(styles.blankContent, styles.downStyle, GUILayout.MaxWidth(styles.arrowButtonWidths)))
                    {
                        triggersProperty.MoveArrayElement(index, index + 1);
                    }

                    GUI.enabled = true;
                    if (GUILayout.Button(styles.blankContent, styles.addStyle, GUILayout.MaxWidth(styles.addRemoveButtonWidths)))
                    {
                        GameObject go = (m_Object.targetObject as Component).gameObject;

                        triggersProperty.InsertArrayElementAtIndex(index);
                        triggersProperty.GetArrayElementAtIndex(index + 1).objectReferenceValue = ComponentHelper.AddComponentByName(go, firstTriggerType);
                    }

                    if (GUILayout.Button(styles.blankContent, styles.removeStyle, GUILayout.MaxWidth(styles.addRemoveButtonWidths)))
                    {
                        BaseTrigger baseTrigger = prop.objectReferenceValue as BaseTrigger;

                                                #if UNITY_4_3
                        Undo.RegisterFullObjectHierarchyUndo(baseTrigger);
                                                #else
                        Undo.RegisterFullObjectHierarchyUndo(baseTrigger, "RemovedTrigger");
                                                #endif

                        AIBehaviorsAssignableObjectArray.RemoveObjectAtIndex(m_Object, index, propertyName);
                        DestroyTriggers(baseTrigger.subTriggers);
                        Object.DestroyImmediate(baseTrigger, true);

                        return(true);
                    }

                    GUI.enabled = oldEnabled;
                }
            }

            return(false);
        }
Пример #2
0
        public override void OnInspectorGUI()
        {
            BaseState[] states = fsm.GetAllStates();

            if (prevStateSelection != curStateSelection)
            {
                prevStateSelection = curStateSelection;
                EditorUtility.SetDirty(fsm.GetStateByIndex(curStateSelection));
            }

            if (inittedSuccessfully)
            {
                m_Object.Update();

                if (curStateSelection >= states.Length)
                {
                    curStateSelection = 0;
                }

                GUILayout.Space(10);
                GUILayout.BeginVertical(GUI.skin.box);
                GUILayout.Space(10);

                for (int i = 0; i < fsm.stateCount; i++)
                {
                    string stateDisplayName;

                    if (states[i] == null || states[i].name == null)
                    {
                        Undo.RecordObject(fsm, "Removed null state");
                        AIBehaviorsAssignableObjectArray.RemoveObjectAtIndex(m_Object, i, "states");
                        m_Object.ApplyModifiedProperties();
                        return;
                    }

                    stateDisplayName = states[i].name;

                    GUILayout.BeginHorizontal();
                    {
                        const int guiWidths = 90;

                        if (GUILayout.Button("Edit", GUILayout.MaxWidth(50)))
                        {
                            curStateSelection = i;

                            EditorPrefs.SetString(selectedStateKey, stateDisplayName);
                        }

                        GUILayout.Space(10);

                        Color  oldColor = GUI.color;
                        string updatedName;

                        if (Application.isPlaying && states[i] == fsm.currentState)
                        {
                            GUI.color = Color.green;
                        }
                        else if (!Application.isPlaying && states[i] == fsm.initialState)
                        {
                            GUI.color = Color.green;
                        }

                        updatedName = GUILayout.TextField(states[i].name, GUILayout.MaxWidth(guiWidths));

                        GUI.color = oldColor;

                        UpdateStateName(updatedName, states[i]);

                        int curState = 0;
                        int newIndex = 0;

                        for (int j = 0; j < derivedStateNames.Length; j++)
                        {
                            if (states[i].GetType().Name == derivedStateNames[j])
                            {
                                curState = j;
                                break;
                            }
                        }

                        newIndex = EditorGUILayout.Popup(curState, derivedStateNames, GUILayout.MaxWidth(guiWidths));

                        if (curState != newIndex)
                        {
                            SerializedProperty m_Prop = m_Object.FindProperty(string.Format(kStatesArrayData, i));
                            string             newName;

                            DestroyImmediate(m_Prop.objectReferenceValue);
                            string typeName = derivedStateNames[newIndex];
                            m_Prop.objectReferenceValue = ComponentHelper.AddComponentByName(fsm.statesGameObject, typeName);
                            newName = AIBehaviorsComponentInfoHelper.GetNameFromType(typeName);
                            UpdateStateName(newName, (m_Prop.objectReferenceValue as BaseState));
                        }

                        // Draw Up, Down, and Remove
                        bool oldEnabled = GUI.enabled;
                        GUI.enabled = i != 0;
                        if (GUILayout.Button(styles.blankContent, styles.upStyle, GUILayout.MaxWidth(styles.arrowButtonWidths)))
                        {
                            AIBehaviorsAssignableObjectArray.Swap(m_Object, i, i - 1, kStatesArrayData);
                        }

                        GUI.enabled = i < states.Length - 1;
                        if (GUILayout.Button(styles.blankContent, styles.downStyle, GUILayout.MaxWidth(styles.arrowButtonWidths)))
                        {
                            AIBehaviorsAssignableObjectArray.Swap(m_Object, i, i + 1, kStatesArrayData);
                        }

                        GUI.enabled = true;


                        if (GUILayout.Button(styles.blankContent, styles.addStyle, GUILayout.MaxWidth(styles.addRemoveButtonWidths)))
                        {
                            SerializedProperty prop = m_Object.FindProperty("states");
                            prop.InsertArrayElementAtIndex(i);
                            BaseState prevState = m_Object.FindProperty(string.Format(kStatesArrayData, i)).objectReferenceValue as BaseState;
                            string    typeName  = prevState.GetType().Name;
                            BaseState newState  = ComponentHelper.AddComponentByName(statesGameObject, typeName) as BaseState;
                            newState.name = prevState.name;
                            UpdateStateName(prevState.name, newState);
                            m_Object.FindProperty(string.Format(kStatesArrayData, i + 1)).objectReferenceValue = newState;
                            Undo.RegisterCreatedObjectUndo(statesGameObject, "Added New State");
                        }

                        GUI.enabled = states.Length > 1;
                        if (GUILayout.Button(styles.blankContent, styles.removeStyle, GUILayout.MaxWidth(styles.addRemoveButtonWidths)))
                        {
                            BaseState state = m_Object.FindProperty(string.Format(kStatesArrayData, i)).objectReferenceValue as BaseState;

                            Undo.RecordObject(state, "Remove a State");

                            foreach (BaseTrigger trigger in state.triggers)
                            {
                                DestroyImmediate(trigger, true);
                            }

                            DestroyImmediate(state, true);

                            AIBehaviorsAssignableObjectArray.RemoveObjectAtIndex(m_Object, i, "states");
                            m_Object.ApplyModifiedProperties();
                            return;
                        }

                        GUI.enabled = oldEnabled;

                        if (EditorGUILayout.Toggle(styles.blankContent, states[i].isEnabled, GUILayout.MaxWidth(25)) != states[i].isEnabled)
                        {
                            states[i].isEnabled = !states[i].isEnabled;
                        }
                    }
                    GUILayout.EndHorizontal();
                }

                EditorGUILayout.Separator();
                DrawInitialStatePopup();

                GUILayout.EndVertical();

                EditorGUILayout.Separator();
                DrawGeneralAgentProperties();

                EditorGUILayout.Separator();
                fsm.objectFinder.DrawPlayerTagsSelection(fsm, m_Object, "objectFinder", true);

                AIBehaviorsTriggersGUI.Draw(m_Object, fsm, "Global Triggers:", "AIBehaviors_GlobalTriggersFoldout");

                EditorGUILayout.Separator();
                DrawAnimationCallbackSelection();

                m_Object.ApplyModifiedProperties();

                // Draw Individual states below

                AIBehaviorsGeneralEditorGUI.Separator();
                GUILayout.BeginHorizontal();
                GUILayout.Label("");
                GUILayout.Label("-- " + states[curStateSelection].name + " (" + states[curStateSelection].GetType().ToString() + ") --", EditorStyles.boldLabel);
                GUILayout.Label("");
                GUILayout.EndHorizontal();
                AIBehaviorsGeneralEditorGUI.Separator();
                states[curStateSelection].DrawInspectorEditor(fsm);

                EditorGUILayout.Separator();
            }
            else
            {
                GUI.contentColor = Color.red;
                GUILayout.Label("You must fix your errors before editting.");
            }
        }
        public static void DrawAnimationFields(SerializedObject m_StateObject, bool usesMultipleAnimations)
        {
            SerializedProperty m_animationStates = m_StateObject.FindProperty("skillStatesComponent");
            SerializedProperty statesProperty    = m_StateObject.FindProperty("skillStates");
            int               arraySize          = statesProperty.arraySize;
            AISkillStates     animStatesComponent;
            AIBehaviorsStyles styles = new AIBehaviorsStyles();
            bool              newFoldoutValue;
            bool              hadNullAnimation = false;

            const string foldoutValueKey = "AIBehaviors_SkillsFoldout";

            AssignAnimationStatesComponent(m_StateObject);
            animStatesComponent = m_animationStates.objectReferenceValue as AISkillStates;

            if (!gotFoldoutValue)
            {
                if (EditorPrefs.HasKey(foldoutValueKey))
                {
                    foldoutValue = EditorPrefs.GetBool(foldoutValueKey);
                }

                gotFoldoutValue = true;
            }

            newFoldoutValue = foldoutValue;
            newFoldoutValue = EditorGUILayout.Foldout(foldoutValue, "Skills:", EditorStyles.foldoutPreDrop);

            if (foldoutValue != newFoldoutValue)
            {
                foldoutValue = newFoldoutValue;
                EditorPrefs.SetBool(foldoutValueKey, foldoutValue);
            }

            // Check the array for null animations
            for (int i = 0; i < arraySize; i++)
            {
                if (statesProperty.GetArrayElementAtIndex(i).objectReferenceValue == null)
                {
                    if (animStatesComponent != null)
                    {
                        statesProperty.GetArrayElementAtIndex(i).objectReferenceValue = animStatesComponent.states[0];
                        hadNullAnimation = true;
                    }
                }
            }

            if (!foldoutValue || hadNullAnimation)
            {
                m_StateObject.ApplyModifiedProperties();
                return;
            }

            // Is the component assigned?
            if (m_animationStates.objectReferenceValue != null && animStatesComponent != null && arraySize > 0)
            {
                GUILayout.BeginVertical(GUI.skin.box);

                AISkillState[] states = new AISkillState[arraySize];
                string[]       animationStateNames = GetAnimationStateNames(m_StateObject);

                if (animStatesComponent.states.Length == 0)
                {
                    Color oldColor = GUI.color;
                    GUI.color = Color.yellow;
                    GUILayout.Label("No states have been created\nfor the AISkillStates component.");
                    GUI.color = oldColor;

                    return;
                }

                for (int i = 0; i < arraySize; i++)
                {
                    SerializedProperty prop = statesProperty.GetArrayElementAtIndex(i);
                    bool oldEnabled         = GUI.enabled;

                    if (prop != null)
                    {
                        Object obj = prop.objectReferenceValue;
                        int    curIndex;

                        if (obj != null)
                        {
                            states[i] = obj as AISkillState;
                            curIndex  = GetCurrentStateIndex(states[i], animStatesComponent.states);

                            if (curIndex == -1)
                            {
                                if (animStatesComponent.states.Length > 0)
                                {
                                    curIndex  = 0;
                                    states[i] = animStatesComponent.states[0];
                                }
                            }

                            GUILayout.BeginHorizontal();
                            {
                                curIndex = EditorGUILayout.Popup(curIndex, animationStateNames, EditorStyles.popup);
                                m_StateObject.FindProperty(string.Format(kArrayData, i)).objectReferenceValue = animStatesComponent.states[curIndex];

                                if (usesMultipleAnimations)
                                {
                                    GUI.enabled = i > 0;
                                    if (GUILayout.Button(styles.blankContent, styles.upStyle, GUILayout.MaxWidth(styles.arrowButtonWidths)))
                                    {
                                        statesProperty.MoveArrayElement(i, i - 1);
                                    }

                                    GUI.enabled = i < arraySize - 1;
                                    if (GUILayout.Button(styles.blankContent, styles.downStyle, GUILayout.MaxWidth(styles.arrowButtonWidths)))
                                    {
                                        statesProperty.MoveArrayElement(i, i + 1);
                                    }

                                    GUI.enabled = true;
                                    if (GUILayout.Button(styles.blankContent, styles.addStyle, GUILayout.MaxWidth(styles.addRemoveButtonWidths)))
                                    {
                                        statesProperty.InsertArrayElementAtIndex(i);
                                    }

                                    //GUI.enabled = arraySize > 1;
                                    if (GUILayout.Button(styles.blankContent, styles.removeStyle, GUILayout.MaxWidth(styles.addRemoveButtonWidths)))
                                    {
                                        AIBehaviorsAssignableObjectArray.RemoveObjectAtIndex(m_StateObject, i, "skillStates");
                                        GUILayout.EndHorizontal();
                                        break;
                                    }
                                    GUI.enabled = oldEnabled;
                                }
                            }
                            GUILayout.EndHorizontal();
                        }
                        else
                        {
                            statesProperty.GetArrayElementAtIndex(i).objectReferenceValue = animStatesComponent.states[0];
                        }
                    }

                    GUI.enabled = oldEnabled;
                }

                GUILayout.EndVertical();
            }

            if (GUILayout.Button(styles.blankContent, styles.addStyle, GUILayout.MaxWidth(styles.addRemoveButtonWidths)))
            {
                statesProperty.arraySize++;
                statesProperty.GetArrayElementAtIndex(arraySize).objectReferenceValue = animStatesComponent.states[0];
            }


            m_StateObject.ApplyModifiedProperties();
        }
Пример #4
0
        public override void OnInspectorGUI()
        {
            m_Object.Update();

            int arraySize = m_AnimationStatesCount.intValue;

            AIAnimationState[] states        = new AIAnimationState[arraySize + 1];
            SerializedProperty animationType = m_Object.FindProperty("animationType");

            EditorGUILayout.Separator();
            EditorGUILayout.PropertyField(animationType);

            for (int i = 0; i < arraySize; i++)
            {
                string stateNameLabel = "";
                bool   oldEnabled     = GUI.enabled;

                if (m_Object.FindProperty(string.Format(kArrayData, i)) == null)
                {
                    AIBehaviorsAssignableObjectArray.RemoveObjectAtIndex(m_Object, i, "states");
                    continue;
                }

                states[i] = m_Object.FindProperty(string.Format(kArrayData, i)).objectReferenceValue as AIAnimationState;

                if (states[i] == null)
                {
                    AIBehaviorsAssignableObjectArray.RemoveObjectAtIndex(m_Object, i, "states");
                    continue;
                }

                GUILayout.BeginHorizontal();

                if (string.IsNullOrEmpty(states[i].name))
                {
                    stateNameLabel = "Untitled animation";
                }
                else
                {
                    stateNameLabel = states[i].name;
                }

                states[i].foldoutOpen = EditorGUILayout.Foldout(states[i].foldoutOpen, stateNameLabel, EditorStyles.foldoutPreDrop);

                GUI.enabled = i > 0;
                if (GUILayout.Button(styles.blankContent, styles.upStyle, GUILayout.MaxWidth(styles.arrowButtonWidths)))
                {
                    animationStatesProp.MoveArrayElement(i, i - 1);
                }

                GUI.enabled = i < arraySize - 1;
                if (GUILayout.Button(styles.blankContent, styles.downStyle, GUILayout.MaxWidth(styles.arrowButtonWidths)))
                {
                    animationStatesProp.MoveArrayElement(i, i + 1);
                }

                GUI.enabled = true;
                if (GUILayout.Button(styles.blankContent, styles.addStyle, GUILayout.MaxWidth(styles.addRemoveButtonWidths)))
                {
                    animationStatesProp.InsertArrayElementAtIndex(i);
                    animationStatesProp.GetArrayElementAtIndex(i + 1).objectReferenceValue = statesGameObject.AddComponent <AIAnimationState>();
                }

                GUI.enabled = arraySize > 1;
                if (GUILayout.Button(styles.blankContent, styles.removeStyle, GUILayout.MaxWidth(styles.addRemoveButtonWidths)))
                {
                    AIBehaviorsAssignableObjectArray.RemoveObjectAtIndex(m_Object, i, "states");
                    DestroyImmediate(m_Object.targetObject as AIAnimationState);
                    break;
                }
                GUI.enabled = oldEnabled;

                GUILayout.Space(10);

                GUILayout.EndHorizontal();

                GUILayout.Space(2);

                if (states[i].foldoutOpen)
                {
                    DrawAnimProperties(states[i], GetAnimationType((AnimationType)animationType.intValue));
                }
                else
                {
                    SerializedObject serializedAnimState = new SerializedObject(states[i]);
                    serializedAnimState.ApplyModifiedProperties();
                }
            }

            if (arraySize == 0)
            {
                m_Object.FindProperty(kArraySize).intValue++;
                animationStatesProp.GetArrayElementAtIndex(0).objectReferenceValue = statesGameObject.AddComponent <AIAnimationState>();
            }

            EditorGUILayout.Separator();

            m_Object.ApplyModifiedProperties();
        }