UFSM状态机 推荐一个适合于Unity的有限状态机
程序员文章站
2024-03-19 18:00:28
...
项目地址:
https://gitee.com/xiongks/ufsm-state-machine
UFSM状态机
介绍
UFSM是一个适合于Unity中使用的状态机,方便为一个MonoBehaviour子类添加状态控制,代码精简,使用简单
简单使用教程
1.脚本继承自FSMBehaviour
(FSMBehaviour继承自MonoBehaviour)
public class CubeController : FSMBehaviour<CubeController>
2.脚本中定义状态
个人建议简单逻辑的状态直接和控制脚本写在同一个类中,作为内部类,避免命名冲突(纯属个人喜好)
//旋转状态
class RotateState : State<CubeController>
{
public override void OnUpdate(CubeController ower)
{
ower.transform.Rotate(Vector3.up*180* Time.deltaTime);
if (Input.GetKeyDown(KeyCode.X))
{
ower.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();
}
//也可以重写OnEnter和OnExit方法添加逻辑
}
}
//旋转状态
class MoveState : State<CubeController>
{
public override void OnUpdate(CubeController ower)
{
ower.transform. Translate(Vector3.forward * Time.deltaTime);
}
}
3.创建状态对象
RotateState rotateState = new RotateState();
MoveState moveState = new MoveState();
4.添加状态并设置状态切换条件,再设置一个初始状态就可以跑起来了
//下面两行代码添加状态并设置该状态拥有的转换条件
fsm.AddState(rotateState).AddTranstion("ToMove", moveState.id);
fsm.AddState(moveState).AddTranstion("ToRotate", rotateState.id);
fsm.ChangeState(rotateState.id); //设置初始状态
5.状态转换
fsm.SendMessage("ToMove");
6.DebugMode
使用可以再控制台看看到状态变化的输出
fsm.debugMode = true;
关于子状态:
在状态类内部创建状态机可以创建子状态
关于ID
状态机使用状态对象的 this.GetType().name作为状态ID,你可以根据需要修改
简单演示Demo
./Demo/Demo.unity
谢谢浏览!,如果您觉得本文不错记得点赞收藏
对游戏开发感兴趣的同学,欢迎扫描二维码加我微信