FsmState.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 loyalsoft. All rights reserved.
  4. // Homepage: http://www.game7000.com/
  5. // Feedback: http://www.game7000.com/
  6. //------------------------------------------------------------
  7. using System;
  8. namespace GameFramework.Fsm
  9. {
  10. /// <summary>
  11. /// 有限状态机状态基类。
  12. /// </summary>
  13. /// <typeparam name="T">有限状态机持有者类型。</typeparam>
  14. public abstract class FsmState<T> where T : class
  15. {
  16. /// <summary>
  17. /// 初始化有限状态机状态基类的新实例。
  18. /// </summary>
  19. public FsmState()
  20. {
  21. }
  22. /// <summary>
  23. /// 有限状态机状态初始化时调用。
  24. /// </summary>
  25. /// <param name="fsm">有限状态机引用。</param>
  26. public virtual void OnInit(IFsm<T> fsm)
  27. {
  28. }
  29. /// <summary>
  30. /// 有限状态机状态进入时调用。
  31. /// </summary>
  32. /// <param name="fsm">有限状态机引用。</param>
  33. public virtual void OnEnter(IFsm<T> fsm)
  34. {
  35. }
  36. /// <summary>
  37. /// 有限状态机状态轮询时调用。
  38. /// </summary>
  39. /// <param name="fsm">有限状态机引用。</param>
  40. /// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
  41. /// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
  42. public virtual void OnUpdate(IFsm<T> fsm, float elapseSeconds, float realElapseSeconds)
  43. {
  44. }
  45. /// <summary>
  46. /// 有限状态机状态离开时调用。
  47. /// </summary>
  48. /// <param name="fsm">有限状态机引用。</param>
  49. /// <param name="isShutdown">是否是关闭有限状态机时触发。</param>
  50. public virtual void OnLeave(IFsm<T> fsm, bool isShutdown)
  51. {
  52. }
  53. /// <summary>
  54. /// 有限状态机状态销毁时调用。
  55. /// </summary>
  56. /// <param name="fsm">有限状态机引用。</param>
  57. public virtual void OnDestroy(IFsm<T> fsm)
  58. {
  59. }
  60. /// <summary>
  61. /// 切换当前有限状态机状态。
  62. /// </summary>
  63. /// <typeparam name="TState">要切换到的有限状态机状态类型。</typeparam>
  64. /// <param name="fsm">有限状态机引用。</param>
  65. public void ChangeState<TState>(IFsm<T> fsm) where TState : FsmState<T>
  66. {
  67. Fsm<T> fsmImplement = (Fsm<T>)fsm;
  68. if (fsmImplement == null)
  69. {
  70. throw new GameFrameworkException("FSM is invalid.");
  71. }
  72. fsmImplement.ChangeState<TState>();
  73. }
  74. /// <summary>
  75. /// 切换当前有限状态机状态。
  76. /// </summary>
  77. /// <param name="fsm">有限状态机引用。</param>
  78. /// <param name="stateType">要切换到的有限状态机状态类型。</param>
  79. public void ChangeState(IFsm<T> fsm, Type stateType)
  80. {
  81. Fsm<T> fsmImplement = (Fsm<T>)fsm;
  82. if (fsmImplement == null)
  83. {
  84. throw new GameFrameworkException("FSM is invalid.");
  85. }
  86. if (stateType == null)
  87. {
  88. throw new GameFrameworkException("State type is invalid.");
  89. }
  90. if (!typeof(FsmState<T>).IsAssignableFrom(stateType))
  91. {
  92. throw new GameFrameworkException(Utility.Text.Format("State type '{0}' is invalid.", stateType.FullName));
  93. }
  94. fsmImplement.ChangeState(stateType);
  95. }
  96. }
  97. }