123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- //------------------------------------------------------------
- // Game Framework
- // Copyright © 2013-2021 loyalsoft. All rights reserved.
- // Homepage: http://www.game7000.com/
- // Feedback: http://www.game7000.com/
- //------------------------------------------------------------
- using System;
- namespace GameFramework.Fsm
- {
- /// <summary>
- /// 有限状态机状态基类。
- /// </summary>
- /// <typeparam name="T">有限状态机持有者类型。</typeparam>
- public abstract class FsmState<T> where T : class
- {
- /// <summary>
- /// 初始化有限状态机状态基类的新实例。
- /// </summary>
- public FsmState()
- {
- }
- /// <summary>
- /// 有限状态机状态初始化时调用。
- /// </summary>
- /// <param name="fsm">有限状态机引用。</param>
- public virtual void OnInit(IFsm<T> fsm)
- {
- }
- /// <summary>
- /// 有限状态机状态进入时调用。
- /// </summary>
- /// <param name="fsm">有限状态机引用。</param>
- public virtual void OnEnter(IFsm<T> fsm)
- {
- }
- /// <summary>
- /// 有限状态机状态轮询时调用。
- /// </summary>
- /// <param name="fsm">有限状态机引用。</param>
- /// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
- /// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
- public virtual void OnUpdate(IFsm<T> fsm, float elapseSeconds, float realElapseSeconds)
- {
- }
- /// <summary>
- /// 有限状态机状态离开时调用。
- /// </summary>
- /// <param name="fsm">有限状态机引用。</param>
- /// <param name="isShutdown">是否是关闭有限状态机时触发。</param>
- public virtual void OnLeave(IFsm<T> fsm, bool isShutdown)
- {
- }
- /// <summary>
- /// 有限状态机状态销毁时调用。
- /// </summary>
- /// <param name="fsm">有限状态机引用。</param>
- public virtual void OnDestroy(IFsm<T> fsm)
- {
- }
- /// <summary>
- /// 切换当前有限状态机状态。
- /// </summary>
- /// <typeparam name="TState">要切换到的有限状态机状态类型。</typeparam>
- /// <param name="fsm">有限状态机引用。</param>
- public void ChangeState<TState>(IFsm<T> fsm) where TState : FsmState<T>
- {
- Fsm<T> fsmImplement = (Fsm<T>)fsm;
- if (fsmImplement == null)
- {
- throw new GameFrameworkException("FSM is invalid.");
- }
- fsmImplement.ChangeState<TState>();
- }
- /// <summary>
- /// 切换当前有限状态机状态。
- /// </summary>
- /// <param name="fsm">有限状态机引用。</param>
- /// <param name="stateType">要切换到的有限状态机状态类型。</param>
- public void ChangeState(IFsm<T> fsm, Type stateType)
- {
- Fsm<T> fsmImplement = (Fsm<T>)fsm;
- if (fsmImplement == null)
- {
- throw new GameFrameworkException("FSM is invalid.");
- }
- if (stateType == null)
- {
- throw new GameFrameworkException("State type is invalid.");
- }
- if (!typeof(FsmState<T>).IsAssignableFrom(stateType))
- {
- throw new GameFrameworkException(Utility.Text.Format("State type '{0}' is invalid.", stateType.FullName));
- }
- fsmImplement.ChangeState(stateType);
- }
- }
- }
|