欢迎光临散文网 会员登陆 & 注册

Lyra的Modular Gameplay InitState 状态初始化链条 The Final Part

2023-07-30 17:07 作者:Diarica  | 我要投稿

各位好,我是Diarica,今天带大家来共同探索Lyra 中的Modular Gameplay初始化链条的基本结构(2)

上一期我们一起了解了Modular Gameplay中一些重要的类,这一期我们会直接围绕着接口去讲它整个初始化的流程。您跟着这两期文章,应当是可以在自己的项目中实现它。


我们这期会拿Lyra的PawnExtensionComponent举例,See how it works

看完以后你可以拿自己的项目去接入这个初始化链条。

PawnExt头部的注释

我们得知,PawnExtension是添加到Lyra游戏中所有Pawn的,它主要用来负责PawnData,ASC的初始化工作。


The implementation of IGameFrameworkInitStateInterface

在头文件中,可以看到PawnExt重写了以下虚函数,以及一个静态的FName。这个静态的FName是用于标记当前组件的名称以用于初始化。

它在构造函数的上方

InitState的注册

OnRegister中

OnRegister

OnRegister是ActorComponent的一个虚函数,PawnExt重写了它,旨在更早的完成对InitState链条的注册。在这之前也检查了必备的PawnExt组件的数量,如果玩家类上超过1个,那么就触发Ensure。


BeginPlay中

可以看到,Beginplay中绑定了当初始化状态链条变更时的通知,这里我要说一下,去翻了ModularGameplay它的实现,我发现它最终是来到了 OnActorInitStateChanged这个函数之下,PawnExt也实现了它。

同样的,这里也尝试转换状态为Spawned,就是刚刚生成完玩家。

尝试转换状态需要调用TryToChangeInitState这个接口。


EndPlay中 取消注册InitStateFeature





逐一讲解每个函数的作用。

CheckDefaultInitialization

这个函数,主要是检查当前状态的初始化是否完成,是否可以进入下一个状态。

在Lyra中,一些关键对象(如PlayerController PlayerState)的OnRep时会调用它,来检查初始化是否完毕。它的用法详见下张图和下张图的注释。


Lyra在很多地方都调用了CheckDefaultInitialization,它主要是为了检查初始化是否完成,能否进入下一个初始化状态。在HandleControllerReplicated等OnRep函数中调用的原因主要是PawnExtension依赖于一些属性复制到客户端。当它们复制完成后,检查是否可以完成初始化。你的项目可以参考这点,在关键数据或属性同步到客户端后检查初始化。

OnActorInitStateChanged

它是上文提到的,用BindOnActorInitStateChanged();绑定的回调。可以绑定更新到指定状态后的回调,也可以响应所有状态的变化,在PawnExt里是响应所有状态的变化。

PawnExt里做的事情:当其他的对象已经初始化到DataAvailable状态,尝试转换到DataInitialized状态。


HandleToChangeInitState

在PawnExt中,没有特殊处理,主要是交给了HeroComponent。


GetFeatureName

这里顾名思义,获取那个唯一的FName,标识着实现了这个接口的类。


CanChangeInitState

这个是IGameFrameworkInitStateInterface中最复杂的一个方法,它的作用是检查我们当前的初始化是否完成。如果完成后,return true,可以过渡到下一个状态。

重点:Current State是你当前的状态,DisiredState是询问是否可以转换到的状态。

你需要在这里做你自己的一系列判定,判定这个状态的初始化是否已完成。

如:

xx属性在客户端是否有效?




UGameFrameworkComponentManager的静态函数

SendGameFrameworkComponentExtensionEvent

这里主要是当某些特定的内容初始化完成后发送的消息,同样的,也可以绑定特定消息的委托。

例如在HeroComponent中,输入绑定完成后的消息。


到这里,我们的Modular Gameplay初始化链条就讲完了。

确实是比较简洁的系统,把实现逐一拆解就明白了用法。

自然原理也似乎不是那么的难,你也可以自己尝试实现一个初始化链条。


下次再见!

我家孩子


Lyra的Modular Gameplay InitState 状态初始化链条 The Final Part的评论 (共 条)

分享到微博请遵守国家法律