• unity之通用FSM有限状态机 —>流程管理的使用(二)


    上图:

     

    流程管理类,其他比较简单,直接继承 FsmState即可

     1 using System;
     2 
     3 /// <summary>
     4 /// 状态枚举
     5 /// </summary>
     6 public enum TestProcedureStateEnum
     7 {
     8     Launch = 0,
     9     CheckVersion = 1,
    10     Preload = 2,
    11     ChangeScene = 3,
    12     LogOn = 4,
    13     SelectRole = 5,
    14     EnterGame = 6,
    15     PVE = 7,
    16     PVP = 8,
    17 }
    18 
    19 public class TestProcedureManager : IDisposable
    20 {
    21     /// <summary>
    22     /// 当前状态机
    23     /// </summary>
    24     public TestFsm<TestProcedureManager> CurrFsm { get; private set; }
    25 
    26     /// <summary>
    27     /// 当前状态机的状态
    28     /// </summary>
    29     public TestFsmState<TestProcedureManager> CurrFsmState { get; private set; }
    30 
    31     /// <summary>
    32     /// 当前状态的枚举
    33     /// </summary>
    34     public TestProcedureStateEnum CurrStateEnum { get; private set; }
    35 
    36     private readonly TestFsmState<TestProcedureManager>[] m_Status = null;
    37     public TestProcedureManager()
    38     {
    39         m_Status = new TestFsmState<TestProcedureManager>[Enum.GetValues(typeof(TestProcedureStateEnum)).Length];
    40     }
    41 
    42     public void Init()
    43     {
    44         m_Status[(int)TestProcedureStateEnum.Launch] = new TestProcedureLaunch();
    45         m_Status[(int)TestProcedureStateEnum.CheckVersion] = new TestProcedureCheckVersion();
    46         m_Status[(int)TestProcedureStateEnum.Preload] = new TestProcedurePreload();
    47         m_Status[(int)TestProcedureStateEnum.ChangeScene] = new TestProcedureChangeScene();
    48         m_Status[(int)TestProcedureStateEnum.LogOn] = new TestProcedureLogOn();
    49         m_Status[(int)TestProcedureStateEnum.SelectRole] = new TestProcedureSelectRole();
    50         m_Status[(int)TestProcedureStateEnum.EnterGame] = new TestProcedureEnterGame();
    51         m_Status[(int)TestProcedureStateEnum.PVE] = new TestProcedurePVE();
    52         m_Status[(int)TestProcedureStateEnum.PVP] = new TestProcedurePVP();
    53         CurrFsm = TestGameEntry.FsmMgr.CreateFsm(this, m_Status);
    54         if (CurrFsm != null)
    55         {
    56             CurrFsmState = CurrFsm.GetState(CurrFsm.CurrState);
    57             CurrStateEnum = (TestProcedureStateEnum)CurrFsm.CurrState;
    58         }
    59     }
    60 
    61     public void ChangeState(TestProcedureStateEnum state)
    62     {
    63         if (CurrFsm != null)
    64         {
    65             CurrFsm.ChangeState((sbyte)state);
    66         }
    67     }
    68 
    69     public void OnUpdate()
    70     {
    71         if (CurrFsm != null)
    72         {
    73             CurrFsm.OnUpdate();
    74         }
    75     }
    76 
    77     public void Dispose()
    78     {
    79         if (CurrFsm != null)
    80         {
    81             CurrFsm.ShutDown();
    82         }
    83     }
    84 
    85 }

    测试用例:

    Q键:进入启动    W键:进入检查更新    E键:进入进入游戏

     1 void Update()
     2     {
     3         if (Input.GetKeyUp(KeyCode.Q))
     4         {
     5             TestGameEntry.ProcedureMgr.ChangeState(TestProcedureStateEnum.Launch);
     6         }
     7 
     8         if (Input.GetKeyUp(KeyCode.W))
     9         {
    10             TestGameEntry.ProcedureMgr.ChangeState(TestProcedureStateEnum.CheckVersion);
    11         }
    12 
    13         if (Input.GetKeyUp(KeyCode.E))
    14         {
    15             TestGameEntry.ProcedureMgr.ChangeState(TestProcedureStateEnum.EnterGame);
    16         }
    17     }

     

    可看到 状态的进入 执行 离开。

     

    是不是感觉像工厂的流水作业一样,逻辑清晰,流程解耦、一目了然。

  • 相关阅读:
    最全的常用正则表达式大全--包括校验数字、字符、一些特殊的需求等【转】
    【转】浏览器“后退”、“前进”或可以这么去监听
    vue单页面title修改
    Vue.js中ref ($refs)用法举例总结
    js 程序执行与顺序实现详解
    $(document).ready和window.onload的区别 【转】
    linq to xml(C#)
    TCP/IP|| 建立连接或终止
    TCP/IP TCP
    TCP/IP DNS
  • 原文地址:https://www.cnblogs.com/zhaolaosan/p/16220252.html
Copyright © 2020-2023  润新知