简介
状态模式+有限状态机的思路,可以在各个状态之间来回切换。
FSM模块的使用
代码如下:
using System.Collections;
using System.Collections.Generic;
using IFramework;
using IFramework.FSM; // 引入FSM命名空间
using UnityEngine;
//实现 IFsmState接口。
public class JumpState : IFsmState
{
public void OnEnter()
{
Debug.Log("跳跃状态进入……");
}
public void OnExit()
{
Debug .Log("跳跃状态退出……");
}
public void Update()
{
Log.L("跳跃!");
}
}
public class RunState : IFsmState
{
public void OnEnter()
{
Debug.Log("奔跑状态进入……");
}
public void OnExit()
{
Debug .Log("奔跑状态退出……");
}
public void Update()
{
Log.L("奔跑!");
}
}
public class IdleState : IFsmState
{
public void OnEnter()
{
Debug.Log("待机状态进入……");
}
public void OnExit()
{
Debug .Log("待机状态退出……");
}
public void Update()
{
Log.L("待机!");
}
}
public class TestFSM : MonoBehaviour
{
// Start is called before the first frame update
FsmMoudle fsmMoudle ;
JumpState jumpState;
RunState runState ;
IdleState idleState ;
void Start()
{
// 初始化 状态机、跑状态、
fsmMoudle = new FsmMoudle();
jumpState = new JumpState();
runState = new RunState();
idleState = new IdleState ();
//将状态 都加入 状态机中
fsmMoudle.SubscribeState(jumpState);
fsmMoudle.SubscribeState(runState);
fsmMoudle.SubscribeState(idleState);
// 设置初始 状态
fsmMoudle.EnterState = idleState;
// 创建过渡条件数值
var val=fsmMoudle.CreateConditionValue<bool>("bool", true);
//过渡链接线创建
var t1= fsmMoudle.CreateTransition(idleState, jumpState);
var t2 = fsmMoudle.CreateTransition(jumpState, runState);
//过渡连接线绑定过渡条件
t1.BindCondition(fsmMoudle.CreateCondition<bool>("bool", false, ConditionCompareType.EqualsWithCompare));
t2.BindCondition(fsmMoudle.CreateCondition<bool>(val, true, ConditionCompareType.EqualsWithCompare));
//第八步、启动状态机
fsmMoudle.Start();
}
// Update is called once per frame
void Update()
{
fsmMoudle.Update();
if (Input.GetKeyDown(KeyCode.Space))
{
fsmMoudle.SetBool("bool", false);
}
if (Input.GetKeyDown(KeyCode.D))
{
fsmMoudle.SetBool("bool", true);
}
}
}
输出结果:
注意: 先点击的“空格”,再点击的“D键”,途中多次点击,并不会出现状态胡乱切换的情况。
代码解析
- 自定义状态类 ,实现
IFsmState
接口 - 接口需要实现:进入、执行、退出三个状态
- 创建状态机
FsmMoudle
对象,并将 需要纳入的状态纳入状态机中。 - 设置连线,以及连线的切换条件
- 在交互代码中触发条件,即可切换状态机中的各个状态
结尾
以上内容是 作者个人的理解,如有错误,欢迎指出。
顺便给出OnClick大佬自己 写的文档地址:005 FSM 模块
如果对 IF框架有其他看法,也欢迎大家 进群交流。
网友评论