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