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

Lyra框架02:角色是怎么创建出来的

2023-07-17 04:08 作者:半步游戏设计师  | 我要投稿

Lyra的创建角色是围绕PawnData这个数据结构,和OnExperienceLoaded这个时间节点。

首先推荐一个文章先看明白GameMode的初始化流程。

https://zhuanlan.zhihu.com/p/70045930

按时间顺序排列:

在UEngine::LoadMap中,首先调用UWorld::InitializeActorsForPlay初始化所有在场景里已经存在的Actor。

在这个函数内,AGameModeBase::PreInitializeComponents阶段,GameState被初始化的同时也将ALyraGameMode::OnExperienceLoaded注册到了委托上。

其他放在场景里的Character或是Pawn,在APawn::PostInitializeComponents阶段,根据AutoPossessAI的设定,开始创建AIController。

而ALyraPlayerBotController中使用了bWantsPlayerState = true,因此也会获得一个LyraPlayerState,从而在ALyraPlayerState::PostInitializeComponents阶段,ALyraPlayerState::OnExperienceLoaded也注册到了委托上。

在后续的阶段,当PlayerController被创建时,随着LyraPlayerState被实例化,在ALyraPlayerState::PostInitializeComponents阶段,ALyraPlayerState::OnExperienceLoaded也注册到了委托上。


当Actors都准备好了时,我们开始关注ExperienceLoaded之后的执行逻辑。

在ALyraGameMode::InitGame中,通过SetTimerForNextTick,保证下一帧才开始真正跑Experience的逻辑。

在ALyraGameMode::OnExperienceLoaded中,尝试通过AGameModeBase::RestartPlayerAtPlayerStart重置所有PlayerController。

在这个过程中需要查询PawnData数据,ALyraGameMode::GetPawnDataForController函数中写了从LyraPlayerState上取的逻辑。这个PawnData是哪来的呢?一看原来是ALyraPlayerState::OnExperienceLoaded里,从GameMode上再调GetPawnDataForController取。

还是在这个过程中,在 ALyraGameMode::SpawnDefaultPawnAtTransform_Implementation的实现里,又取了一次PawnData直接生成了Pawn,然后还调用了上面的ULyraPawnExtensionComponent::SetPawnData。

目前只有HeroComponent和PawnExtensionComponent用到了这个IGameFrameworkInitStateInterface。这个模块是用来管理BeginPlay里的逻辑时序的。

PawnExtensionComponent通过PawnData卡住所有其他用到这个模块的Component,来保证数据可用性。

我们重新捋一下时序。

1. LyraGameMode最先注册,也最先执行OnExperienceLoaded回调函数,此时PlayerState的OnExperienceLoaded还没有回调,因此取不到PlayerState上的PawnData,所以取ExperienceManager上的默认Experience实例。

2. LyraPlayerState执行OnExperienceLoaded回调函数,此时同上,还是取到了默认Experience实例。然后记录下来。后续其他地方如果要取就从PlayerState上取,应该是因为GameMode只在服务器上有,客户端取不到。

3. HeroComponent和PawnExtensionComponent在BeginPlay阶段,交替切换阶段,最终完成基于PawnData的输入、能力初始化。



注:SpawnActor的流程:

https://zhuanlan.zhihu.com/p/411549290





Lyra框架02:角色是怎么创建出来的的评论 (共 条)

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