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

相关推荐
SmalBox12 小时前
【节点】[FresnelEquation节点]原理解析与实际应用
unity3d·游戏开发·图形学
xiezhr14 小时前
米哈游36岁程序员被曝复工当晚猝死出租屋内
游戏·程序员·游戏开发
SmalBox1 天前
【节点】[DielectricSpecular节点]原理解析与实际应用
unity3d·游戏开发·图形学
开维游戏引擎2 天前
开维游戏引擎实例:飞机大战
游戏开发
SmalBox3 天前
【节点】[LinearBlendSkinning节点]原理解析与实际应用
unity3d·游戏开发·图形学
SmalBox3 天前
【节点】[ComputeDeformation节点]原理解析与实际应用
unity3d·游戏开发·图形学
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
weixin_424294674 天前
Unity 调用Steamworks API 的 SteamUserStats.RequestCurrentStats()报错
unity·游戏引擎·steamwork