前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UE5的ECS:MASS框架(三)

UE5的ECS:MASS框架(三)

作者头像
quabqi
发布2022-04-02 15:47:23
6.3K0
发布2022-04-02 15:47:23
举报

前面两篇基本上已经把MASS的ECS基础框架都说清楚了。其中最关键的部分:Fragment/Tag等对应的就是传统ECS中的Component,Processor对应的就是传统ECS中的System,而上层的MassGameplay,MassAI,MassCrowd都是基于底层的ECS框架做出来的Gameplay框架,这一篇主要来说下MassGameplay框架的实现。

可以看到MassGameplay的源码中有很多文件夹,看里面代码的结构也基本上差不多,其中比较关键的是都有一个Trait文件,一个Processor文件,这里每个文件夹其实就对应的一个广义上的功能以及配套设施。

Trait和Processor

每个Trait可以看到都是从UMassEntityTraitBase继承下来的。这个Trait可以翻译成特征,从概念上来说就类似于C++的type_traits,一个对象只要会游泳,会呱呱叫,我们就可以说这个对象是鸭子,这里的游泳和呱呱叫就是鸭子的特征。Mass中的Trait,我们看到继承下来的实现,都会有一个BuildTemplate函数,函数中就是在配置Component,所以这个特征,其实就是配置一组Component的模板。可能直接这样说还是有些难理解,我们可以打开MassMovement这个文件夹来看,先看MassMovementTrait的BuildTemplate函数

就有上面这4个Fragment(底下还有一些其他的Component,截图不全),当我们创建Entity时如果用到了这个Trait,那么entity都会自动挂上这些Fragment。

而对于每个Processor,我们上一篇就已经知道了,都需要配置Requirement,可以打开MassMovementProcessors看到,需要下面这些Fragment来执行逻辑

这里就说明了,如果Entity需要Mass的Movement(移动功能),就必须保证Entity有上面这些Requirement,比如速度,Transform,Force等,而上面的Trait说明,当Entity用了Mass的Movement(移动功能),这些Entity上就会添加上这些新的Fragment或tag等。

我们看到,每个文件夹中的Trait里的Fragment可能有重复,比如Transform很多文件夹里的Trait都会挂,但实际上真正挂到Entiy上时只会有一份,从源码可以看到在模板内部已经做了去重(MassEntityTemplate.h)。

这些Trait我们看到本身也是UObject,在实际使用的时候并不是直接在C++代码里Add到Entity上,而是通过蓝图配置完成。为了方便配置,Mass也封装了一个叫做MassEntityConfigAsset的资源,可以在这个资源内设置Entity所需要的所有Trait,这样在Entity创建时就会自动挂好对应的Component了。

我们可以在内容浏览器里直接创建,如下:

点右键->其他->数据资产

选择MassEntityConfigAsset

创建好了之后,我们就可以打开配置,点开EntityConfig,在Traits这一块添加不同的Trait,比如需要显示就可以挂上Visualization,需要移动就可以挂上Movement等。

最上面的Parent可以配置上一级配置,也就是说这个MassConfig是可以像蓝图那样继承的,Parent里配置的Trait也会一起生效,这样当Entity类型很多,但配置只有少量不同,就不需要重复配置大量一样的Trait,只需要把相同的Trait放到单独的配置资源里,让不同的配置都以这个资源作为Parent即可。

每个Trait也需要再额外设置内部单独的参数,比如第一个Crowd Visualization

可以看到,配置High/Low Res Template Actor。以及不同LOD切换距离和其他参数等,这样当我们生成Entity的时候,近处的Entity就会自动使用High Res的配置创建Actor,稍远一些就会用Low Res的,更远的会退化成一个大的InstanceStaticMesh类型的合批对象,当然这里只是配置,具体怎么生效并在运行时候切换的下面会说。

当然比如Movement等Trait也有自己单独的配置。当所有配置都填好了,我们只要拿着这个配置去创建Entity,那么就会自动有了这些组件对应的功能,而我们配置好的Processor因为内部会配置Requirement,只要能匹配到Component就会自动执行。所以,现在剩下来的问题就只有怎么创建Entity,以及配置对应的Processor了。

Spawner

Mass已经为实现基本gameplay提供了很多Component和System以及对应的配置方式,那么ECS里最关键的就剩Entity了,AMassSpawner就是为了创建Entity而提供的对象。可以看到这个类是以A开头的,所以本身是需要拖拽到场景里来使用的。我们直接给场景里拖入一个MassSpawner,可以看到图标是一群小人。

在右边的属性面板里,可以填入需要Spawn的Entity数量,然后把刚才配置的Config拖入,可以看到这里Config配置也是数组的形式,说明支持多个Config。比如你想Spawn多种怪物,就可以通过多个配置来实现。每个配置还可以设置一个Proportion,就会把上面Count数量按照这个概率使用对应的Config。

除了上面的配置,这里还有另外一个生成器的配置,点开后可以看到支持两种类型。因为我们一下要刷出来很多个Entity,那这些Entity肯定不可能放在和Spawner同一个位置上叠在一起,因此需要这个位置生成器来指定位置。

我们选择EQS的方式来生成我们的Spawn位置。EQS也是虚幻引擎提供的另一套场景查询系统,和行为树差不多。具体可以看这一个官方文档来了解场景查询系统概述 | 虚幻引擎文档 (unrealengine.com),这里不多说。

我们还是右键创建一个。然后随便拖一个查询就好,比如我拖了个OnCircle,这样在创建Entity时就会排一圈。当然实际业务可以按照自己需求来做到很复杂的效果,这里只是简单举例。

最后把这个配置拖回去。

底下可以看到也有概率设置,也可以配置多种生成器。

比如再加一个ZoneGraph SpawnPoints的。这个是Mass内部提供的,本质还是生成一堆点给Entity的创建指定初始位置用,有兴趣也可以自行了解,这里也不多介绍了。

最后有一个参数叫做Auto Spawn on Begin Play。勾上就会在BeginPlay的时候自动刷Entity,如果不勾上就需要自己的代码里手动刷。下面两个函数就分别是刷怪和销毁,是AMassSpawner的成员函数,自己业务可以在C++或蓝图中调用。

DoSpawing内部代码可以看到,就是调用上面的生成器,得到前面指定Entity个数的点,然后调用下面这几个函数,创建或销毁Entity。创建entity后,也会根据配置和概率把对应的fragment,tag等挂到entity上

在创建时候也会批量执行SpawnDataInitalizer,这里就会在场景里对应的位置上Spawn出Actor,当然前提是Component上要有Actor组件,也就是下面这个Fragment。

这个fragment组件可以看到继承FObjectWrapper Fragment,这个基类其实就是把ECS和UE原本的UObject关联起来的桥梁,UObject的指针会保存在Fragment上面,这样ECS就可以使用Actor了,和unity3d的ECS做法完全一样。Mass默认的功能都没有挂actor,因此可以自己写个挂Actor的Trait配置到EntityConfig里。不挂这个是生成不出来的,因为负责在场景里显示的Processor依赖这个组件,如下图。

其他组件和Processor关系也是需要自己自行匹配,ECS的规则就是这样,这里就不多说了,如果还不了解可以看上一篇。

根据配置切换Actor和ISM的代码,也在这个Processor的UpdateRepresentation函数里,可以自行阅读。这样就实现了Actor在近处是高模,稍远退化成低模,再远处都退化成一堆instance的静态网格功能。下图黑客帝国游戏Demo里那海量的载具,每辆都能开的奥秘,就在UpdateRepresentation这个函数里。

Schematic

最后,像常规的ECS一样,为了让整个系统跑起来,我们需要一个System的执行列表,用来配置所有的Processor(也就是传统ECS的System执行表)。UMassSchematic就是用来做这件事的。

创建之后打开,就可以进行配置了

游戏启动就会按照这里配置的规则执行里面的Processor,可以看到这块跟传统ECS配置全局的System执行流程图基本没有区别。能指定每个Processor在Tick的哪个阶段执行,如上面都是PrePhysics。最后执行就会刷出来了。

最后也感谢公司内一个匿名和我交流Mass的同学(这个同学目前失联),他提供了一个简单的刷怪流程作为参考,最后这个一群小白人图片就直接用了他流程里的图。我按他流程简单跑了一遍,对研究Mass源码确实帮助很大。总的来说目前Mass框架已经做的比较完善了,但毕竟还处于体验阶段不建议正式项目使用,如果不加新的component,用蓝图不写C++完全可以玩。我本来想搞一个复杂一些类似刺客信条大革命,多级LOD的骨骼Mesh的NPC以及对应简模(下面这样),彻底用Mass这个框架做个深度测试,但是这段时间由于一些个人原因(生病)没有精力去做这件事了,不清楚深度使用会不会有什么坑,也希望看了这篇文章有兴趣的同学去尝试一下,如果碰到了坑可以一起交流。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Trait和Processor
  • Spawner
  • Schematic
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档