private void AddTransition(StateNode endState, Transition transition) { if (!connectedStates.Contains(endState.state)) { connectedStates.Add(endState.state); TransitionDataHolder t = ScriptableObject.CreateInstance <TransitionDataHolder>(); t.Init(RemoveTransition, RemoveTransitionFromInspector); t.TransitionsForState = new List <Transition>(); t.TransitionsForState.Add(transition); // If the other state transitions to this one, it needs to be two ways if (endState.connectedStates.Contains(state)) { t.TwoWayTransition = true; endState.stateTransitionInfo[state].TwoWayTransition = true; t.OtherWayTransition = endState.stateTransitionInfo[state]; endState.stateTransitionInfo[state].OtherWayTransition = t; endState.UpdateTriangleRotation(state); } stateTransitionInfo.Add(endState.state, t); } else { stateTransitionInfo[endState.state].TransitionsForState.Add(transition); } UpdateTriangleRotation(endState.state); }
private void ProcessTransitionContextMenu(TransitionDataHolder transition) { GenericMenu genericMenu = new GenericMenu(); genericMenu.AddItem(new GUIContent("Remove Transition"), false, () => RemoveTransition(transition)); genericMenu.ShowAsContext(); }
/// <summary> /// Removed a connection from this node /// </summary> /// <param name="transitionToRemove"></param> public void RemoveTransition(TransitionDataHolder transition) { if (transition.OtherWayTransition != null) { transition.OtherWayTransition.TwoWayTransition = false; transition.OtherWayTransition.OtherWayTransition = null; transition.OtherWayTransition.UpdateTrianglePosition(transition.TransitionsForState[0].NextState.Rectangle.center, state.Rectangle.center, transitionClickableSize, twoWayTransitionOffset); } stateTransitionInfo.Remove(transition.TransitionsForState[0].NextState); connectedStates.Remove(transition.TransitionsForState[0].NextState); for (int i = 0; i < transition.TransitionsForState.Count; i++) { state.Transitions.Remove(transition.TransitionsForState[i]); UnityEngine.Object.DestroyImmediate(transition.TransitionsForState[i], true); } UnityEngine.Object.DestroyImmediate(transition, true); }
public override void OnInspectorGUI() { TransitionDataHolder transitionData = (TransitionDataHolder)target; GUILayout.Label("Transition to: " + transitionData.TransitionsForState[0].NextState.StateName); for (int i = 0; i < transitionData.TransitionsForState.Count; i++) { // Get the decisions array SerializedObject obj = new UnityEditor.SerializedObject(transitionData.TransitionsForState[i]); SerializedProperty decisions = obj.FindProperty("decisions"); // Display array and edit it EditorGUILayout.PropertyField(decisions, true); obj.ApplyModifiedProperties(); // Create button to remove transitions if (GUILayout.Button("Remove this transition")) { // If there is more than one transition, remove only the single transition // If there is only one transition, remove the transition and destroy the state connection if (transitionData.TransitionsForState.Count > 1) { if (transitionData.RemoveIndividualAction != null) { transitionData.RemoveIndividualAction(transitionData.TransitionsForState[i], transitionData); } } else { if (transitionData.RemoveAction != null) { transitionData.RemoveAction(transitionData); } } } } }
/// <summary> /// If a transition is clicked /// </summary> /// <param name="transitions"></param> private void OnTransitionClicked(TransitionDataHolder transitions) { Selection.activeObject = transitions; subComponentEventOccured = true; }
/// <summary> /// Used to remove transition to a state from the transition data holder inspector /// </summary> /// <param name="transition"></param> private void RemoveTransitionFromInspector(Transition transition, TransitionDataHolder transitionData) { state.Transitions.Remove(transition); transitionData.TransitionsForState.Remove(transition); }