• 状态机的简单入门


    //移动状态
    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();
    }
    }

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

  • 相关阅读:
    一个C++的unit库
    一篇关于如何组织unit tests的文章,很有趣
    web开发者的checklist
    用了story point就一定agile了吗?
    C#中如何用Windows Management Instrumentation (WMI)得到系统信息
    Windows下C++的同步机制的演变
    Sysinternals自动更新的工具SyncTools
    什么情况下要替换C++自带的new和delete
    VS2012插件:可视化TFS代码版本历史
    Quattro发布自助手机广告产品
  • 原文地址:https://www.cnblogs.com/ly570/p/11277985.html
Copyright © 2020-2023  润新知