贯穿游戏运行时整个生命周期的有限状态机。通过流程,将不同的游戏状态进行解耦将是一个非常好的习惯。对于网络游戏,你可能需要如检查资源流程、更新资源流程、检查服务器列表流程、选择服务器流程、登录服务器流程、创建角色流程等流程,而对于单机游戏,你可能需要在游戏选择菜单流程和游戏实际玩法流程之间做切换。如果想增加流程,只要派生自 ProcedureBase 类并实现自己的流程类即可使用。
常规用法
获取流程组件
1 |
ProcedureComponent procedureComponent = GameEntry.GetComponent<ProcedureComponent>(); |
定义流程
流程均派生自 ProcedureBase 类,这里以定义一个 Example 流程为例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public class ProcedureExample : ProcedureBase { protected override void OnInit(ProcedureOwner procedureOwner) { base.OnInit(procedureOwner); // 游戏初始化时执行 } protected override void OnEnter(ProcedureOwner procedureOwner) { base.OnEnter(procedureOwner); // 每次进入这个流程时执行 } protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds) { base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds); // 每次轮询执行 } protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown) { base.OnLeave(procedureOwner, isShutdown); // 每次离开这个流程时执行 } protected override void OnDestroy(ProcedureOwner procedureOwner) { base.OnDestroy(procedureOwner); // 游戏退出时执行 } } |
切换流程
切换流程应在具体的流程回调函数中调用。
1 2 3 4 5 |
protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds) { // 切换流程到 ProcedureExample ChangeState<ProcedureExample>(procedureOwner); } |
获取当前流程
1 |
ProcedureBase currentProcedure = procedureComponent.CurrentProcedure; |
获取当前流程持续时间
单位:秒。
1 |
float currentProcedureTime = procedureComponent.CurrentProcedureTime; |
检查是否存在流程
1 2 3 4 5 |
// 使用泛型参数检查是否存在流程 bool hasProcedure1 = procedureComponent.HasProcedure<ProcedureLaunch>(); // 使用类型参数检查是否存在流程 bool hasProcedure2 = procedureComponent.HasProcedure(typeof(ProcedureLaunch)); |
获取流程
1 2 3 4 5 |
// 使用泛型参数获取流程 ProcedureBase procedure1 = procedureComponent.GetProcedure<ProcedureLaunch>(); // 使用类型参数获取流程 ProcedureBase procedure2 = procedureComponent.GetProcedure(typeof(ProcedureLaunch)); |
参考手册
最佳实践
流程是对有限状态机的再封装
流程是贯穿游戏运行时整个生命周期的有限状态机,许多流程相关的用法和有限状态机是类似的。
常见问题
增加了新的流程,但是切换时提示未找到该流程
请检查流程的 Inspector 面板上,Available Procedures 中是否已经勾选了新增加的流程。
如何把某个流程设置为初始流程
请在流程的 Inspector 面板上,将 Entrance Procedure 修改为期望的初始流程即可。