我们做游戏的时候经常会有流程控制,流程控制的方法有很多,行为决策树,状态机等。本质差别都不大,就是把每一段执行逻辑做成一个一个的节点,根据条件执行某个节点,切换到某个节点。今天给大家分享一下基于状态机来做游戏流程的控制。
1 一个简单的状态机案例
我们先来拆解一个使用案例,通过这个案例让大家对状态机的流程控制有一个基本的了解。首先我们来构建一些状态节点,放入到状态机中。编写伪代码如下:
创建一个状态机: FiniteStateMachine _fsm = new FiniteStateMachine()
往状态机里面加入所有控制流程状态的逻辑节点:
_fsm.AddNode(new NodeInit());
_fsm.AddNode(new NodeLogin());
_fsm.AddNode(new NodeTown());
初始化逻辑节点NodeInit,用来做初始化的逻辑控制, NodeLogin,用来做登录场景的逻辑控制, NodeTown节点用来做游戏战斗场景的逻辑控制

每个状态机节点,都有几个统一的固定的入口,这些入口如何设计与行业相关,比如我们的游戏行业,设计状态机节点接口一般如下:

Name: 状态机节点的名字;
OnEnter: 状态机进入到这个状态节点时执行,一般用于初始化;
OnExit: 状态机来开这个状态节点时执行,一般用户结束时候的一些销毁资源与释放等;
OnUpdate: 每一帧都会调用状态机节点的update, 很多每帧处理的事务可以放OnUpdate;
OnFixedUpdate: 每个FixedUpdate 都会调用状态机的OnFixedUpdate函数,一些固定迭代次数的更新可以放此接口。
OnHandleMessage(object msg): 给状态机节点触发事件消息的时候调用这个接口,来作为状态机节点处理事件消息的控制入口。
每个状态机节点,都实现IFsmNode所对应的接口,放入到状态机中统一管理。案例中我们在游戏开始时先执行NodeInit状态节点,完成游戏的初始化。
public void StartGame()
{
_fsm.Run(nameof(NodeInit));
}
先来看NodeInit节点处理的逻辑,NodeInit只在OnEnter里面实现了初始化的相关逻辑,其它接口,没有任何逻辑处理。代码如下
void IFsmNode.OnEnter()
{
AudioPlayerSetting.InitAudioSetting();
// 使用协程初始化
MotionEngine.StartCoroutine(Init());

本文详细介绍了游戏流程控制中的状态机原理,通过案例展示了如何构建状态节点、接口设计以及状态切换过程。还探讨了基于状态机的实现、设计以及扩展特殊状态控制的应用,如顺序执行状态机。
最低0.47元/天 解锁文章
762

被折叠的 条评论
为什么被折叠?



