码迷,mamicode.com
首页 > 其他好文 > 详细

状态机的简单入门

时间:2019-07-31 18:32:10      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:over   nta   状态机   简单   tst   存储   this   override   new   

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

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

状态机的简单入门

标签:over   nta   状态机   简单   tst   存储   this   override   new   

原文地址:https://www.cnblogs.com/ly570/p/11277985.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!