淄博英文网站建设专业,做网站前途,做h5的网站有哪些,百度商家怎么入驻FSM#xff08;Finite State Machine有限状态机#xff09;可以理解成是对行为逻辑的抽象#xff0c;就好象人在生活中会做出各种行为#xff0c;例如吃饭、睡觉等#xff0c;这些所有我们都看作是“行为”的分支#xff0c;由大脑决定每种行为具体是什么实施。在整个FSM… FSMFinite State Machine有限状态机可以理解成是对行为逻辑的抽象就好象人在生活中会做出各种行为例如吃饭、睡觉等这些所有我们都看作是“行为”的分支由大脑决定每种行为具体是什么实施。在整个FSM架构中其实与上面解释一致首先有一个状态基类stateObject里面有三个方法分别是状态前、状态中、状态后。所有具体行为都要继承这个基类在这三个方法中具体实现各种方法的逻辑。然后需要一个stateManager大脑状态管理类来管理这些状态特别注意的是里面changeState方法他是状态跳转的关键。至于如果存储各种状态你可以用list类 字典类等等。有限状态机就是把一个对象的行为分解成为易于处理的“块”或“状态”。 例如将人的行为抽象成3个分别是吃饭、睡觉、上班。上班族只有吃饭、睡觉、上班三种行为我们把这三种行为放进我们的大脑即stateManager。那我们从什么行为开始呢其实这里就是initState随便挑一个默认为睡觉。之前说过每个行为都有三个状态前、中、后当我们进入睡觉行为时首先进入的是睡觉前状态该状态只执行一次然后进入睡觉中真正的逻辑是在这里执行的它会不停检查什么时候睡醒了符合条件后跳到其他状态当要进行跳转时还会执行一次睡觉后状态其实前、后状态我理解成当要执行或结束某种行为时你要额外做的事情。例如睡觉前我要带个眼罩。放到游戏开发里可以进行一些赋值操作或者调用其他类的方法例如一些特效。因为它编程快速简单易于调试性能高与人类思维相似从而具有1.便于梳理状态关系2.使用灵活3.容易修改 FSM的优点就是因为它编程快速简单易于调试性能高与人类思维相似。
以下是一个自己写的实例代码可供大家参考
首先创建一个抽象状态基类里面有3个抽象方法分别是进入状态离开状态更新状态的方法 using System.Collections;
using System.Collections.Generic;
using UnityEngine;public abstract class StateObject
{//状态控制机protected StateManger sm;//构造函数public StateObject(StateManger _sm){sm _sm;}//进入状态方法public abstract void EnterState();//离开状态方法public abstract void ExitState();//更新状态方法public abstract void UpdateState();} 然后根据具体的情况创建具体的状态类继承自状态基类我这里实现了3个具体的状态类分别是人物默认状态移动状态死亡状态
默认状态方法 using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class IdleState : StateObject
{public IdleState(StateManger _sm):base(_sm){}
//进入状态方法public override void EnterState(){Debug.Log(进入待定状态);}
//离开状态方法public override void ExitState(){Debug.Log(离开待定状态);}
//更新状态方法public override void UpdateState(){Debug.Log(更新待定状态);if (Input.GetKeyDown(KeyCode.M)){sm.ChangeState(Move);}else if (Input.GetKeyDown(KeyCode.D)){sm.ChangeState(Die);}}} 移动状态方法 using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MoveState : StateObject
{public MoveState(StateManger _sm) :base(_sm){}public override void EnterState(){Debug.Log(进入移动状态);}public override void ExitState(){Debug.Log(离开移动状态);}public override void UpdateState(){Debug.Log(更新移动状态);if (Input.GetKeyDown(KeyCode.D)){sm.ChangeState(Die);}else if(Input.GetKeyDown(KeyCode.I)){sm.ChangeState(Idle);}}
} 死亡状态方法 using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class DieState : StateObject
{public DieState(StateManger _sm):base(_sm){}public override void EnterState(){Debug.Log(进入死亡状态);}public override void ExitState(){Debug.Log(离开死亡状态);}public override void UpdateState(){Debug.Log(更新死亡状态);if (Input.GetKeyDown(KeyCode.I)){sm.ChangeState(Idle);}}
} 然后需要一个stateManager大脑状态管理类来管理这些状态特别注意的是里面changeState方法他是状态跳转的关键需要放在Update函数中因为需要不断检测当前的状态检测是否跳转 using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class StateManger {//利用字典存储各种状态Dictionarystring, StateObject Dic new Dictionarystring, 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 Dic[statename];currentstate.EnterState();}}//改变状态public void ChangeState(string statename){if (Dic.ContainsKey(statename)){if (currentstate!null){currentstate.ExitState();currentstate Dic[statename];currentstate.EnterState();}}}//更新状态public void UpdateState(){if (currentstate!null){currentstate.UpdateState();}}} 这样一个简单的有限状态机就写好了然后我们可以在Unity里面利用一个实例来测试一下我写了一个控制物体状态的脚本 using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestFsm : MonoBehaviour {//添加一个状态机StateManger stm new StateManger();void Start(){//注册状态stm.Region(Idle, new IdleState(stm));stm.Region(Die, new DieState(stm));stm.Region(Move, new MoveState(stm));
//设置默认状态stm.SetDefat(Idle);}// Update is called once per framevoid Update(){
//更新状态的方法stm.UpdateState();}
} 以上就是本人学习FSM的一点总结如果有什么不对的地方敬请大家指出大家一起学习进步。