// ------------------------------------------------------------------------------------ #region Transition manipulation // Add animation leading from one node to another. // You can pass existing instance of transition (for example, you need subclass), however, it must not be present anywhere else. // Returns instanced transition, where you can add your conditions etc. // Returns null on failure. public MyStateMachineTransition AddTransition(string startNodeName, string endNodeName, MyStateMachineTransition existingInstance = null) { // nodes are passed through their names because of these checks: var startNode = FindNode(startNodeName); var endNode = FindNode(endNodeName); if (startNode == null || endNode == null) { return(null); } MyStateMachineTransition rtnTransition; if (existingInstance == null) { // autocreate rtnTransition = new MyStateMachineTransition(); } else { // check Debug.Assert(existingInstance.TargetNode == null, "Target node of existing transition must be null."); rtnTransition = existingInstance; } m_transitionIdCounter++; rtnTransition._SetId(m_transitionIdCounter); rtnTransition.TargetNode = endNode; startNode.Transitions.Add(rtnTransition); m_transitions.Add(m_transitionIdCounter, new MyStateMachineTransitionWithStart(startNode, rtnTransition)); return(rtnTransition); }
// Fires change event for all registered instances. private void NotifyCursorChanged(MyStateMachineTransition transition) { if (OnCursorStateChanged != null) { OnCursorStateChanged(transition.Id, Node, StateMachine); } }
protected override void TransitionRemovedInternal(MyStateMachineTransition transition) { // is Incoming edge if (transition.TargetNode == this) { var transitionIndex = InTransitions.IndexOf(transition); m_cursorsFromInEdgesReceived.RemoveAt(transitionIndex); } }
// Performs transition to different state. Fires state change event. public void FollowTransition(MyStateMachineTransition transition) { Debug.Assert(Node.OutTransitions.Contains(transition)); // Manage Nodes cursors set. Node.Cursors.Remove(this); transition.TargetNode.Cursors.Add(this); // Do transition Node = transition.TargetNode; LastTransitionTakenId = transition.Id; NotifyCursorChanged(transition); }
// Performs transition to different state. Fires state change event. public void FollowTransition(MyStateMachineTransition transition) { Debug.Assert(Node.OutTransitions.Contains(transition)); // Manage Nodes cursors set. Node.Cursors.Remove(this); transition.TargetNode.Cursors.Add(this); // Do transition Node = transition.TargetNode; LastTransitionTakenId = transition.Id; NotifyCursorChanged(transition); }
protected override void TransitionAddedInternal(MyStateMachineTransition transition) { // is Incoming edge if (transition.TargetNode == this) { m_cursorsFromInEdgesReceived.Add(false); } else { Debug.Assert(OutTransitions.Count < 2, "Only one output per barrier node intended."); } }
/// <summary> /// Called before Transition remove. /// Override for custom behavior. /// </summary> protected virtual void TransitionRemovedInternal(MyStateMachineTransition transition) { }
// Gets called by state machine when transtion is removed // Leave INTERNAL internal void TransitionRemoved(MyStateMachineTransition transition) { TransitionRemovedInternal(transition); }
// ------------------------------------------------------------------------------------ #region Transition manipulation // Add animation leading from one node to another. // You can pass existing instance of transition (for example, you need subclass), however, it must not be present anywhere else. // Returns instanced transition, where you can add your conditions etc. // Returns null on failure. public MyStateMachineTransition AddTransition(string startNodeName, string endNodeName, MyStateMachineTransition existingInstance = null) { // nodes are passed through their names because of these checks: var startNode = FindNode(startNodeName); var endNode = FindNode(endNodeName); if (startNode == null || endNode == null) return null; MyStateMachineTransition rtnTransition; if (existingInstance == null) { // autocreate rtnTransition = new MyStateMachineTransition(); } else { // check Debug.Assert(existingInstance.TargetNode == null, "Target node of existing transition must be null."); rtnTransition = existingInstance; } m_transitionIdCounter++; rtnTransition._SetId(m_transitionIdCounter); rtnTransition.TargetNode = endNode; startNode.Transitions.Add(rtnTransition); m_transitions.Add(m_transitionIdCounter, new MyStateMachineTransitionWithStart(startNode, rtnTransition)); return rtnTransition; }
/// <summary> /// Called before Transition remove. /// Override for custom behavior. /// </summary> protected virtual void TransitionRemovedInternal(MyStateMachineTransition transition) { }
// Gets called by state machine when transtion is removed // Leave INTERNAL internal void TransitionRemoved(MyStateMachineTransition transition) { TransitionRemovedInternal(transition); }
/// <summary> /// Full constructor. /// </summary> public MyStateMachineTransitionWithStart(MyStateMachineNode startNode, MyStateMachineTransition transition) { StartNode = startNode; Transition = transition; }
/// <summary> /// Full constructor. /// </summary> public MyStateMachineTransitionWithStart(MyStateMachineNode startNode, MyStateMachineTransition transition) { StartNode = startNode; Transition = transition; }
// Fires change event for all registered instances. private void NotifyCursorChanged(MyStateMachineTransition transition) { if(OnCursorStateChanged != null) OnCursorStateChanged(transition.Id, Node, StateMachine); }