【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());

相关推荐
Mikko72 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
撩得Android一次心动4 小时前
Jetpack Compose 知识点整理2【个人用】
android·笔记·学习·kotlin·compose
dadaobusi5 小时前
学习:灵犀指令集
学习
xhyu616 小时前
【学习笔记】图像质量评估方法 (5.生成图像是否符合用户要求)
笔记·学习·计算机视觉
郝学胜_神的一滴6 小时前
游戏设计:原型与开发 06:读懂游戏设计最容易被忽略的文化层
游戏·游戏开发
SmalBox7 小时前
05-03-源码-运行模式体系(PlayMode)
unity3d·游戏开发
卿卿的产品经理日记8 小时前
【AI产品经理实战】Day 38|try-except 踩坑实录:报错是数据
人工智能·笔记·python·学习·产品经理
keyipatience8 小时前
TypeScript学习(1)
前端·javascript·学习·typescript·html·css3
lazy H9 小时前
【计算机网络】第 2 篇:一条数据如何穿过网络?彻底理解数据封装与解封装
网络·经验分享·后端·学习·计算机网络
我命由我123459 小时前
软件工程概念 - 可插拔性
java·后端·学习·java-ee·系统架构·软件工程·学习方法