【GameFramework框架】FSM使用

一、使用流程图

二、使用方法

1、创建状态

csharp 复制代码
//状态一
public class IdleState : FsmState<StateMgr>
{
    protected override void OnInit(IFsm<StateMgr> fsm)
    {
        Debug.Log("IdleState初始化");
    }

    protected override void OnEnter(IFsm<StateMgr> fsm)
    {
        Debug.Log("进入Idle状态");
    }

    protected override void OnUpdate(IFsm<StateMgr> fsm, float elapseSeconds, float realElapseSeconds)
    {
        if (fsm.Owner.move)
        {
            ChangeState<MoveState>(fsm);
        }
    }

    protected override void OnLeave(IFsm<StateMgr> fsm, bool isShutdown)
    {
        Debug.Log("离开Idle状态");
    }

    protected override void OnDestroy(IFsm<StateMgr> fsm)
    {
        Debug.Log("销毁Idle状态");
    }
}
csharp 复制代码
//状态二
public class MoveState : FsmState<StateMgr>
{
	protected override void OnInit(IFsm<StateMgr> fsm)
	{
		Debug.Log("MoveState初始化");
	}
	protected override void OnEnter(IFsm<StateMgr> fsm)
	{
		Debug.Log("进入Move状态");
	}
	protected override void OnUpdate(IFsm<StateMgr> fsm, float elapseSeconds, float realElapseSeconds)
	{
		if (!fsm.Owner.move)
		{
			ChangeState<IdleState>(fsm);
		}
	}

	protected override void OnLeave(IFsm<StateMgr> fsm, bool isShutdown)
	{
		Debug.Log("离开Move状态");
	}
}

2、创建状态管理器,创建fsm,并根据条件进行状态切换

csharp 复制代码
public class StateMgr : MonoBehaviour
{
    public bool move=false;
    private IFsm<StateMgr> m_fsm;
    // Start is called before the first frame update
    void Start()
    {
        m_fsm = GF.Fsm.CreateFsm("PlayerFSM", this, new CheckState(),new IdleState(), new MoveState());
        m_fsm.Start<IdleState>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
           move=!move;
        }
    }
}

三、注意点

1、创建状态机时,不能加入多个相同的状态,否则会报错

例如下面这个情况,加入了两个相同的new CheckState(),就会报错

m_fsm = GF.Fsm.CreateFsm("PlayerFSM", this, new CheckState(),new IdleState(), new CheckState());

相关推荐
JWASX4 分钟前
Java 转 go 学习 - 基本语法
学习·golang
让头发掉下来24 分钟前
Kettle学习-17作业的创建与定时调度
学习
小刘在重生~34 分钟前
CSS 零基础完整学习笔记|选择器|盒子模型|布局
css·笔记·学习
AOI小白新手上路1 小时前
韦东山《ARM 架构与编程》3-3 IMX6ULL 的 GPIO 操作方法 · 学习笔记
arm开发·学习·架构
浩瀚地学1 小时前
deepagents学习打卡day07
经验分享·笔记·python·学习·agent
Awh-1 小时前
ARM 裸机开发 DAY5 学习笔记
arm开发·笔记·学习
李游Leo2 小时前
HarmonyOS 7 + ArkUI + Adaptive Layout 学习笔记:折叠屏多形态布局适配与窗口状态响应机制【鸿蒙心迹】
笔记·学习·harmonyos
kyrie_sakura2 小时前
大模型学习6 -- 深度学习 1 概述和PyTorch
pytorch·深度学习·学习
淡海水2 小时前
16-01-C#数据结构源码-附录A-术语表
unity·c#·游戏引擎·il2cpp
传奇开心果编程2 小时前
【Flutter入门练中学】第3课:滚动与列表
android·学习·flutter·ui·ios