同样,再看相关代码前,不妨先想想lyra怎么做会比较好,希望他做了哪些功能。

首先肯定要解决几个问题:

  1. 角色创建的时机:由上一章,我们知道,在加载地图时,我们要初始化Experience,然后开启各种gamefeature。在ExperienceLoad完成后,进行3个优先级的通知,分为了High,Normal,Low。

OnExperienceLoaded.png

虽然GameFeature是支持动态开关的,角色先创建再开启GameFeature也同样奏效,但很多游戏逻辑其实是不支持的。

通过代码可以发现HighPriorty绑定了管理组队信息的TeamCreationComponent的初始化函数。

那么,这里肯定是有时序要求的,我得等组队管理器好了以后,我才能正常初始化角色。

  1. 关闭UE自带的角色创建流程:由于第一条,我们需要自定义角色的初始化时机,自己控制时序,那么UE自带的生成角色逻辑当然需要关掉。
  2. 角色生成的位置:UE5原生的逻辑就是找地图中的playerstart,那lyra有组队,有各种模式,角色生成位置可能也会改动吧
  3. 生成角色时是否可以分帧优化下呢
角色创建时机

InitGameState.png

可以找到相关代码,GameMode注册了normal优先级的通知

RestartPlayer.png

然后在通知时,执行了RestartPlayer创建角色

关闭原生创建

GameMode_RestartPlayer.png

通常GameMode会在HandleStartingNewPlayer时创建角色

LyraGameMode_RestartPlayer.png

lyra对其进行了重载,这样,在ExperienceLoad之前的player就不会在这里RestartPlayer了,统一由委托通知。

角色生成位置

往ReStartPlayer下面串,可以看到GameMode会通过FindPlayerStart来决定player出生的位置,而比较关键的就是这个ChoosePlayerStart函数

FindPlayerStart.png

原生的UE5的逻辑为枚举,尽量找没有物理阻挡的位置,如果所有的playerstart都有阻挡,那就阻挡的playerstart附近找个没有阻挡的降落点。

而lyra重载了ChoosePlayerstart这个函数。

Lyra_ChoosePlayerstart.png

看起来没什么很大的改动,只是加了个随机而已。

RandomPlayerStart.png

优化

看起来Lyra对玩家角色的生成也只是for循环的RestartPlayer而已,然后在RestartPlayerAtPlayerStart中直接生成pawn,并没有和想象中一样分帧优化。

最后修改:2024 年 03 月 26 日
如果觉得我的文章对你有用,请随意赞赏