您的位置:首页 > 其它

简单的FSM有限状态机

2017-12-31 21:45 344 查看
我从网上看了一些关于FSM有限状态机的视屏,然后自己总结了一下,在这里介绍一个大概的有限状态机的思想,写文案什么的真是不太擅长,大家凑活看吧~
有限状态机到底是什么呢?我们为什么要写有线状态机呢?其实百度百科中的解释就很全面,然后我就来根据我理解,举个例子把
比如说一个角色现在有Idle,Run,Attack1,Attack2,Attack3五种状态那么这是后要是用状态机去控制的话,现在只是五种状态,但是将来要是有很多个状态了,代码量就会非常大,非常繁琐,所以这个时候我们就需要一个状态管理器去管理这些状态,也就是我们所说的FSM
StateBase脚本    此脚本作为状态的基类,不继承也不挂载

public abstract class StateBase {
// 表示每个状态所影响的那个对象
public Transform transform = null;
public StateBase (Transform transfrom)
{
this.transform = transfrom;
}
public abstract void OnEnter();
public abstract void OnUpdate();
public abstract void OnExit();
}
StateMgr脚本    此脚本用来管理状态,不继承也不挂载
public class StateMgr {
// 存放人物所能拥有的所有状态
private List<StateBase> mStateList = new List<StateBase>();
// 人物所处的状态
public StateBase mCurrentState = null;
// 存入状态
public void AddState(StateBase state)
{
// list中不存在当前这个状态
if (!mStateList.Contains(state))
{
mStateList.Add(state);
if (mStateList.Count==1)
{
mCurrentState = state;
}
}
}
// 移除状态
public void RemoveState(StateBase state)
{
if (!mStateList.Contains(state))
{
mStateList.Remove(state);
}
}
// 切换状态
public void ChangeState(Type state=null)
{
foreach (StateBase s in mStateList)
{
if (s.GetType()==state)
{
if (mCurrentState!=null)
{
mCurrentState.OnExit();
}
mCurrentState = s ;
mCurrentState.OnEnter();
}
}
}
public void Update()
{
mCurrentState.OnUpdate();
}
}

Idle脚本    继承StateBase
public class Idle : StateBase {
//  构造方法继承
public Idle(Transform transform) : base(transform)
{
}
#region
public override void OnEnter()
{
this.transform.GetComponent<Animator>().SetBool("Idle", true);
}
public override void OnUpdate()
{
}
public override void OnExit()
{
this.transform.GetComponent<Animator>().SetBool("Idle", false);
}
#endregion
}

public class Run : StateBase {
//  构造方法继承
public Run(Transform transform) : base(transform)
{
}
#region
public override void OnEnter()
{
this.transform.GetComponent<Animator>().SetBool("Run", true);
}
public override void OnUpdate()
{
transform.position += transform.forward * 3f * Time.deltaTime;
}
public override void OnExit()
{
this.transform.GetComponent<Animator>().SetBool("Run", false);
}
#endregion
}
public class Attack1 : StateBase {
//  构造方法继承
public Attack1(Transform transform) : base(transform)
{
}
#region
Animator m_ant;
public override void OnEnter()
{
m_ant= this.transform.GetComponent<Animator>();
m_ant.SetBool("Attack1", true);
}
public override void OnUpdate()
{
AnimatorStateInfo info = m_ant.GetCurrentAnimatorStateInfo(0);
if (info.IsName("Atk1") && info.normalizedTime > 1.0f)
{
//  回到Idle
transform.GetComponent<Role_YoyoCtl>().m_stateMgr.ChangeState(typeof(Idle));
}
}
public override void OnExit()
{
this.transform.GetComponent<Animator>().SetBool("Attack1", false);
}
#endregion
}
public class Attack2 : StateBase {
//  构造方法继承
public Attack2(Transform transform) : base(transform)
{
}
#region
Animator m_ant;
public override void OnEnter()
{
m_ant= this.transform.GetComponent<Animator>();
m_ant.SetBool("Attack2", true);
}
public override void OnUpdate()
{
AnimatorStateInfo info = m_ant.GetCurrentAnimatorStateInfo(0);
if (info.IsName("Atk2") &&info.normalizedTime>1.0f)
{
//  回到Idle
transfo
8df1
rm.GetComponent<Role_YoyoCtl>().m_stateMgr.ChangeState(typeof(Idle));
}
}
public override void OnExit()
{
this.transform.GetComponent<Animator>().SetBool("Attack2", false);
}
#endregion
}
public class Attack3 : StateBase {
//  构造方法继承
public Attack3(Transform transform) : base(transform)
{
}
#region
Animator m_ant;
public override void OnEnter()
{
m_ant= this.transform.GetComponent<Animator>();
m_ant.SetBool("Attack3", true);
}
public override void OnUpdate()
{
AnimatorStateInfo info = m_ant.GetCurrentAnimatorStateInfo(0);
if (info.IsName("Atk3") &&info.normalizedTime>1.0f)
{
//  回到Idle
transform.GetComponent<Role_YoyoCtl>().m_stateMgr.ChangeState(typeof(Idle));
}
}
public override void OnExit()
{
this.transform.GetComponent<Animator>().SetBool("Attack3", false);
}
#endregion
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: