GameFramework---流程(三)

特别提示: 本系列基于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>();
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值