Пример #1
0
        /// <summary>
        /// 执行迁移到指定状态。
        /// </summary>
        /// <param name="state">下一个状态。</param>
        private void TransitTo(FsmState state)
        {
            // 获取下一个状态的服务
            var serviceProviders = GetBookedServices(state, graphServiceProviders);
            var eventListeners   = GetBookedServices(state, graphEventListeners);

            // 停止下一个状态不需要的服务
            if (currServiceProviders != null)
            {
                for (int i = 0; i < currServiceProviders.Count; i++)
                {
                    if (serviceProviders == null || serviceProviders.IndexOf(currServiceProviders[i]) == -1)
                    {
                        currServiceProviders[i].Disable();
                    }
                }
            }

            if (currEventListeners != null)
            {
                for (int i = 0; i < currEventListeners.Count; i++)
                {
                    currEventListeners[i].ResetTrigger(); // 清除所有事件的 Trigger 标记

                    if (eventListeners == null || eventListeners.IndexOf(currEventListeners[i]) == -1)
                    {
                        currEventListeners[i].Disable();
                    }
                }
            }

            // 停止当前状态
            CurrentState.Stop();

            // 进入新状态
            state.Enter();
            CurrentState = state;

            // 更新当前状态连接数据
            UpdateCurrentConnections();

            // 更新当前状态附加服务数据
            currServiceProviders = serviceProviders;
            serviceProviders     = null;

            currEventListeners = eventListeners;
            eventListeners     = null;

            // 启动当前状态的附加服务
            EnableCurrentServices();
        }
Пример #2
0
        /// <summary>
        /// 启动状态机。
        /// </summary>
        /// <param name="state">初始状态,为 null 时使用默认的入口状态。</param>
        public void Run(FsmState state = null)
        {
            // 如果状态机还没有初始化,则初始化一下
            Init();

            if (IsRunning)
            {
                Debug.LogFormat("The FsmSystem is already running: {0}", name);
                return;
            }

            state = state == null ? entry : state;

            if (state == null)
            {
                Debug.LogErrorFormat("Try to run with a null state: {0}", name);
                return;
            }

            // 进入新状态
            state.Enter();
            CurrentState = state;

            // 更新当前状态数据 - 连接
            UpdateCurrentConnections();

            // 更新当前状态数据 - 附加服务
            currServiceProviders = GetBookedServices(state, graphServiceProviders);
            currEventListeners   = GetBookedServices(state, graphEventListeners);

            // 启动当前状态的附加服务
            EnableCurrentServices();

            UpdateManager.RegisterUpdate(OnUpdate);
            IsRunning = true;
        }