我们做游戏的时候经常会有流程控制,流程控制的方法有很多,行为决策树,状态机等。本质差别都不大,就是把每一段执行逻辑做成一个一个的节点,根据条件执行某个节点,切换到某个节点。今天给大家分享一下基于状态机来做游戏流程的控制。
对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习
1 一个简单的状态机案例
我们先来拆解一个使用案例,通过这个案例让大家对状态机的流程控制有一个基本的了解。首先我们来构建一些状态节点,放入到状态机中。编写伪代码如下:
创建一个状态机:
初始化逻辑节点NodeInit,用来做初始化的逻辑控制, NodeLogin,用来做登录场景的逻辑控制, NodeTown节点用来做游戏战斗场景的逻辑控制。
每个状态机节点,都有几个统一的固定的入口,这些入口如何设计与行业相关,比如我们的游戏行业,设计状态机节点接口一般如下:
public interface IFsmNode
{
/// <summary>
/// 节点名称
/// </summary>
string Name { get; }
void OnEnter();
void OnUpdate();
void OnFixedUpdate();
void OnExit();
void OnHandleMessage(object msg);
}
Name: 状态机节点的名字;
每个状态机节点,都实现IFsmNode所对应的接口,放入到状态机中统一管理。案例中我们在游戏开始时先执行NodeInit状态节点,完成游戏的初始化。
public void StartGame()
{
_fsm.Run(nameof(NodeInit));
}
先来看NodeInit节点处理的逻辑,NodeInit只在OnEnter里面实现了初始化的相关逻辑,其它接口,没有任何逻辑处理。代码如下
void IFsmNode.OnEnter()
{
AudioPlayerSetting.InitAudioSetting();
// 使用协程初始化
this.StartCoroutine(Init());
}
pri