/// <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(); }
/// <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; }