各位好,我是Diarica,今天带大家来共同探索Lyra 中的Modular Gameplay初始化链条的基本结构(2)
【资料图】
上一期我们一起了解了Modular Gameplay中一些重要的类,这一期我们会直接围绕着接口去讲它整个初始化的流程。您跟着这两期文章,应当是可以在自己的项目中实现它。
我们这期会拿Lyra的PawnExtensionComponent举例,See how it works
看完以后你可以拿自己的项目去接入这个初始化链条。
我们得知,PawnExtension是添加到Lyra游戏中所有Pawn的,它主要用来负责PawnData,ASC的初始化工作。
在头文件中,可以看到PawnExt重写了以下虚函数,以及一个静态的FName。这个静态的FName是用于标记当前组件的名称以用于初始化。
它在构造函数的上方
InitState的注册
OnRegister中
OnRegister是ActorComponent的一个虚函数,PawnExt重写了它,旨在更早的完成对InitState链条的注册。在这之前也检查了必备的PawnExt组件的数量,如果玩家类上超过1个,那么就触发Ensure。
BeginPlay中
可以看到,Beginplay中绑定了当初始化状态链条变更时的通知,这里我要说一下,去翻了ModularGameplay它的实现,我发现它最终是来到了 OnActorInitStateChanged这个函数之下,PawnExt也实现了它。
同样的,这里也尝试转换状态为Spawned,就是刚刚生成完玩家。
尝试转换状态需要调用TryToChangeInitState这个接口。
EndPlay中 取消注册InitStateFeature
逐一讲解每个函数的作用。
CheckDefaultInitialization
这个函数,主要是检查当前状态的初始化是否完成,是否可以进入下一个状态。
在Lyra中,一些关键对象(如PlayerController PlayerState)的OnRep时会调用它,来检查初始化是否完毕。它的用法详见下张图和下张图的注释。
OnActorInitStateChanged
它是上文提到的,用BindOnActorInitStateChanged();绑定的回调。可以绑定更新到指定状态后的回调,也可以响应所有状态的变化,在PawnExt里是响应所有状态的变化。
PawnExt里做的事情:当其他的对象已经初始化到DataAvailable状态,尝试转换到DataInitialized状态。
HandleToChangeInitState
在PawnExt中,没有特殊处理,主要是交给了HeroComponent。
GetFeatureName
这里顾名思义,获取那个唯一的FName,标识着实现了这个接口的类。
CanChangeInitState
这个是IGameFrameworkInitStateInterface中最复杂的一个方法,它的作用是检查我们当前的初始化是否完成。如果完成后,return true,可以过渡到下一个状态。
重点:Current State是你当前的状态,DisiredState是询问是否可以转换到的状态。
你需要在这里做你自己的一系列判定,判定这个状态的初始化是否已完成。
如:
xx属性在客户端是否有效?
UGameFrameworkComponentManager的静态函数
SendGameFrameworkComponentExtensionEvent
这里主要是当某些特定的内容初始化完成后发送的消息,同样的,也可以绑定特定消息的委托。
例如在HeroComponent中,输入绑定完成后的消息。
到这里,我们的Modular Gameplay初始化链条就讲完了。
确实是比较简洁的系统,把实现逐一拆解就明白了用法。
自然原理也似乎不是那么的难,你也可以自己尝试实现一个初始化链条。
下次再见!