Lyra技术分析:GameExperience

前言

如何基于Lyra的项目快速配置一个角色,该流程的起点是GameExperience对象,本文对此进行简单的分析

名词解释

  • ULyraExperienceDefinition :主要的配置资源,继承自PrimaryDataAsset,简称DA
  • ULyraPawnData: DA, 角色的配置,包含角色class类型以及技能和输入设置等
  • GameFeature: UE4.27新加的,一种基于插件的模块化的可以热插拔的功能
  • ULyraAbilitySet:DA, Gas技能配置, 另外也包含初始化的GE效果和额外属性集(关于Gas的篇幅太大,这里不展开)
  • ULyraInputConfig:DA, 输入配置,基于EnhancedInput框架结合gas的配置,核心思路是用用Tag来触发技能Ga
    Lyra技术分析:输入方式与GAS技能触发这里有详细说明
  • ULyraControllerComponent_CharacterParts: 挂载在controller上的组件, 本文中作为添加角色子actor的发起者
  • ULyraPawnComponent_CharacterParts: 挂载在玩家角色上的组件,用于接受前者的事件并修改角色模型
  • ULyraExperienceManagerComponent: 挂载在GameState的组件,用于保存和管理ULyraExperienceDefinition数据

流程简析

1.创建GameExperience

第一步需要创建GameExperience对象, 配置GaemFeatureToEnable为当前插件名称,目的是让该模块自动加载

image-20240325173307302

Lyra用GameExperience 来配置角色基础信息, 这个变量放在WorldSetting中, 如下图

image-20240325171904535

源码分析

需要在项目设置中自定义一个自己的WorldSetting

image-20240325170903194

然后在GameMode对象启动并执行Init的时候, 从WorldSetting中找到这个配置并保存到GameState中的ULyraExperienceManagerComponent组件中

image-20240325172239075

image-20240325172306933

ULyraExperienceManagerComponent

这个组件用来维护ULyraExperienceDefinition数据, 很多对象的初始化都依赖这个数据的初始化完成, 在ULyraExperienceManagerComponent中有CallOrRegister_OnExperienceLoaded()这个方法用于其他对象的注册或监听

比如

image-20240325173033439

2. 配置PawnData

image-20240325173258458

PawnData配置了角色的类型,以及所有技能,属性(通过AbilitySet)以及输入方式(通过InputConfig)

这个不算很难, 不一一展开

相机模式也在这里配置, 使用默认的TP即可, 关于相机模式未来有机会分析一下

3. 添加Actions

image-20240325173656070

这个Actions目的是在这个GameFeature加载后在所有指定的Actor上执行某个操作比如挂载某个组件, 当然在GameFeature卸载以后也会相应的卸载这个组件

这一步我们给所有Controller添加继承自LyraControllerComponentChracterParts的组件, 并在组件开始时执行下图操作

image-20240325173918558

4. 创建玩家角色并添加组件B_MannequinPawnCosmetics

image-20240325174657365

B_MannequinPawnCosmetics组件继承自LyraPawnComponent_CharacterParts

配置了2组MeshRules数据以及默认的模型和物理资产,这些是与LyraControllerComponentChracterParts需要配合使用

LyraControllerComponentChracterParts

这个组件挂载到Cotroller上, 如前面在游戏开始的时候我们添加一个B_Manny类型的Part,这一个操作的目的是啥呢?

image-20240325174010110

这个controller版本的组件只是作为发起者, 将这个part数据(核心就是这个class对象)添加到pawn版本的组件中去

LyraPawnComponent_CharacterParts

image-20240325174335749

image-20240325174453559

核心的代码就在上面两图

  • SpawnActorForEntry

创建一个ChildActor并attach到角色mesh上

  • BroadcastChanged

LyraControllerComponentChracterParts添加进来的parts中的tag去查找组件中符合的对象,然后更新角色模型和物理资产

Lyra 的2个part角色有一个容易忽略的细节, 2个对象配置了2个tag,如下图

image-20240325175202941

这个就是上面所说的查找所需的tag

总结

  • 默认的角色类,即PawnData中配置的类是负责逻辑的,真正用于显示角色模型的是这个part对象

  • 所有使用PawnData的对象都需要去监听ULyraExperienceManagerComponent的回调事件保证时序

如何换皮

既然是通过part来确定我们渲染的角色的,那么就可以使用一个新的 part对象来换皮

创建继承自TaggedActor的对象TesetMan,设置UE4小白人为模型,添加角色组件中男性空骨骼模型一样的tag

image-20240325182359136

image-20240325182435434

指定这个Mesh组件的ABP为一个特殊的ABP

image-20240325182507579

在运行时进行重定向运算