深入UE5——GameFeatures架构(二)基础用法

引言

谢谢你对GameFeatures的学习兴趣!本篇我们将开始讲解GameFeatures的表层基础用法,包括如何创建一个GameFeature、如何配置GameFeature和如何激活释放GameFeature这些简单的用法,也会讲解一些基础的概念。但其一些高级的用法如Action扩展和GameFeature策略定制等会在后文中讲述。

Demo

先来看一下我实现过的一个非常简单的Demo,我故意做的特别的简单,是为了避免尽量无关的逻辑代码干扰到核心代码脉络。

00:00 / 00:56

倍速

高清

00:56

如Demo中演示,可以在运行时通过按钮的简单功能,动态的开关游戏功能,从而改变场景中Echo的表现,为其添加新的动画、特效和逻辑。

基础用法

值得注意的是,演示所用的引擎版本为UE5 EA版。虽然理论上和GameFeatures是个比较独立的插件框架,也可以自己手动移植到UE4,在你的现有项目里使用。但我觉得一般来说并没有多大的必要,除非你的项目真的很需要各种开关玩法功能。

1. 开启插件

第一步就是来到插件界面,开启这两个插件:GameFeatures和ModularGameplay。

其中GameFeatures插件实现了Actions执行和GameFeature的装载,而ModularGameplay为AddComponent提供了实现支撑。

2. 创建GameFeature

在插件界面,选NewPlugin后就会多一个GameFeature的选项,点创建就可以创建出一个GameFeature了。这里只要注意一点不要更改默认的目录,必须放在GameFeatures目录下。因此源码里写死了只检测该目录下的插件为GameFeature。

通过编辑器创建GameFeature,会自动的帮你配置AssetManager和在GameFeatures目录创建GameFeatureData资产,因此也是首选推荐这种方式。当然有些时候你也可能想从别处拷贝一个现有GameFeature到你的项目里,手动拷贝创建的方式你就得额外注意目录正确、AssetManager配置和GameFeatureData的名字和配置了。

注意点:不要更改默认的目录,GameFeature必须放在GameFeatures目录下!

3. 查看GameFeature

创建出来的GF,在内容浏览器上选择显示插件内容就可以看见了。我们这里已经注意到在根目录上已经自动生成了一个插件同名的资产(MyFeature)。这是个GameFeatureData,定义描述了整个GameFeature要执行的动作列表。GameFeature的机制是直接读取跟插件同名的GameFeatureData资产的,所以我们应该去编辑它,但不要去改它的名字。

注意点:不要更改GameFeatureData的名字,保持跟GameFeature的插件同名!

4. 配置AssetManager

当然这个时候我们可以去检查一下项目设置里AssetManager,是否已经自动加上了GameFeatureData的主资产类型。如果没有的话,比如说我们是直接从别的地方拷贝过来的GameFeature插件,这样的话就不会自动有。我们就按照图上的方式补上就好了。只有定义了此项,GameFeatureData的加载才能正常工作。GameFeature的实现强烈依赖于AssetManager的资源探测发现来加载释放相应的资产,因此一定要配置此项。好在这个配置是机械无脑的,照着做就好了,不用太深究原理。

如果没有配置,在编辑器启动的时候会报出警告:

注意点:一定要记得相应配置AssetManager来扫描GameFeatureData,否则无法正常工作!

5. 配置Actions

我们双击GameFeatureData,就可以来配置这个GameFeature插件的功能。从上到下依次是插件的初始状态和当前状态,关于GameFeature的状态我们在之后会详细描述。这里最重要的是配置Actions,我们在这里可以配置一个Action数组,指定插件激活后要进行的一系列操作动作。整个GameFeature插件的实现其实就是在插件内定义一些组件或资产,然后在这里通过Action来配置关联上。配置完成后,最好重启一下编辑器,以便让编辑器重新加载一下GameFeatureData,或者把当前状态设为Installed再Active一下来重新加载。 截图里的可用Action列表比各位的默认列表要多一些,是因为我从《古代山谷》项目里拷贝了一些代码过来。我们在后文中也会讲到如何扩展自定义Action。这个GameFeatureData的数据其实也是可以扩展来增加更多的项的,以便为项目需求提供更多的配置项。例如用在《堡垒之夜》里的项就比引擎里的要多的多。

注意点:在Active状态是无法Edit Plugin信息的,编辑完GameFeatureData后最好触发重新加载一下来生效。

6. GameFeatureAction_AddComponent示例

Action中最重要的就是AddComponent,这里以《古代山谷》的黑暗世界对战为例,Echo在接触到传送门后,会触发AncientBattle Game Feature插件的开启,之后AddComponent开始用做,会在Echo身上添加一个动画替换组件,把Echo的骨骼动画替换成另一个动画蓝图,增加施法动作。还会在场景里为可被攻击成为目标的物体添加标记。

我们自己项目里的逻辑也是同样的套路。通过某种场景互动或契机触发GameFeature的Active,然后这个GameFeature的一系列Action就开始生效运作。失效的时候反向做一些清理收尾工作就行。

7. 注册Actor为接收者

想要让AddComponent发挥作用的前提是,受体Actor身上要把自己注册为接收者。记得在Actor的BeginPlay和EndPlay分别调用AddReceiver和RemoveReceiver就可以了。为想要动态添加GameFeatureAction_AddComponent(最常见)的Actor调用AddReceiver,记得在EndPlay调用RemoveReceiver。之后就可在其身上添加应用AddComponent Action,其他类型的Action不需要此手动操作。在调试GameFeature的时候,常常可能发现明明配了Action,但是Actor怎么就没有反应不起作用呢,这时就很可能是你忘了给该Actor事先注册为接收者。多提一句,AddComponent的实现还蛮精巧的,即使是在GameFeature生效之后再事后注册Actor为Receiver,也能成功的AddComponent。

当然每次对每一个想要实施的Actor都来这一步还挺麻烦的,对于懒人,在ModularGameplay插件里定义的ModularGameplayActors都已经帮你实现好了该操作,我们只要从该基类继承下来就成,这部分等后续再详细叙述。

注意点:一定要记得把Actor注册为Receiver,AddComponent才能工作!

7. 激活GameFeature

加载激活插件有几种办法可以用,在编辑器里可以直接通过按钮来切换。在运行时还可以通过GameFeaturesSubsystem提供的C++ API。也可以通过命令行指令来执行,其底层核心都是调用的UGameFeaturesSubsystem内部的各种方法。你可以在你的游戏逻辑合适位置来调用这些API。

注意点:要记得激活GameFeature后才能工作!

总结

至此基础用法就已经讲完了,可以看出还是比较简便的,需要的操作并不繁琐。但如何才能真正的用之于生产环境,就得在更进一步的理解GameFeature的内在机制的基础上,才能达成最佳实践。下篇我们来正式的讲述框架机制。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值