• unity 状态机 + svn + 码云 上篇


    最近刚找到在实习,忙于公司一个c++ 项目 ,一直想写博客来着,没时间写今天熬夜打算先献上自己前几天自己封装的一个fsm状态机

    话不多说,直接上正题,这篇博客主要是在学校的时候状态机一直使用的是player maker插件或者是自己使用if else (switch  case)来实现自己的状态机

    所谓的状态机不过是一种数据结构,可以遵循一定的顺序的状态循环而已 (PS:自己能力有限,有不对的地方欢迎大家指出)

    public delegate void FsmEvent();
    
    public class MyState<T>
    {
        private T myState;
        public string name;
        public MyState(string name,T state)
        {
            this.name = name;
            myState = state;
        }
    
    
        public Dictionary<T, MyFSMTranslation<T>> TranslationDict = new Dictionary<T, MyFSMTranslation<T>>();
    
     
        public event FsmEvent DoBeforeEntering;
    
        public void DoBeforeEntery()
        {
            if (DoBeforeEntering != null)
            {
                DoBeforeEntering();
            }
            else
            {
                Debug.Log("没有添加事件");
            }
           
        }
    
    
    
        public event FsmEvent DoBeforeLeaving;
    
        public void DoBeforeLeave()
        {
            if (DoBeforeLeaving != null)
            {
                DoBeforeLeaving();
            }
            else
            {
                Debug.Log("没有绑定事件");
            }
           
        }
    
    
        public event FsmEvent Act;
    
        public void DoAct()
        {
            if (Act != null)
            {
                Act();
            }
            else
            {
                Debug.Log("没有绑定事件");
            }
        }
    }


    解释一下自己的代码,FsmEvent是自定义的fsm的事件,MyState<T> 是泛型的状态类,包含了状态和三个事件,分别为第一次进入,一直执行,退出

     1 public class MyFSMTranslation<T>
     2 {
     3     public MyState<T> fromState;
     4     /// <summary>
     5     /// 转换状态的名字
     6     /// </summary>
     7     public string name;
     8     public MyState<T> toState;
     9 
    10     /// <summary>
    11     /// 状态跳转
    12     /// </summary>
    13     /// <param name="fromState"> 当前状态</param>
    14     /// <param name="name"> 状态跳转的名字</param>
    15     /// <param name="toState"> 下一个要进入的状态</param>
    16     public MyFSMTranslation(MyState<T> fromState, MyState<T> toState, string name = null)
    17     {
    18         fromState = fromState;
    19         toState = toState;
    20         name = name;
    21     }
    22 }

    这是一个状态跳转类注释很详细就不解释了

    重点到了

      1 public class FSMS<T>
      2 {
      3 
      4     private T myFsmType;
      5     public T FsmType
      6     { 
      7         get
      8         {
      9             return myFsmType;
     10         }
     11         
     12     }
     13 
     14     public string StateName
     15     {
     16         get
     17         {
     18             return StateDict[myFsmType].name;
     19         }
     20     }
     21 
     22 
     23     // 状态存贮
     24     Dictionary<T, MyState<T>> StateDict = new Dictionary<T, MyState<T>>();
     25 
     26 
     27     /// <summary>
     28     /// 添加状态
     29     /// </summary>
     30     /// <param name="state">State.</param>
     31     public void AddState(T stateType,string name,MyState<T> State)
     32     {
     33         StateDict[stateType] = State;
     34     }
     35 
     36 
     37     /// <summary>
     38     /// 添加跳转
     39     /// </summary>
     40     public void AddTranslation(T fromState, MyState<T> toState,string name)
     41     {
     42         StateDict[fromState].TranslationDict[fromState] = new MyFSMTranslation<T>(StateDict[fromState], toState,name);
     43     }
     44 
     45     public void AddTranslation(T fromState, MyState<T> toState)
     46     {
     47         StateDict[fromState].TranslationDict[fromState] = new MyFSMTranslation<T>(StateDict[fromState], toState);
     48     }
     49 
     50 
     51 
     52     public bool Translate(T nextType)
     53     {
     54         MyState<T> nextstate;
     55         if (StateDict.ContainsKey(nextType))
     56         {
     57             nextstate = StateDict[nextType];
     58         }
     59         else
     60         {
     61             return false;
     62         }
     63         if (StateDict[myFsmType].TranslationDict.ContainsKey(nextType))
     64         {
     65 
     66             //当期状态转换之后执行的函数
     67             //当期状态转换
     68             //下一个状态需要执行的函数
     69             //改变类里面的状态
     70             StateDict[myFsmType].DoBeforeLeave();
     71             myFsmType = nextType;
     72             nextstate.DoBeforeEntery();
     73 
     74         }
     75         else
     76         {
     77             return false;
     78         }
     79 
     80         return true;
     81     }
     82 
     83     /// <summary>
     84     /// 执行当前状态的方法
     85     /// </summary>
     86     public void Carry()
     87     {
     88         MyState<T> nextstate = StateDict[myFsmType];
     89         nextstate.DoAct();
     90     }
     91 
     92 
     93     /// <summary>
     94     /// 启动状态机
     95     /// </summary>
     96     public void Start(T fsmtype)
     97     {
     98         myFsmType = fsmtype;
     99     }
    100 
    101     /// <summary>
    102     /// 清空状态机
    103     /// </summary>
    104     public void Clear()
    105     {
    106         StateDict.Clear();
    107     }
    108     
    109 }

    上面都有注释,就不在解释了,大家感觉有不对的地方欢迎指出

  • 相关阅读:
    ibatis resultMap 结果集映射
    iabtis初探
    struts2获取请求参数的三种方式及传递给JSP参数的方式
    Struts2的运行机制简介
    Spring AOP面向切面编程的实现
    java 单例模式及getInstance的好处
    It is indirectly referenced from required .class files
    AngularJS学习篇(二)
    AngularJS学习篇(一)
    Flex布局语法
  • 原文地址:https://www.cnblogs.com/mawanli/p/5898433.html
Copyright © 2020-2023  润新知