讲在前面
该模块的灵感来自于Unity的Animator状态机,
所以用过的人,对该模块很容易理解
进入实例
第0步、实现状态机的节点类
第一步、实例化,状态机,和状态及节点
第二步、把节点注册到状态机中
第三步、设置状态机的起始段点
第四步、创建过渡条件数值
第五步 、过渡链接线创建
第六步、创建连接线条件
第七步、过渡连接线绑定过渡条件
第八步、启动状态机
第九步、让状态机转起来
public class State:IFsmState
{
public void OnEnter()
{
Log.L(GetType() + " Enter");
}
public void OnExit()
{
Log.L(GetType() + " OnExit");
}
public void Update()
{
Log.L(GetType() + " Update");
}
}
public class State1 : State
{
}
public class State2 : State
{
}
public class FsmExample : MonoBehaviour
{
//第一步实例化,状态机,和状态及节点
FsmMoudle f = new FsmMoudle();
State1 s1 = new State1();
State2 s2 = new State2();
private void Awake()
{
//第二步、把节点注册到状态机中
f.SubscribeState(s1);
f.SubscribeState(s2);
//第三步、设置状态机的起始段点
f.EnterState = s1;
//f.ExitState = s2;
// 第四步、创建过渡条件数值
var val= f.CreateConditionValue<bool>("bool", true);
//第五步 、过渡链接线创建
var t1= f.CreateTransition(s1, s2);
var t2 = f.CreateTransition(s2, s1);
//第六步、创建连接线条件
//第七步、过渡连接线绑定过渡条件
t1.BindCondition(f.CreateCondition<bool>("bool", false, ConditionCompareType.EqualsWithCompare));
t2.BindCondition(f.CreateCondition<bool>(val, true, ConditionCompareType.EqualsWithCompare));
//第八步、启动状态机
f.Start();
}
private void Update()
{
//第九步、让状态机转起来
f.Update();
if (Input.GetKeyDown(KeyCode.Space))
{
f.SetBool("bool", false);
}
if (Input.GetKeyDown(KeyCode.Q))
{
f.SetBool("bool", true);
}
}
}
结束
注意:如果一直卡在一个节点,会一直调用该节点的update
Exit节点只有OnEnter方法可能被调用
一旦运行到Exit节点,那么该状态机就彻底结束了
该状态机较为复杂,但是对于unity使用者理解起来不难
后续可能会配上 Unity插件扩展一起用
网友评论