예제 #1
0
 public void AddParallelChild(HSMState <TState, TTrigger> child)
 {
     if (ContainsImmediateChildState(child.StateId) == false)
     {
         parallelChilds.Add(child);
         child.AddParent(this);
     }
 }
예제 #2
0
    public void RemoveParallelChild(TState stateId)
    {
        HSMState <TState, TTrigger> toRemove = GetImmediateChildState(stateId);

        if (parallelChilds.Remove(toRemove))
        {
            toRemove.RemoveParent(this);
        }
    }
예제 #3
0
파일: HSM.cs 프로젝트: AdrienMarcenat/LD42
    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);
    }
예제 #4
0
    public void RemoveChild(TState stateId)
    {
        HSMState <TState, TTrigger> toRemove = GetImmediateChildState(stateId);

        if (childs.Remove(toRemove))
        {
            BreakAllTransitionFrom(stateId);
            toRemove.RemoveParent(this);
        }
    }
예제 #5
0
    public HSMState <TState, TTrigger> GetRoot()
    {
        HSMState <TState, TTrigger> current = this;

        while (current.parents.Count > 0)
        {
            current = current.parents[0];
        }

        return(current);
    }
예제 #6
0
    public HSMState <TState, TTrigger> GetNonParallelActiveLeaf()
    {
        HSMState <TState, TTrigger> current = this;

        while (current.ActiveNonParallelChild != null)
        {
            current = current.ActiveNonParallelChild;
        }

        return(current);
    }
예제 #7
0
파일: HSM.cs 프로젝트: AdrienMarcenat/LD42
 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;
     }
 }
예제 #8
0
    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]);
            }
        }
    }
예제 #9
0
    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);
    }
예제 #10
0
    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);
        }
    }
예제 #11
0
파일: HSM.cs 프로젝트: AdrienMarcenat/LD43
    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;
            }
        }
    }
예제 #12
0
    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);
        }
    }
예제 #13
0
    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);
예제 #14
0
 private void OnTriggerReceived(HSMState <Character.State, Character.Trigger> state, Character.Trigger trigger)
 {
     lastTrigger = trigger;
 }
예제 #15
0
 private void RemoveParent(HSMState <TState, TTrigger> parent)
 {
     parents.Remove(parent);
 }
예제 #16
0
    protected virtual HSMState <TState, TTrigger> CreateConcreteHSMState()
    {
        HSMState <TState, TTrigger> state = (HSMState <TState, TTrigger>)Activator.CreateInstance(Type.GetType(stateClassFullName), stateId, debugName);

        return(state);
    }
예제 #17
0
 private void AddParent(HSMState <TState, TTrigger> parent)
 {
     parents.Add(parent);
 }
예제 #18
0
 private void SetActiveParent(HSMState <TState, TTrigger> parent)
 {
     ActiveParent = parent;
 }