在上一篇里,我们研究了关卡的配置如何在GameMode实现加载的,并稍微理解了Lyra是如何实现的模块化,由于模块化太彻底,所以理解起来有些难,在这一篇里,我们看一下配置里面比较想了解的一块。就是角色是如何配置,并且如何将GAS应用到身上的。
查看地图总配置
我们可以想到,在UI上可以看到,有地图配置和名称描述等内容,当然需要配置文件去配置
根据在ActionRPG里面学到的经验,我找到对应的用户控件
在里面发现了对应的用户资产类型,它将所有的对应类型的用户资产加载
然后查看类型里面的数据能不能默认显示,要不要放到前面优先显示,最后生成用户控件放置到HUD上。
基于类型,我们搜索所有的资源,可以发现一下资源都是通过此类创建的。
找到了以后,我们就迫不及待的打开查看一下配置项有哪些内容,发现第一项是关卡,第二项是关卡的玩法配置,后面就是在UI上的一些相关配置。
然后查看源码,发现MapID和ExperienceID都是通过资源ID进行设置,并且设定了类型,所以,在下拉里,我们只能选中对应的类型的语言。
还有值得一说的就是ExtraArgs,这个可以通过URL传递额外的配置,我们在上一篇Lyra解析里提到过这里。
然后就是加载地图时显示的背景图片,这里使用了TSoftClassPtr,也就是配置项里不会存储用户控件蓝图,而是存储的蓝图地址,在需要的时候进行加载。
后面,我们就要查看游戏玩法配置,接上了上一篇的配置加载解析。
玩家配置项
接着,我们查看一下玩家配置项,配置项里需要设置玩家使用的蓝图,初始的技能,标签之间的关系,然后就是输入操作触发的技能标签,最后是使用的相机模式。
技能集是个数组,可以配置多项,里面可以配置应用的技能和触发的标签,技能等级,还有GE和属性集AS
TagRelationshipMapping 则配置了技能标签之间的关系,这个本来应该是配置到技能里的,看来是为了模块化,也直接分开了
输入配置 Input Config,里面对应了输入操作Action对应触发的标签,分为默认操作和技能输入标签,实现逻辑应该不同。
最后是设置控制镜头的使用的类,看了一下应该是Lyra单独实现类,感兴趣的可以看一下源码
角色的查看完成,接着就是玩法的相关配置了,因为角色的那些配置还不足以支撑起当前游戏玩法,所以,还需要额外的一些操作配置来实现。
后面的玩法的操作配置,上一篇里我们也查看了对应的配置是如何实现,
处理配置
如何能够得之Lyra是如何处理角色数据的,我们可以从GameMode 的ChoosePlayerStart函数入手,这个函数是从场景里获取到玩家出生点,如果你设置了多个,还可以根据逻辑随机一个出生点生成
GameMode里获取出生点也是通过组件去获取的,这里我不再去看细节,感兴趣的可以去看看如何拿到的出生点。
接着,查看初始化GameState函数,在初始化完成GameState后,绑定监听配置加载完成的函数
获取到关卡里的所有的玩家控制器,如果从对应的玩家控制器获取不到Pawn,将创建。
基类里的RestartPlayer函数进行逻辑判断,获取到出生点,然后调用RestartPlayerAtPlayerStart函数
RestartPlayerAtPlayerStart函数里,先对所需的数据判断,获取到初始点的朝向
然后判断有没有Pawn,没有通过函数SpawnDefaultPawnFor创建一个
创建成功调用FinishRestartPlayer成功函数,要不然这调用失败
SpawnDefaultPawnFor其实就是获取出生点变换,方便后续设置角色位置,然后调用SpawnDefaultPawnAtTransform函数生成pawn
当然SpawnDefaultPawnAtTransform函数被Lyra覆写了,它是通过ULyraPawnExtensionComponent插件获取到PawnData,就是我们配置项里配置的角色配置去生成玩家控制的角色的
最后就是调用重置玩家控制角色位置,完成角色的Pawn的创建。