zoukankan      html  css  js  c++  java
  • 状态机的简单入门

    //移动状态
    public class MoveState : StateObject
    {
    public MoveState(StateManger state):base(state)
    {

    }
    public override void EnterState()
    {
    Debug.Log("进入移动状态");
    }

    public override void ExiState()
    {
    Debug.Log("离开移动状态");
    }

    public override void UpdateState()
    {
    Debug.Log("进入移动更新状态");
    if (Input.GetKey(KeyCode.D))
    {
    state.ChangeState("Die");
    }
    if (Input.GetKey(KeyCode.I))
    {
    state.ChangeState("Idle");
    }
    }
    }
    //死亡状态
    public class DieState : StateObject
    {
    public DieState(StateManger state) : base(state)
    {

    }
    public override void EnterState()
    {
    Debug.Log("进入死亡状态");
    }

    public override void ExiState()
    {
    Debug.Log("离开死亡状态");
    }

    public override void UpdateState()
    {
    Debug.Log("进入死亡更新状态");

    if (Input.GetKey(KeyCode.I))
    {
    state.ChangeState("Idle");
    }
    }
    }
    public class StateManger {
    //字典存储状态
    Dictionary<string, StateObject> dic = new Dictionary<string, StateObject>();
    //当前状态
    StateObject currentstate;
    //注册状态
    public void Region(string statename,StateObject state)
    {
    //判断字典中是否存在这个键
    if (!dic.ContainsKey(statename))
    {
    dic.Add(statename,state);
    }
    }
    //设置默认状态
    public void SetDefat(string statename)
    {
    //判断字典中是否存在这个状态
    if (dic.ContainsKey(statename))
    {
    //存在就赋值给currentstate
    currentstate = dic[statename];
    //调用当前状态的进入(EnterState)方法
    currentstate.EnterState();
    }
    }
    //改变状态
    public void ChangeState(string statename)
    {
    //判断字典中是否存在这个状态
    if (dic.ContainsKey(statename))
    {
    //当前状态是否为空
    if (currentstate!=null)
    {
    //调用上一个状态的离开方法
    currentstate.ExiState();
    //把取到的状态赋值给currentstate
    currentstate = dic[statename];
    //调用取到状态的进入方法
    currentstate.EnterState();
    }
    }
    }
    //更新状态
    public void UpdateState()
    {
    Debug.Log("更新状态");
    if (currentstate!=null)
    {
    //当前状态的UpdateState方法
    currentstate.UpdateState();
    }
    }
    }
    public class FMSC : MonoBehaviour {
    StateManger sm = new StateManger();
    // Use this for initialization
    void Start () {
    //注册站着的方法
    sm.Region("Idle",new IdleState(sm));
    //注册死亡的方法
    sm.Region("Die",new DieState(sm));
    //注册移动的方法
    sm.Region("Move",new MoveState(sm));
    //设置默认状态
    sm.SetDefat("Idle");
    }

    // Update is called once per frame
    void Update () {
    //持续调用当前状态的UpdateState方法
    sm.UpdateState();
    }
    }

    --------------------- 

  • 相关阅读:
    在 Anaconda下解决国内安装tensorflow等下载慢和中断,出错,异常问题的一点思路
    关于指针和结构体的一点教训
    ARM cortexM4中断优先级的一点理解。
    ubuntu16下的/etc/resolv.conf重置的解决方案
    linux安装dpkg安装缺少依赖项的解决
    莲藕的简单凉菜制作总结
    单片机一种简便的printf调试方案。
    usart下位机输出使用printf的格式化技巧
    关于xp操作系统下使用VC6++编写的上位机软件在win10中运行的问题
    百度面试两板斧:手写算法问基础
  • 原文地址:https://www.cnblogs.com/ly570/p/11277985.html
Copyright © 2011-2022 走看看