using System; namespace TEngine { /// /// 有限状态机状态基类。 /// /// 有限状态机持有者类型。 public abstract class FsmState where T : class { /// /// 初始化有限状态机状态基类的新实例。 /// public FsmState() { } /// /// 有限状态机状态初始化时调用。 /// /// 有限状态机引用。 protected internal virtual void OnInit(IFsm fsm) { } /// /// 有限状态机状态进入时调用。 /// /// 有限状态机引用。 protected internal virtual void OnEnter(IFsm fsm) { } /// /// 有限状态机状态轮询时调用。 /// /// 有限状态机引用。 /// 逻辑流逝时间,以秒为单位。 /// 真实流逝时间,以秒为单位。 protected internal virtual void OnUpdate(IFsm fsm, float elapseSeconds, float realElapseSeconds) { } /// /// 有限状态机状态离开时调用。 /// /// 有限状态机引用。 /// 是否是关闭有限状态机时触发。 protected internal virtual void OnLeave(IFsm fsm, bool isShutdown) { } /// /// 有限状态机状态销毁时调用。 /// /// 有限状态机引用。 protected internal virtual void OnDestroy(IFsm fsm) { } /// /// 切换当前有限状态机状态。 /// /// 要切换到的有限状态机状态类型。 /// 有限状态机引用。 protected void ChangeState(IFsm fsm) where TState : FsmState { Fsm fsmImplement = (Fsm)fsm; if (fsmImplement == null) { throw new GameFrameworkException("FSM is invalid."); } fsmImplement.ChangeState(); } /// /// 切换当前有限状态机状态。 /// /// 有限状态机引用。 /// 要切换到的有限状态机状态类型。 protected void ChangeState(IFsm fsm, Type stateType) { Fsm fsmImplement = (Fsm)fsm; if (fsmImplement == null) { throw new GameFrameworkException("FSM is invalid."); } if (stateType == null) { throw new GameFrameworkException("State type is invalid."); } if (!typeof(FsmState).IsAssignableFrom(stateType)) { throw new GameFrameworkException(Utility.Text.Format("State type '{0}' is invalid.", stateType.FullName)); } fsmImplement.ChangeState(stateType); } } }