Example #1
0
        // ------------------------------------------------------------------
        // Desc:
        // ------------------------------------------------------------------

        public void CheckConditions()
        {
            // if we are in transtion, don't do anything
            if (inTransition)
            {
                return;
            }

            //
            for (int i = 0; i < currentStates.Count; ++i)
            {
                State activeChild = currentStates[i];

                // NOTE: if parent transition triggerred, the child should always execute onExit transition
                for (int j = 0; j < activeChild.transitionList.Count; ++j)
                {
                    Transition transition = activeChild.transitionList[j];
                    if (transition.onCheck())
                    {
                        // exit states
                        transition.source.parent.ExitStates(transition.target, transition.source);      // TODO: 这里应该不进行++i

                        // route happends here
                        if (transition.target.mode == Mode.Exclusive &&
                            transition.target.children.Count > 0)
                        {
                            State firstChild = transition.target.children[0];
                            if (firstChild.isRoute)
                            {
                                firstChild.CheckRoute(transition);
                            }
                        }

                        // transition on start
                        if (transition.onStart != null)
                        {
                            transition.onStart();
                        }

                        // set current transition
                        currentTransition = transition;
                        inTransition      = true;

                        break;
                    }
                }

                if (inTransition == false)
                {
                    activeChild.CheckConditions();
                }
            }
        }
Example #2
0
        // ------------------------------------------------------------------
        // Desc:
        // ------------------------------------------------------------------

        public void CheckRoute(Transition _parentTransition)
        {
            bool hasTransition = false;

            for (int i = 0; i < transitionList.Count; ++i)
            {
                Transition transition = transitionList[i];
                transition.Bridge(_parentTransition);

                if (transition.onCheck())
                {
                    parent.initState = transition.target;
                    hasTransition    = true;
                    break;
                }
            }
            if (hasTransition == false)
            {
                Debug.LogError("FSM error: route state must have transition");
            }
        }