Unity SKFramework框架(三)、FSM 有限状态机

举报
CoderZ1010 发表于 2022/09/25 05:31:29 2022/09/25
【摘要】 目录 一、State 状态 1.核心属性 2.核心事件 二、StateMachine 状态机 1.核心属性 2.Create 创建状态机 3.Get 获取状态机 4.Destroy 销毁状态机 5.核心行为 (1).添加状态 (2).移除状态 (3).切换状态 (4).获取状态 (5).设置切换条件 三...

目录

一、State 状态

1.核心属性

2.核心事件

二、StateMachine 状态机

1.核心属性

2.Create 创建状态机

3.Get 获取状态机

4.Destroy 销毁状态机

5.核心行为

(1).添加状态

(2).移除状态

(3).切换状态

(4).获取状态

(5).设置切换条件

三、编码示例

1.Simple

2.链式


一、State 状态

1.核心属性


  
  1. /// <summary>
  2. /// 状态名称
  3. /// </summary>
  4. public string Name { get; set; }

2.核心事件

        OnInitialization 状态初始化事件

        OnEnter 状态进入事件

        OnStay 状态停留事件

        OnExit 状态退出事件

        OnTermination 状态终止事件


  
  1. public class ExampleState : State
  2. {
  3. public override void OnInitialization()
  4. {
  5. Debug.Log(string.Format("{0}状态初始化", Name));
  6. }
  7. public override void OnEnter()
  8. {
  9. Debug.Log(string.Format("{0}状态进入", Name));
  10. }
  11. public override void OnStay()
  12. {
  13. Debug.Log(string.Format("{0}状态停留", Name));
  14. }
  15. public override void OnExit()
  16. {
  17. Debug.Log(string.Format("{0}状态退出", Name));
  18. }
  19. public override void OnTermination()
  20. {
  21. Debug.Log(string.Format("{0}状态终止", Name));
  22. }
  23. }

二、StateMachine 状态机

1.核心属性


  
  1. /// <summary>
  2. /// 状态机名称
  3. /// </summary>
  4. public string Name { get; set; }
  5. /// <summary>
  6. /// 当前状态
  7. /// </summary>
  8. public IState CurrentState { get; protected set; }

2.Create 创建状态机


  
  1. using UnityEngine;
  2. using SK.Framework;
  3. public class Example : MonoBehaviour
  4. {
  5. private void Start()
  6. {
  7. var machine = StateMachine.Create("Example");
  8. }
  9. }

传入string类型参数,表示状态机的命名,通过名称可以获取、销毁状态机。

3.Get 获取状态机


  
  1. using UnityEngine;
  2. using SK.Framework;
  3. public class Example : MonoBehaviour
  4. {
  5. private void Start()
  6. {
  7. var machine = StateMachine.Get("Example");
  8. }
  9. }

4.Destroy 销毁状态机


  
  1. private void OnDestroy()
  2. {
  3. StateMachine.Destroy("Example");
  4. }

5.核心行为

(1).添加状态


  
  1. /// <summary>
  2. /// 添加状态
  3. /// </summary>
  4. /// <param name="state">状态</param>
  5. /// <returns>添加成功返回true 否则返回false</returns>
  6. public bool Add(IState state)
  7. /// <summary>
  8. /// 添加状态
  9. /// </summary>
  10. /// <typeparam name="T">状态类型</typeparam>
  11. /// <param name="stateName">状态命名</param>
  12. /// <returns>添加成功返回true 否则返回false</returns>
  13. public bool Add<T>(string stateName = null) where T : IState, new()

除此之外,可以通过Build构建状态实现添加,用于链式编程:


  
  1. /// <summary>
  2. /// 构建状态
  3. /// </summary>
  4. /// <typeparam name="T">状态类型</typeparam>
  5. /// <param name="stateName">状态名称</param>
  6. /// <returns>状态构建器</returns>
  7. public StateBuilder<T> Build<T>(string stateName = null) where T : State, new()

(2).移除状态


  
  1. /// <summary>
  2. /// 移除状态
  3. /// </summary>
  4. /// <param name="state">状态</param>
  5. /// <returns>移除成功返回true 否则返回false</returns>
  6. public bool Remove(IState state)
  7. /// <summary>
  8. /// 移除状态
  9. /// </summary>
  10. /// <param name="stateName">状态名称</param>
  11. /// <returns>移除成功返回true 否则返回false</returns>
  12. public bool Remove(string stateName)
  13. /// <summary>
  14. /// 移除状态
  15. /// </summary>
  16. /// <typeparam name="T">状态类型</typeparam>
  17. /// <returns>移除成返回true 否则返回false</returns>
  18. public bool Remove<T>() where T : IState

(3).切换状态


  
  1. /// <summary>
  2. /// 切换状态
  3. /// </summary>
  4. /// <param name="state">状态</param>
  5. /// <returns>切换成功返回true 否则返回false</returns>
  6. public bool Switch(IState state)
  7. /// <summary>
  8. /// 切换状态
  9. /// </summary>
  10. /// <param name="stateName">状态名称</param>
  11. /// <returns>切换成功返回true 否则返回false</returns>
  12. public bool Switch(string stateName)
  13. /// <summary>
  14. /// 切换状态
  15. /// </summary>
  16. /// <typeparam name="T">状态类型</typeparam>
  17. /// <returns>切换成返回true 否则返回false</returns>
  18. public bool Switch<T>() where T : IState
  19. /// <summary>
  20. /// 切换至下一状态
  21. /// </summary>
  22. public void Switch2Next()
  23. /// <summary>
  24. /// 切换至上一状态
  25. /// </summary>
  26. public void Switch2Last()
  27. /// <summary>
  28. /// 切换至空状态(退出当前状态)
  29. /// </summary>
  30. public void Switch2Null()

(4).获取状态


  
  1. /// <summary>
  2. /// 获取状态
  3. /// </summary>
  4. /// <typeparam name="T">状态类型</typeparam>
  5. /// <param name="stateName">状态名称</param>
  6. /// <returns>状态</returns>
  7. public T GetState<T>(string stateName) where T : IState
  8. /// <summary>
  9. /// 获取状态
  10. /// </summary>
  11. /// <typeparam name="T">状态类型</typeparam>
  12. /// <returns>状态</returns>
  13. public T GetState<T>() where T : IState

(5).设置切换条件


  
  1. /// <summary>
  2. /// 设置状态切换条件
  3. /// </summary>
  4. /// <param name="predicate">切换条件</param>
  5. /// <param name="targetStateName">目标状态名称</param>
  6. /// <returns>状态机</returns>
  7. public StateMachine SwitchWhen(Func<bool> predicate, string targetStateName)
  8. /// <summary>
  9. /// 设置状态切换条件
  10. /// </summary>
  11. /// <param name="predicate">切换条件</param>
  12. /// <param name="sourceStateName">源状态名称</param>
  13. /// <param name="targetStateName">目标状态名称</param>
  14. /// <returns></returns>
  15. public StateMachine SwitchWhen(Func<bool> predicate, string sourceStateName, string targetStateName)

三、编码示例

1.Simple


  
  1. using UnityEngine;
  2. using SK.Framework;
  3. public class Example : MonoBehaviour
  4. {
  5. public class ExampleState : State
  6. {
  7. public override void OnInitialization()
  8. {
  9. Debug.Log(string.Format("{0}状态初始化", Name));
  10. }
  11. public override void OnEnter()
  12. {
  13. Debug.Log(string.Format("{0}状态进入", Name));
  14. }
  15. public override void OnStay()
  16. {
  17. Debug.Log(string.Format("{0}状态停留", Name));
  18. }
  19. public override void OnExit()
  20. {
  21. Debug.Log(string.Format("{0}状态退出", Name));
  22. }
  23. public override void OnTermination()
  24. {
  25. Debug.Log(string.Format("{0}状态终止", Name));
  26. }
  27. }
  28. private void Start()
  29. {
  30. var machine = StateMachine.Create("示例状态机");
  31. machine.Add(new ExampleState() { Name = "State1" });
  32. machine.Add<State>("State2");
  33. machine.Add<State>("State3");
  34. machine.Switch("State2");
  35. machine.Switch2Next();
  36. machine.Switch2Last();
  37. machine.Switch2Null();
  38. machine.SwitchWhen(() => Input.GetKeyDown(KeyCode.Alpha1), "State1");
  39. machine.SwitchWhen(() => Input.GetKeyDown(KeyCode.Alpha2), "State2");
  40. machine.SwitchWhen(() => Input.GetKeyDown(KeyCode.Alpha3), "State3");
  41. }
  42. }

2.链式


  
  1. using UnityEngine;
  2. using SK.Framework;
  3. public class Example: 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/124760502

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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