Unity Game FrameWork—框架学习—流程对状态机封装

流程的启动

UGF封装:ProcedureComponent流程组件
流程组建的功能相对简单明晰,注册流程,初始化流程,启动流程以及获取流程持续时长。
如下代码,
awake中创建流程管理器

public override void Awake()
{
    base.Awake();

    m_ProcedureManager = GameFrameworkEntry.GetModule<IProcedureManager>();
    if (m_ProcedureManager == null)
    {
        Log.Fatal("Procedure manager is invalid.");
        return;
    }
}

Start中主要完成了三件事情,
1、81行,Activator.CreateInstance创建了监视器面板中选中的流程的实例
2、97行,调用流程流程管理器的初始化方法,执行流程的OnInit(ProcedureOwner procedureOwner)方法。
3、99行,开始流程,启动游戏时,首先进入的流程。
对于第二件事情,可能有一些模糊,通过打印日志溯源看到,流程的初始化,最终交给了有限状态机来完成。通过日志溯源,再往下看。
在这里插入图片描述
在这里插入图片描述
GF封装:
ProcedureManager(IProcedureManager):流程管理器中所以定义的功能与流程组建的功能基本一致。
ProcedureComponent中的97行调用了流程管理器的初始化方法,而流程管理器中的调用的是创建状态机CreateFsm。
在这里插入图片描述
状态机中创建状态的事情交给了Fsm来完成,
在这里插入图片描述
Fsm创建完成后立即调用OnInit方法来初始化各个流程。
在这里插入图片描述
ProcedureBase:流程基类,抽象类。定义了流程的初始化、进入、轮询、离开、销毁生命周期方法。流程基类本身继承了有限状态机状态基类。
我们回过头来再看模块使用中的切换流程,使用的是ChangeState(procedureOwner);。ChangeState方法正是来源于有限状态机FsmState。
分析完代码,流程的本质其实是状态机,创建流程就是创建状态机,流程是对状态机进行了一层封装。
状态机溯源
UGF封装:(罗列脚本功能)
FsmComponent有限状态机组件,创建、销毁、判断是否存在。
GF封装:(罗列脚本功能)
IFsm:接口功能,获取有限状态机(名称、持有者、状态数量、是否正常运行、持续时间、当前状态,所有状态、数据(设置、移除、获取))、开始有限状态机、是否存在有限状态机状态。侧重于状态机功能的实现
FsmBase:基类功能,初始化持有者类型、销毁、轮询。侧重于状态机流程
FsmState:状态基类,定义流程生命周期的虚方法,流程基类继承于状态机状态基类。
Fsm : FsmBase, IReference, IFsm创建有限状态机,并在合适的时机调用有限状态机状态基类FsmState中的生命周期方法。
FsmManager:管理状态机的创建、获取、销毁。
再看一下状态机是怎么完成轮询的启动调用,更深入理解状态机与流程的关系。
轮询始末
轮询发起者:BaseComponent组件的Update方法。
继承关系:BaseComponent : GameFrameworkComponent: MonoBehaviour
BaseComponent:发起轮询

private void Update()
{
    GameFrameworkEntry.Update(Time.deltaTime, Time.unscaledDeltaTime);
}

GameFrameworkEntry:轮询所有模块

public static void Update(float elapseSeconds, float realElapseSeconds)
{
    foreach (GameFrameworkModule module in s_GameFrameworkModules)
    {
        module.Update(elapseSeconds, realElapseSeconds);
    }
}

FsmManager:有限状态机管理器(模块之一,状态机模块)
m_Fsms中的流程类是在ProduceManager流程管理器的初始化方法Initialize中创建状态,foreach流程轮询会判断流程是否销毁,销毁即跳过,只执行当前流程的Update。

internal override void Update(float elapseSeconds, float realElapseSeconds)
{
    m_TempFsms.Clear();
    if (m_Fsms.Count <= 0)
    {
        return;
    }
    foreach (KeyValuePair<TypeNamePair, FsmBase> fsm in m_Fsms)
    {
        m_TempFsms.Add(fsm.Value);
    }
    foreach (FsmBase fsm in m_TempFsms)
    {
        if (fsm.IsDestroyed)
        {
            continue;
        }
        fsm.Update(elapseSeconds, realElapseSeconds);
    }
}

Fsm:有限状态机调用当前状态机Update

internal override void Update(float elapseSeconds, float realElapseSeconds)
{
    if (m_CurrentState == null)
    {
        return;
    }
    m_CurrentStateTime += elapseSeconds;
    m_CurrentState.OnUpdate(this, elapseSeconds, realElapseSeconds);
}

ProcedureBase : FsmState:轮询的终点(被流程类继承)

public virtual void OnUpdate(IFsm<T> fsm, float elapseSeconds, float realElapseSeconds)
{
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值