特别提示: 本系列基于Unity 2019.4.8,框架版本GameFramework 2021.05.31
本系列博客地址: 传送门
前言
本框架是有官方示例的,但是不建议一上来就扒拉示例代码,示例为了更好的体现GF优点写了很多框架以外的脚本,直接看会很懵需要一定的技术水平,我们先把内置的核心组件功能吃透,再来慢慢的啃示例,第一个要讲的是流程,因为它贯穿整个程序,从程序启动到结束退出它都参与其中.
一、流程是什么
贯穿游戏运行时整个生命周期的有限状态机。通过流程,将不同的游戏状态进行解耦将是一个非常好的习惯。对于网络游戏,你可能需要如检查资源流程、更新资源流程、检查服务器列表流程、选择服务器流程、登录服务器流程、创建角色流程等流程,而对于单机游戏,你可能需要在游戏选择菜单流程和游戏实际玩法流程之间做切换。如果想增加流程,只要派生自 ProcedureBase 类并实现自己的流程类即可使用。
虽然ProcedureBase 继承的是FsmState状态机,但是这里给了个流程的概念,顾名思义流程就是一系列的步骤活动,完成一个完整的业务行为的过程,流程是有限状态机的再封装,就像一个步骤管理一条流水线,一个步骤一个流程, 到了你这个步骤你可以做些相应操作,做完或者等待一个条件触发下个步骤流程.
二、流程的生命周期
来看一下ProcedureBase 的代码
using GameFramework.Fsm;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
namespace GameFramework.Procedure
{
/// <summary>
/// 流程基类。
/// </summary>
public abstract class ProcedureBase : FsmState<IProcedureManager>
{
/// <summary>
/// 状态初始化时调用。
/// </summary>
/// <param name="procedureOwner">流程持有者。</param>
protected internal override void OnInit(ProcedureOwner procedureOwner)
{
base.OnInit(procedureOwner);
}
/// <summary>
/// 进入状态时调用。
/// </summary>
/// <param name="procedureOwner">流程持有者。</param>
protected internal override void OnEnter(ProcedureOwner procedureOwner)
{
base.OnEnter(procedureOwner);
}
/// <summary>
/// 状态轮询时调用。
/// </summary>
/// <param name="procedureOwner">流程持有者。</param>
/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
/// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
protected internal override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
}
/// <summary>
/// 离开状态时调用。
/// </summary>
/// <param name="procedureOwner">流程持有者。</param>
/// <param name="isShutdown">是否是关闭状态机时触发。</param>
protected internal override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
{
base.OnLeave(procedureOwner, isShutdown);
}
/// <summary>
/// 状态销毁时调用。
/// </summary>
/// <param name="procedureOwner">流程持有者。</param>
protected internal override void OnDestroy(ProcedureOwner procedureOwner)
{
base.OnDestroy(procedureOwner);
}
}
}
主要有:OnInit–OnEnter–OnUpdate–OnLeave–OnDestroy,跟Unity脚本生命周期极其相似,GF内有多个组件都是类似生命周期,Unity脚本生命周期不懂的,自己先去恶补一下,不会吧,不会吧,都开始学习框架了,还有不懂Unity脚本生命周期的嘛?
三、怎么使用
1、创建一个流程脚本
之前导入的包有个Example打开ProcedureExample脚本,
using GameFramework;
using GameFramework.Procedure;
using UnityGameFramework.Runtime;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
namespace GameFrameworkExample
{
public class ProcedureExample : ProcedureBase
{
protected override void OnEnter(ProcedureOwner procedureOwner)
{
base.OnEnter(procedureOwner);
string welcomeMessage = Utility.Text.Format("Hello! This is an empty project based on Game Framework {0}.", Version.GameFrameworkVersion);
Log.Info(welcomeMessage);
Log.Warning(welcomeMessage);
Log.Error(welcomeMessage);
}
}
}
只要派生自 ProcedureBase 类就是一个流程
2、配置到框架
凡是继承ProcedureBase 的脚本都会在Procedure组件上显示,找到你写的流程一定要勾选上,不然切换流程时会报错找不到,Entrance Procedure选项可以设置初始流程
3、常规用法
获取Procedure组件
ProcedureComponent Procedure = UnityGameFramework.Runtime.GameEntry.GetComponent<ProcedureComponent>();
在流程脚本里切换流程
protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
{
// 切换流程到 ProcedureExample
ChangeState<ProcedureExample>(procedureOwner);
}
获取当前流程
ProcedureBase currentProcedure = Procedure.CurrentProcedure;
获取流程指定流程
ProcedureBase procedureExample= Procedure.GetProcedure<ProcedureExample>();