Unity【设计模式】- 构建FSM有限状态机

举报
CoderZ1010 发表于 2022/09/25 06:50:19 2022/09/25
【摘要】 FSM(Finite State Machine)有限状态机,广泛应用于状态类、流程类、步骤类程序的处理。 1. 定义状态接口、抽象状态类,状态包含的五个基本行为:         · OnInitialization 状态初始化事件 &nb...

FSM(Finite State Machine)有限状态机,广泛应用于状态类、流程类、步骤类程序的处理。

1. 定义状态接口、抽象状态类,状态包含的五个基本行为:

        · OnInitialization 状态初始化事件

        · OnEnter 状态进入事件

        · OnStay 状态停留事件

        · OnExit 状态退出事件

        · OnTermination 状态终止事件


  
  1. using System;
  2. namespace SK.Framework
  3. {
  4. /// <summary>
  5. /// 状态接口
  6. /// </summary>
  7. public interface IState
  8. {
  9. /// <summary>
  10. /// 状态名称
  11. /// </summary>
  12. string Name { get; set; }
  13. /// <summary>
  14. /// 状态初始化事件
  15. /// </summary>
  16. void OnInitialization();
  17. /// <summary>
  18. /// 状态进入事件
  19. /// </summary>
  20. void OnEnter();
  21. /// <summary>
  22. /// 状态停留事件(Update)
  23. /// </summary>
  24. void OnStay();
  25. /// <summary>
  26. /// 状态退出事件
  27. /// </summary>
  28. void OnExit();
  29. /// <summary>
  30. /// 状态终止事件
  31. /// </summary>
  32. void OnTermination();
  33. /// <summary>
  34. /// 状态切换条件
  35. /// </summary>
  36. /// <param name="predicate">切换条件</param>
  37. /// <param name="targetStateName">目标状态名称</param>
  38. void SwitchWhen(Func<bool> predicate, string targetStateName);
  39. }
  40. }

  
  1. using System;
  2. namespace SK.Framework
  3. {
  4. /// <summary>
  5. /// 抽象状态类
  6. /// </summary>
  7. public class State : IState
  8. {
  9. /// <summary>
  10. /// 状态名称
  11. /// </summary>
  12. public string Name { get; set; }
  13. /// <summary>
  14. /// 所属状态机
  15. /// </summary>
  16. public StateMachine machine;
  17. /// <summary>
  18. /// 状态初始化事件
  19. /// </summary>
  20. public Action onInitialization;
  21. /// <summary>
  22. /// 状态进入事件
  23. /// </summary>
  24. public Action onEnter;
  25. /// <summary>
  26. /// 状态停留事件
  27. /// </summary>
  28. public Action onStay;
  29. /// <summary>
  30. /// 状态退出事件
  31. /// </summary>
  32. public Action onExit;
  33. /// <summary>
  34. /// 状态终止事件
  35. /// </summary>
  36. public Action onTermination;
  37. /// <summary>
  38. /// 状态初始化事件
  39. /// </summary>
  40. public virtual void OnInitialization()
  41. {
  42. onInitialization?.Invoke();
  43. }
  44. /// <summary>
  45. /// 状态进入事件
  46. /// </summary>
  47. public virtual void OnEnter()
  48. {
  49. onEnter?.Invoke();
  50. }
  51. /// <summary>
  52. /// 状态停留事件
  53. /// </summary>
  54. public virtual void OnStay()
  55. {
  56. onStay?.Invoke();
  57. }
  58. /// <summary>
  59. /// 状态退出事件
  60. /// </summary>
  61. public virtual void OnExit()
  62. {
  63. onExit?.Invoke();
  64. }
  65. /// <summary>
  66. /// 状态终止事件
  67. /// </summary>
  68. public virtual void OnTermination()
  69. {
  70. onTermination?.Invoke();
  71. }
  72. /// <summary>
  73. /// 设置状态切换条件
  74. /// </summary>
  75. /// <param name="predicate">切换条件</param>
  76. /// <param name="targetStateName">目标状态名称</param>
  77. public void SwitchWhen(Func<bool> predicate, string targetStateName)
  78. {
  79. machine.SwitchWhen(predicate, Name, targetStateName);
  80. }
  81. }
  82. }

SwitchWhen函数用于为该状态切换到其他指定状态添加切换条件,当条件满足时,状态机会自动切换到目标状态。

2. 定义状态机类,状态机包含的基本行为:

        · Add 添加状态

        · Remove 移除状态

        · Switch 切换状态


  
  1. using System;
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. namespace SK.Framework
  5. {
  6. /// <summary>
  7. /// 状态机
  8. /// </summary>
  9. public class StateMachine
  10. {
  11. //状态列表 存储状态机内所有状态
  12. protected readonly List<IState> states = new List<IState>();
  13. //状态切换条件列表
  14. protected List<StateSwitchCondition> conditions = new List<StateSwitchCondition>();
  15. /// <summary>
  16. /// 状态机名称
  17. /// </summary>
  18. public string Name { get; set; }
  19. /// <summary>
  20. /// 当前状态
  21. /// </summary>
  22. public IState CurrentState { get; protected set; }
  23. /// <summary>
  24. /// 添加状态
  25. /// </summary>
  26. /// <param name="state">状态</param>
  27. /// <returns>添加成功返回true 否则返回false</returns>
  28. public bool Add(IState state)
  29. {
  30. //判断是否已经存在
  31. if (!states.Contains(state))
  32. {
  33. //判断是否存在同名状态
  34. if (states.Find(m => m.Name == state.Name) == null)
  35. {
  36. //存储到列表
  37. states.Add(state);
  38. //执行状态初始化事件
  39. state.OnInitialization();
  40. return true;
  41. }
  42. }
  43. return false;
  44. }
  45. /// <summary>
  46. /// 添加状态
  47. /// </summary>
  48. /// <typeparam name="T">状态类型</typeparam>
  49. /// <param name="stateName">状态命名</param>
  50. /// <returns>添加成功返回true 否则返回false</returns>
  51. public bool Add<T>(string stateName = null) where T : IState, new()
  52. {
  53. Type type = typeof(T);
  54. T t = (T)Activator.CreateInstance(type);
  55. t.Name = string.IsNullOrEmpty(stateName) ? type.Name : stateName;
  56. return Add(t);
  57. }
  58. /// <summary>
  59. /// 移除状态
  60. /// </summary>
  61. /// <param name="state">状态</param>
  62. /// <returns>移除成功返回true 否则返回false</returns>
  63. public bool Remove(IState state)
  64. {
  65. //判断是否存在
  66. if (states.Contains(state))
  67. {
  68. //如果要移除的状态为当前状态 首先执行当前状态退出事件
  69. if (CurrentState == state)
  70. {
  71. CurrentState.OnExit();
  72. CurrentState = null;
  73. }
  74. //执行状态终止事件
  75. state.OnTermination();
  76. return states.Remove(state);
  77. }
  78. return false;
  79. }
  80. /// <summary>
  81. /// 移除状态
  82. /// </summary>
  83. /// <param name="stateName">状态名称</param>
  84. /// <returns>移除成功返回true 否则返回false</returns>
  85. public bool Remove(string stateName)
  86. {
  87. var targetIndex = states.FindIndex(m => m.Name == stateName);
  88. if (targetIndex != -1)
  89. {
  90. var targetState = states[targetIndex];
  91. if (CurrentState == targetState)
  92. {
  93. CurrentState.OnExit();
  94. CurrentState = null;
  95. }
  96. targetState.OnTermination();
  97. return states.Remove(targetState);
  98. }
  99. return false;
  100. }
  101. /// <summary>
  102. /// 移除状态
  103. /// </summary>
  104. /// <typeparam name="T">状态类型</typeparam>
  105. /// <returns>移除成返回true 否则返回false</returns>
  106. public bool Remove<T>() where T : IState
  107. {
  108. return Remove(typeof(T).Name);
  109. }
  110. /// <summary>
  111. /// 切换状态
  112. /// </summary>
  113. /// <param name="state">状态</param>
  114. /// <returns>切换成功返回true 否则返回false</returns>
  115. public bool Switch(IState state)
  116. {
  117. //如果当前状态已经是切换的目标状态 无需切换 返回false
  118. if (CurrentState == state) return false;
  119. //当前状态不为空则执行状态退出事件
  120. CurrentState?.OnExit();
  121. //判断切换的目标状态是否存在于列表中
  122. if (!states.Contains(state)) return false;
  123. //更新当前状态
  124. CurrentState = state;
  125. //更新后 当前状态不为空则执行状态进入事件
  126. CurrentState?.OnEnter();
  127. return true;
  128. }
  129. /// <summary>
  130. /// 切换状态
  131. /// </summary>
  132. /// <param name="stateName">状态名称</param>
  133. /// <returns>切换成功返回true 否则返回false</returns>
  134. public bool Switch(string stateName)
  135. {
  136. //根据状态名称在列表中查询
  137. var targetState = states.Find(m => m.Name == stateName);
  138. return Switch(targetState);
  139. }
  140. /// <summary>
  141. /// 切换状态
  142. /// </summary>
  143. /// <typeparam name="T">状态类型</typeparam>
  144. /// <returns>切换成返回true 否则返回false</returns>
  145. public bool Switch<T>() where T : IState
  146. {
  147. return Switch(typeof(T).Name);
  148. }
  149. /// <summary>
  150. /// 切换至下一状态
  151. /// </summary>
  152. public void Switch2Next()
  153. {
  154. if (states.Count != 0)
  155. {
  156. //如果当前状态不为空 则根据当前状态找到下一个状态
  157. if (CurrentState != null)
  158. {
  159. int index = states.IndexOf(CurrentState);
  160. //当前状态的索引值+1后若小于列表中的数量 则下一状态的索引为index+1
  161. //否则表示当前状态已经是列表中的最后一个 下一状态则回到列表中的第一个状态 索引为0
  162. index = index + 1 < states.Count ? index + 1 : 0;
  163. IState targetState = states[index];
  164. //首先执行当前状态的退出事件 再更新到下一状态
  165. CurrentState.OnExit();
  166. CurrentState = targetState;
  167. }
  168. //当前状态为空 则直接进入列表中的第一个状态
  169. else
  170. {
  171. CurrentState = states[0];
  172. }
  173. //执行状态进入事件
  174. CurrentState.OnEnter();
  175. }
  176. }
  177. /// <summary>
  178. /// 切换至上一状态
  179. /// </summary>
  180. public void Switch2Last()
  181. {
  182. if (states.Count != 0)
  183. {
  184. //如果当前状态不为空 则根据当前状态找到上一个状态
  185. if (CurrentState != null)
  186. {
  187. int index = states.IndexOf(CurrentState);
  188. //当前状态的索引值-1后若大等于0 则下一状态的索引为index-1
  189. //否则表示当前状态是列表中的第一个 上一状态则回到列表中的最后一个状态
  190. index = index - 1 >= 0 ? index - 1 : states.Count - 1;
  191. IState targetState = states[index];
  192. //首先执行当前状态的退出事件 再更新到上一状态
  193. CurrentState.OnExit();
  194. CurrentState = targetState;
  195. }
  196. //当前状态为空 则直接进入列表中的最后一个状态
  197. else
  198. {
  199. CurrentState = states[states.Count - 1];
  200. }
  201. //执行状态进入事件
  202. CurrentState.OnEnter();
  203. }
  204. }
  205. /// <summary>
  206. /// 切换至空状态(退出当前状态)
  207. /// </summary>
  208. public void Switch2Null()
  209. {
  210. if (CurrentState != null)
  211. {
  212. CurrentState.OnExit();
  213. CurrentState = null;
  214. }
  215. }
  216. /// <summary>
  217. /// 获取状态
  218. /// </summary>
  219. /// <typeparam name="T">状态类型</typeparam>
  220. /// <param name="stateName">状态名称</param>
  221. /// <returns>状态</returns>
  222. public T GetState<T>(string stateName) where T : IState
  223. {
  224. return (T)states.Find(m => m.Name == stateName);
  225. }
  226. /// <summary>
  227. /// 获取状态
  228. /// </summary>
  229. /// <typeparam name="T">状态类型</typeparam>
  230. /// <returns>状态</returns>
  231. public T GetState<T>() where T : IState
  232. {
  233. return (T)states.Find(m => m.Name == typeof(T).Name);
  234. }
  235. /// <summary>
  236. /// 状态机刷新事件
  237. /// </summary>
  238. public void OnUpdate()
  239. {
  240. //若当前状态不为空 执行状态停留事件
  241. CurrentState?.OnStay();
  242. //检测所有状态切换条件
  243. for (int i = 0; i < conditions.Count; i++)
  244. {
  245. var condition = conditions[i];
  246. //条件满足
  247. if (condition.predicate.Invoke())
  248. {
  249. //源状态名称为空 表示从任意状态切换至目标状态
  250. if (string.IsNullOrEmpty(condition.sourceStateName))
  251. {
  252. Switch(condition.targetStateName);
  253. }
  254. //源状态名称不为空 表示从指定状态切换至目标状态
  255. else
  256. {
  257. //首先判断当前的状态是否为指定的状态
  258. if (CurrentState.Name == condition.sourceStateName)
  259. {
  260. Switch(condition.targetStateName);
  261. }
  262. }
  263. }
  264. }
  265. }
  266. /// <summary>
  267. /// 状态机销毁事件
  268. /// </summary>
  269. public void OnDestroy()
  270. {
  271. //执行状态机内所有状态的状态终止事件
  272. for (int i = 0; i < states.Count; i++)
  273. {
  274. states[i].OnTermination();
  275. }
  276. }
  277. /// <summary>
  278. /// 设置状态切换条件
  279. /// </summary>
  280. /// <param name="predicate">切换条件</param>
  281. /// <param name="targetStateName">目标状态名称</param>
  282. /// <returns>状态机</returns>
  283. public StateMachine SwitchWhen(Func<bool> predicate, string targetStateName)
  284. {
  285. conditions.Add(new StateSwitchCondition(predicate, null, targetStateName));
  286. return this;
  287. }
  288. /// <summary>
  289. /// 设置状态切换条件
  290. /// </summary>
  291. /// <param name="predicate">切换条件</param>
  292. /// <param name="sourceStateName">源状态名称</param>
  293. /// <param name="targetStateName">目标状态名称</param>
  294. /// <returns></returns>
  295. public StateMachine SwitchWhen(Func<bool> predicate, string sourceStateName, string targetStateName)
  296. {
  297. conditions.Add(new StateSwitchCondition(predicate, sourceStateName, targetStateName));
  298. return this;
  299. }
  300. /// <summary>
  301. /// 构建状态
  302. /// </summary>
  303. /// <typeparam name="T">状态类型</typeparam>
  304. /// <param name="stateName">状态名称</param>
  305. /// <returns>状态构建器</returns>
  306. public StateBuilder<T> Build<T>(string stateName = null) where T : State, new()
  307. {
  308. Type type = typeof(T);
  309. T t = (T)Activator.CreateInstance(type);
  310. t.Name = string.IsNullOrEmpty(stateName) ? type.Name : stateName;
  311. if (states.Find(m => m.Name == t.Name) == null)
  312. {
  313. states.Add(t);
  314. }
  315. return new StateBuilder<T>(t, this);
  316. }
  317. /// <summary>
  318. /// 创建状态机
  319. /// </summary>
  320. /// <param name="stateMachineName">状态机名称</param>
  321. /// <returns>状态机</returns>
  322. public static StateMachine Create(string stateMachineName = null)
  323. {
  324. return FSMMaster.Instance.Create<StateMachine>(stateMachineName);
  325. }
  326. /// <summary>
  327. /// 创建状态机
  328. /// </summary>
  329. /// <typeparam name="T">状态机类型</typeparam>
  330. /// <param name="stateMachineName">状态机名称</param>
  331. /// <returns>状态机</returns>
  332. public static T Create<T>(string stateMachineName = null) where T : StateMachine, new()
  333. {
  334. return FSMMaster.Instance.Create<T>(stateMachineName);
  335. }
  336. /// <summary>
  337. /// 销毁状态机
  338. /// </summary>
  339. /// <param name="stateMachineName">状态机名称</param>
  340. /// <returns>销毁成功返回true 否则返回false</returns>
  341. public static bool Destroy(string stateMachineName)
  342. {
  343. return FSMMaster.Instance.Destroy(stateMachineName);
  344. }
  345. /// <summary>
  346. /// 销毁状态机
  347. /// </summary>
  348. /// <typeparam name="T">状态机类型</typeparam>
  349. /// <returns>销毁成功返回true 否则返回false</returns>
  350. public static bool Destroy<T>() where T : StateMachine
  351. {
  352. return FSMMaster.Instance.Destroy(typeof(T).Name);
  353. }
  354. /// <summary>
  355. /// 获取状态机
  356. /// </summary>
  357. /// <param name="stateMachineName">状态机名称</param>
  358. /// <returns>状态机</returns>
  359. public StateMachine Get(string stateMachineName)
  360. {
  361. return FSMMaster.Instance.GetMachine<StateMachine>(stateMachineName);
  362. }
  363. /// <summary>
  364. /// 获取状态机
  365. /// </summary>
  366. /// <typeparam name="T">状态机类型</typeparam>
  367. /// <param name="stateMachineName">状态机名称</param>
  368. /// <returns>状态机</returns>
  369. public static T Get<T>(string stateMachineName) where T : StateMachine
  370. {
  371. return FSMMaster.Instance.GetMachine<T>(stateMachineName);
  372. }
  373. /// <summary>
  374. /// 获取状态机
  375. /// </summary>
  376. /// <typeparam name="T">状态机类型</typeparam>
  377. /// <returns>状态机</returns>
  378. public static T Get<T>() where T : StateMachine
  379. {
  380. return FSMMaster.Instance.GetMachine<T>(typeof(T).Name);
  381. }
  382. }
  383. }

3. StateSwitchCondition类用于设置状态的切换条件,其包含的字段:

        · predicate 切换条件

        · sourceStateName 源状态名称

        · targetStateName 目标状态名称        

该类用于表示当条件predicate满足时,从状态sourceState切换到targetState目标状态


  
  1. using System;
  2. namespace SK.Framework
  3. {
  4. /// <summary>
  5. /// 状态切换条件
  6. /// </summary>
  7. public class StateSwitchCondition
  8. {
  9. /// <summary>
  10. /// 条件
  11. /// </summary>
  12. public readonly Func<bool> predicate;
  13. /// <summary>
  14. /// 源状态名称
  15. /// </summary>
  16. public readonly string sourceStateName;
  17. /// <summary>
  18. /// 目标状态名称
  19. /// </summary>
  20. public readonly string targetStateName;
  21. /// <summary>
  22. /// 构造函数
  23. /// </summary>
  24. /// <param name="predicate">切换条件</param>
  25. /// <param name="sourceStateName">源状态名称</param>
  26. /// <param name="targetStateName">目标状态名称</param>
  27. public StateSwitchCondition(Func<bool> predicate, string sourceStateName, string targetStateName)
  28. {
  29. this.predicate = predicate;
  30. this.sourceStateName = sourceStateName;
  31. this.targetStateName = targetStateName;
  32. }
  33. }
  34. }

4. 定义管理类,其包含的基本行为:

        · Create 创建状态机

        · Destroy 销毁状态机

        · Get 获取状态机


  
  1. using System;
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. namespace SK.Framework
  5. {
  6. /// <summary>
  7. /// 有限状态机管理器
  8. /// </summary>
  9. public class FSMMaster : MonoBehaviour
  10. {
  11. #region NonPublic Variables
  12. private static FSMMaster instance;
  13. //状态机列表
  14. private List<StateMachine> machines;
  15. #endregion
  16. #region Public Properties
  17. public static FSMMaster Instance
  18. {
  19. get
  20. {
  21. if (instance == null)
  22. {
  23. instance = new GameObject("[SKFramework.FSM]").AddComponent<FSMMaster>();
  24. instance.machines = new List<StateMachine>();
  25. DontDestroyOnLoad(instance);
  26. }
  27. return instance;
  28. }
  29. }
  30. #endregion
  31. #region NonPublic Methods
  32. private void Update()
  33. {
  34. for (int i = 0; i < machines.Count; i++)
  35. {
  36. //更新状态机
  37. machines[i].OnUpdate();
  38. }
  39. }
  40. private void OnDestroy()
  41. {
  42. instance = null;
  43. }
  44. #endregion
  45. #region Public Methods
  46. /// <summary>
  47. /// 创建状态机
  48. /// </summary>
  49. /// <typeparam name="T">状态机类型</typeparam>
  50. /// <param name="stateMachineName">状态机名称</param>
  51. /// <returns>状态机</returns>
  52. public T Create<T>(string stateMachineName = null) where T : StateMachine, new()
  53. {
  54. Type type = typeof(T);
  55. stateMachineName = string.IsNullOrEmpty(stateMachineName) ? type.Name : stateMachineName;
  56. if (machines.Find(m => m.Name == stateMachineName) == null)
  57. {
  58. T machine = (T)Activator.CreateInstance(type);
  59. machine.Name = stateMachineName;
  60. machines.Add(machine);
  61. return machine;
  62. }
  63. return default;
  64. }
  65. /// <summary>
  66. /// 销毁状态机
  67. /// </summary>
  68. /// <param name="stateMachineName">状态机名称</param>
  69. /// <returns>销毁成功返回true 否则返回false</returns>
  70. public bool Destroy(string stateMachineName)
  71. {
  72. var targetMachine = machines.Find(m => m.Name == stateMachineName);
  73. if (targetMachine != null)
  74. {
  75. targetMachine.OnDestroy();
  76. machines.Remove(targetMachine);
  77. return true;
  78. }
  79. return false;
  80. }
  81. /// <summary>
  82. /// 获取状态机
  83. /// </summary>
  84. /// <typeparam name="T">状态机类型</typeparam>
  85. /// <param name="stateMachineName">状态机名称</param>
  86. /// <returns>状态机</returns>
  87. public T GetMachine<T>(string stateMachineName) where T : StateMachine
  88. {
  89. return (T)machines.Find(m => m.Name == stateMachineName);
  90. }
  91. #endregion
  92. }
  93. }

5. StateBuilder类用于构建状态,便于链式编程


  
  1. using System;
  2. namespace SK.Framework
  3. {
  4. /// <summary>
  5. /// 状态构建器
  6. /// </summary>
  7. /// <typeparam name="T">状态类型</typeparam>
  8. public class StateBuilder<T> where T : State, new()
  9. {
  10. //构建的状态
  11. private readonly T state;
  12. //构建的状态所属的状态机
  13. private readonly StateMachine stateMachine;
  14. /// <summary>
  15. /// 构造函数
  16. /// </summary>
  17. /// <param name="state"></param>
  18. /// <param name="stateMachine"></param>
  19. public StateBuilder(T state, StateMachine stateMachine)
  20. {
  21. this.state = state;
  22. this.stateMachine = stateMachine;
  23. }
  24. /// <summary>
  25. /// 设置状态初始化事件
  26. /// </summary>
  27. /// <param name="onInitialization">状态初始化事件</param>
  28. /// <returns>状态构建器</returns>
  29. public StateBuilder<T> OnInitialization(Action<T> onInitialization)
  30. {
  31. state.onInitialization = () => onInitialization(state);
  32. return this;
  33. }
  34. /// <summary>
  35. /// 设置状态进入事件
  36. /// </summary>
  37. /// <param name="onEnter">状态进入事件</param>
  38. /// <returns>状态构建器</returns>
  39. public StateBuilder<T> OnEnter(Action<T> onEnter)
  40. {
  41. state.onEnter = () => onEnter(state);
  42. return this;
  43. }
  44. /// <summary>
  45. /// 设置状态停留事件
  46. /// </summary>
  47. /// <param name="onStay">状态停留事件</param>
  48. /// <returns>状态构建器</returns>
  49. public StateBuilder<T> OnStay(Action<T> onStay)
  50. {
  51. state.onStay = () => onStay(state);
  52. return this;
  53. }
  54. /// <summary>
  55. /// 设置状态退出事件
  56. /// </summary>
  57. /// <param name="onExit">状态退出事件</param>
  58. /// <returns>状态构建器</returns>
  59. public StateBuilder<T> OnExit(Action<T> onExit)
  60. {
  61. state.onExit = () => onExit(state);
  62. return this;
  63. }
  64. /// <summary>
  65. /// 设置状态终止事件
  66. /// </summary>
  67. /// <param name="onTermination">状态终止事件</param>
  68. /// <returns>状态构建器</returns>
  69. public StateBuilder<T> OnTermination(Action<T> onTermination)
  70. {
  71. state.onTermination = () => onTermination(state);
  72. return this;
  73. }
  74. /// <summary>
  75. /// 设置状态切换条件
  76. /// </summary>
  77. /// <param name="predicate">切换条件</param>
  78. /// <param name="targetStateName">目标状态名称</param>
  79. /// <returns>状态构建器</returns>
  80. public StateBuilder<T> SwitchWhen(Func<bool> predicate, string targetStateName)
  81. {
  82. state.SwitchWhen(predicate, targetStateName);
  83. return this;
  84. }
  85. /// <summary>
  86. /// 构建完成
  87. /// </summary>
  88. /// <returns>状态机</returns>
  89. public StateMachine Complete()
  90. {
  91. state.OnInitialization();
  92. return stateMachine;
  93. }
  94. }
  95. }

6. Example 编码示例:


  
  1. using UnityEngine;
  2. using SK.Framework;
  3. public class Foo : MonoBehaviour
  4. {
  5. public class TestState : State
  6. {
  7. public string stringValue;
  8. }
  9. private void Start()
  10. {
  11. //创建状态机
  12. var machine = StateMachine.Create()
  13. //构建状态一
  14. .Build<TestState>("状态一")
  15. //设置状态一初始化事件
  16. .OnInitialization(state => state.stringValue = "A")
  17. //设置状态一进入事件
  18. .OnEnter(state => Debug.Log("进入状态一"))
  19. //设置状态一停留事件
  20. .OnStay(state => Debug.Log("状态一"))
  21. //设置状态一推出事件
  22. .OnExit(state => Debug.Log("退出状态一"))
  23. //设置状态一销毁事件
  24. .OnTermination(state => state.stringValue = null)
  25. //状态一构建完成
  26. .Complete()
  27. //构建状态二
  28. .Build<State>("状态二")
  29. //设置状态二进入事件
  30. .OnEnter(state => Debug.Log("进入状态二"))
  31. //设置状态二停留事件
  32. .OnStay(state => Debug.Log("状态二"))
  33. //设置状态二退出事件
  34. .OnExit((state => Debug.Log("退出状态二")))
  35. //状态二构建完成
  36. .Complete()
  37. //构建状态三
  38. .Build<State>("状态三")
  39. //设置状态三进入事件
  40. .OnEnter(state => Debug.Log("进入状态三"))
  41. //设置状态三停留事件
  42. .OnStay(state => Debug.Log("状态三"))
  43. //设置状态三退出事件
  44. .OnExit((state => Debug.Log("退出状态三")))
  45. //状态三构建完成
  46. .Complete()
  47. //添加状态切换条件 当按下快捷键1时 切换至状态一
  48. .SwitchWhen(() => Input.GetKeyDown(KeyCode.Alpha1), "状态一")
  49. //添加状态切换条件 当按下快捷键2时 切换至状态二
  50. .SwitchWhen(() => Input.GetKeyDown(KeyCode.Alpha2), "状态二")
  51. //添加状态切换条件 当按下快捷键3时 切换至状态三
  52. .SwitchWhen(() => Input.GetKeyDown(KeyCode.Alpha3), "状态三")
  53. //为状态一至状态二添加切换条件:若当前状态为状态一时 按下快捷键4 切换至状态二
  54. .SwitchWhen(() => Input.GetKeyDown(KeyCode.Alpha4), "状态一", "状态二");
  55. //切换到指定状态
  56. machine.Switch("状态一");
  57. //切换到下一状态
  58. machine.Switch2Next();
  59. //切换到上一状态
  60. machine.Switch2Last();
  61. }
  62. }

文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。

原文链接:coderz.blog.csdn.net/article/details/122410779

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。