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为当前插件名称,目的是让该模块自动加载
Lyra用GameExperience
来配置角色基础信息, 这个变量放在WorldSetting
中, 如下图
源码分析
需要在项目设置中自定义一个自己的WorldSetting
然后在GameMode对象启动并执行Init的时候, 从WorldSetting
中找到这个配置并保存到GameState中的ULyraExperienceManagerComponent
组件中
ULyraExperienceManagerComponent
这个组件用来维护ULyraExperienceDefinition
数据, 很多对象的初始化都依赖这个数据的初始化完成, 在ULyraExperienceManagerComponent
中有CallOrRegister_OnExperienceLoaded()
这个方法用于其他对象的注册或监听
比如
2. 配置PawnData
PawnData配置了角色的类型,以及所有技能,属性(通过AbilitySet)以及输入方式(通过InputConfig)
这个不算很难, 不一一展开
相机模式也在这里配置, 使用默认的TP即可, 关于相机模式未来有机会分析一下
3. 添加Actions
这个Actions目的是在这个GameFeature加载后在所有指定的Actor上执行某个操作比如挂载某个组件, 当然在GameFeature卸载以后也会相应的卸载这个组件
这一步我们给所有Controller添加继承自LyraControllerComponentChracterParts的组件, 并在组件开始时执行下图操作
4. 创建玩家角色并添加组件B_MannequinPawnCosmetics
B_MannequinPawnCosmetics组件继承自LyraPawnComponent_CharacterParts
配置了2组MeshRules数据以及默认的模型和物理资产,这些是与LyraControllerComponentChracterParts
需要配合使用
LyraControllerComponentChracterParts
这个组件挂载到Cotroller上, 如前面在游戏开始的时候我们添加一个B_Manny类型的Part,这一个操作的目的是啥呢?
这个controller版本的组件只是作为发起者, 将这个part数据(核心就是这个class对象)添加到pawn版本的组件中去
LyraPawnComponent_CharacterParts
核心的代码就在上面两图
- SpawnActorForEntry
创建一个ChildActor并attach到角色mesh上
- BroadcastChanged
从LyraControllerComponentChracterParts
添加进来的parts中的tag去查找组件中符合的对象,然后更新角色模型和物理资产
Lyra 的2个part角色有一个容易忽略的细节, 2个对象配置了2个tag,如下图
这个就是上面所说的查找所需的tag
总结
默认的角色类,即PawnData中配置的类是负责逻辑的,真正用于显示角色模型的是这个part对象
所有使用PawnData的对象都需要去监听
ULyraExperienceManagerComponent
的回调事件保证时序
如何换皮
既然是通过part来确定我们渲染的角色的,那么就可以使用一个新的 part对象来换皮
创建继承自TaggedActor的对象TesetMan,设置UE4小白人为模型,添加角色组件中男性空骨骼模型一样的tag
指定这个Mesh组件的ABP为一个特殊的ABP
在运行时进行重定向运算