简单的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
有限状态机到底是什么呢?我们为什么要写有线状态机呢?其实百度百科中的解释就很全面,然后我就来根据我理解,举个例子把
比如说一个角色现在有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 }
相关文章推荐
- [python]有限状态机(FSM)简单实现
- [python]有限状态机(FSM)简单实现
- [python]有限状态机(FSM)简单实现
- 设计模式_实现简单的有限状态机(FSM)
- 一个简单确有用的有限状态机(FSM) in c++
- 转载:[python]有限状态机(FSM)简单实现
- [python]有限状态机(FSM)简单实现
- Unity3D-FSM有限状态机的简单设计
- 简单有限状态机(FSM)
- Unity3D-FSM有限状态机的简单设计
- 简单有限状态机(FSM)的实现
- [python]有限状态机(FSM)简单实现
- U3D-FSM有限状态机的简单设计
- [python]有限状态机(FSM)简单实现
- 基于C++的简单的FSM实现
- 有限状态机(FSM)
- FSM有限状态机(一)
- Unity中使用有限状态机(FSM)来管理UI面板的切换(UGUI)
- 有限状态机—— FSM(finite-state machine)
- 二、有限状态机(FSM)