public void AddParallelChild(HSMState <TState, TTrigger> child) { if (ContainsImmediateChildState(child.StateId) == false) { parallelChilds.Add(child); child.AddParent(this); } }
public void RemoveParallelChild(TState stateId) { HSMState <TState, TTrigger> toRemove = GetImmediateChildState(stateId); if (parallelChilds.Remove(toRemove)) { toRemove.RemoveParent(this); } }
private HSMState FindState(StateID stateID) { HSMState state = null; if (!m_StateFactory.TryGetValue(stateID, out state)) { Assert.IsTrue(false, "cannot find state with ID " + stateID); } return(state); }
public void RemoveChild(TState stateId) { HSMState <TState, TTrigger> toRemove = GetImmediateChildState(stateId); if (childs.Remove(toRemove)) { BreakAllTransitionFrom(stateId); toRemove.RemoveParent(this); } }
public HSMState <TState, TTrigger> GetRoot() { HSMState <TState, TTrigger> current = this; while (current.parents.Count > 0) { current = current.parents[0]; } return(current); }
public HSMState <TState, TTrigger> GetNonParallelActiveLeaf() { HSMState <TState, TTrigger> current = this; while (current.ActiveNonParallelChild != null) { current = current.ActiveNonParallelChild; } return(current); }
private void PushState(StateID stateID) { if (stateID != null) { HSMState newState = FindState(stateID); Assert.IsTrue(newState != null, "Cannot find state with ID " + stateID); newState.OnEnter(); m_StateStack.Push(newState); m_IsStackChanged = true; } }
private static void SetInitialStates(Dictionary <HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger>, HSMState <TState, TTrigger> > relationDictionary, HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> baseAsset) { HSMState <TState, TTrigger> currentState = relationDictionary[baseAsset]; if (baseAsset.childs.Length > 0) { currentState.SetInitialState(baseAsset.childs[baseAsset.startStateIndex].stateId); for (int i = 0; i < baseAsset.childs.Length; i++) { SetInitialStates(relationDictionary, baseAsset.childs[i]); } } }
public static HSMState <TState, TTrigger> BuildFromAsset(HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> rootAsset) { var relationDictionary = new Dictionary <HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger>, HSMState <TState, TTrigger> >(); GetUniqueStates(relationDictionary, rootAsset); BuildHierarchy(relationDictionary, rootAsset); BuildTransitions(relationDictionary, rootAsset); SetInitialStates(relationDictionary, rootAsset); HSMState <TState, TTrigger> rootState = relationDictionary[rootAsset]; return(rootState); }
private static void BuildTransitions(Dictionary <HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger>, HSMState <TState, TTrigger> > relationDictionary, HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> baseAsset) { HSMState <TState, TTrigger> currentState = relationDictionary[baseAsset]; for (int j = 0; j < baseAsset.transitions.Length; j++) { HSMTransition <TState, TTrigger> transition = baseAsset.transitions[j].ToHSMTransition(); currentState.MakeChildTransition(transition.stateFrom, transition.trigger, transition.stateTo); } for (int i = 0; i < baseAsset.childs.Length; i++) { HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> currentAssetChild = baseAsset.childs[i]; BuildTransitions(relationDictionary, currentAssetChild); } }
private void ApplyHSMTransitions() { while (m_TransitionQueue.Count != 0) { HSMTransition transition = m_TransitionQueue.Dequeue(); switch (transition.m_Type) { case HSMTransition.EType.Clear: // Don't apply other transition as we completly change the stack m_TransitionQueue.Clear(); ClearStack(); PushState(transition.m_DestinationID); break; case HSMTransition.EType.Siblings: ReplaceState(transition.m_SourceID, transition.m_DestinationID); break; case HSMTransition.EType.Child: HSMState peekState = m_StateStack.Peek(); if (peekState.GetID() == transition.m_SourceID) { PushState(transition.m_DestinationID); } break; case HSMTransition.EType.Exit: ReplaceState(transition.m_SourceID, null); break; case HSMTransition.EType.Top: PushState(transition.m_DestinationID); break; case HSMTransition.EType.None: break; default: Assert.IsTrue(false, "Invalid transition type"); break; } } }
private static void BuildHierarchy(Dictionary <HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger>, HSMState <TState, TTrigger> > relationDictionary, HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> baseAsset) { HSMState <TState, TTrigger> currentState = relationDictionary[baseAsset]; for (int i = 0; i < baseAsset.parallelChilds.Length; i++) { HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> currentAssetChild = baseAsset.parallelChilds[i]; currentState.AddParallelChild(relationDictionary[currentAssetChild]); BuildHierarchy(relationDictionary, currentAssetChild); } for (int i = 0; i < baseAsset.childs.Length; i++) { HSMStateAsset <TConcreteAssetClass, THSMTransitionWrapper, TState, TTrigger> currentAssetChild = baseAsset.childs[i]; currentState.AddChild(relationDictionary[currentAssetChild]); BuildHierarchy(relationDictionary, currentAssetChild); } }
public virtual HSMState <TState, TTrigger> GetImmediateChildState(TState state) { for (int i = 0; i < parallelChilds.Count; i++) { var current = parallelChilds[i]; if (stateIdComparer(current.StateId, state)) { return(current); } } for (int i = 0; i < childs.Count; i++) { HSMState <TState, TTrigger> current = childs[i]; if (stateIdComparer(current.StateId, state)) { return(current); } } return(default);
private void OnTriggerReceived(HSMState <Character.State, Character.Trigger> state, Character.Trigger trigger) { lastTrigger = trigger; }
private void RemoveParent(HSMState <TState, TTrigger> parent) { parents.Remove(parent); }
protected virtual HSMState <TState, TTrigger> CreateConcreteHSMState() { HSMState <TState, TTrigger> state = (HSMState <TState, TTrigger>)Activator.CreateInstance(Type.GetType(stateClassFullName), stateId, debugName); return(state); }
private void AddParent(HSMState <TState, TTrigger> parent) { parents.Add(parent); }
private void SetActiveParent(HSMState <TState, TTrigger> parent) { ActiveParent = parent; }