只要扫码下载资源的,可直接拖动到本文末尾。
这是我在今年的Unreal Fest Shanghai 2024上面做的分享:UE5(标识符, meta=(详解, 史上最全)),有兴趣的可以回头对照录播视频查看。为了让虚幻社区更多人也能尽快的访问下载到这些资源,因此在这里也发一遍。今天的主题,是介绍在UE中写C++码时经常遇见的标识符,比如Blueprintable,EditAnywhere类的,还有其他众多meta的作用,比如UIMin,UIMax。基本上只要你是个UE程序员必然遇到跟其相关的问题。在标题上我写了一个违反广告法词语:史上最全。我为什么敢于写下这个字眼,请大家听我接下来的讲解。最早为什么要做这个主题。说来话长,作为一个虚幻社区经理,我管理着总数1W多人的5个虚幻引擎方QQ群,时不时就会在群里看见小伙伴问各种标识符相关的问题。不知道你自己平常时候有没有遇见,想要实现一个功能,但又不确定引擎是否提供了某个标识符或meta已经实现了。或者看着一个标识符,名字一看就懂比如Blueprint Internal Use Only,一看就知道它是只在蓝图中使用的。但是什么时候用这个?该怎么用?实际上脑袋还是一片空白。既然网上没有现成的,那我能不能做一份UE5 C++中标识符和meta的系统整理呢?好像这并没有那么难的,只要把每个标识符找出来,研究清楚它的作用,配上示例代码和效果对比图就好了。然后我现在知道了,这就是一个巨深无比的大坑。于是我的专栏的更新就定格在了2022年的4月24。这两年来每逢被人催更,我都难以启齿然后泛起羞愧之情。一方面是确实是我不够勤快,另一方面是这些标识符和Meta也太多了吧!去年的Unreal Fest的时候,当时就已经搞了一年多了,进度大概在50%左右。所以今天其实是我终于能带着我搞了两年多的成果来分享给大家。基础概念
在最开始,我还是希望跟大家科普一下标识符和meta里能写些什么东西?以我们最常用的 PrintString为例:- 最左侧我称作标头,固定就这么几个宏,UCLASS,USTRUCT这些。
- 不同的标头面可以填写不同的标识符,可以填多个。但有些是互斥的,比如 BlueprintCallable了自然就不能再写BlueprintPure。我们只能用引擎定义好的这些选项,否则UHT报不识别的错误。
- 最复杂的要属于Meta的写法,特别的灵活。但归其本质就是个字符串的键值对。
- 如果不写值,这个值就作为空字符串处理。然后可以用HasMetaData判断是否存在。
- 如果值里面写true或false,也可以用GetBoolMetaData转换成bool自然的你也想到,里面可以写整数浮点数类的,也可以转成int,float。
- 值字符串还可以用逗号或者竖直线来分割,变成一个嵌套的字符串数组之类的。
- 在书写的时候,如果字符串内没有空格则也可以不写双引号。
- 标识符和meta的key是大小写不敏感的,但我仍然建议你为了更好的可读性,就依然还是按大小写区分来写。
- Meta最灵活的一点就是,其Key是可以自定义的,也就是说我们也可以在里面写上我们自己的Key和Value,然后在别的地方获取这些值来实现一些逻辑。也就是因为这个灵活性,引擎里一些模块常常就定义了一些自己的meta,因此meta总数才超过了300个。
之后,UHT会词法分析我们的代码。以MyActor.h为例,UHT会为之生成中间的.generated.h以及.gen.cpp其中类型系统相关的反射信息就都包含在这里面。最后,UBT把这些.h.cpp一起编译,最终生成我们的项目。具体的过程我之前专栏也写过详细的文章,这里就不再赘述了。
再具体一点说,标识符和meta中的信息经过UHT处理后,一方面运行时的信息是保存在类型系统中的各种Flags里标记,以及里面的额外成员变量。比如ClassWithinMetaData的信息是EditorOnly的,一些保存在UPackage下的UMetaData象里,另一些保存在FProperty下的MetaDataMap。知道这些有什么用?一方面你就知道从哪里获得你想要的数据。另一方面你后面如果需要在做一些扩展进阶功能时候,也知道到哪里设置修改这些数据。我自己在研究分析这些标识符的过程中,也写了一个工具来打印出这些信息。稍微细看一下这些类型信息,有各种Flags以及用小括号包起来的meta信息。虚幻引擎的运行时,还有编辑器里各种功能,底层都是基于这些数据信息才能良好地运行。在你使用标识符的时候,如果不知道有什么区别,也可以打印出来看看。这个打印工具不止可以打印出类的信息,还可以打印出对象的值,或者asset,package的信息,更多的功能就靠你自己探索啦。分类
UE5中的标识符和meta的数量,我收集到的,就总共有440个之多。因此分类就显得非常有必要。这是我为一个标识符编写的的标准页面。我在其他几百个标识符或meta的解释里也基本是这种组织方式。在最开头,有这个标识符的基本信息,让你一眼就能知道这个标识符是干嘛的。接下来,有更多的叙述进一步解释。但这还不够,学习的第一步是模仿。因此下面有示例代码让你直接抄,再下面有示例效果图可以让你一眼就能看到最终效果。如果你到此还有好奇心,最后一个部分我贴出了引擎源码中该标识符作用的关键代码。最后我决定把这些标识符和meta按照作用的引擎模块类,整合成一个列表。右图展示的是UCLASS下标识符的列表。一是可以直观的知道某一项内容是跟什么功能相关的,另一方面用一个大列表的方式也方便大家搜索。特别的,我还列了一项常用程度,方便你判断这一项是比较流行常用的功能,还是引擎犄角旮旯里不看也罢的内容。如前面所说,有些标识符已经失效了,但我想了想还是把它列在了这里,并给它一个可爱的骷髅头。以防有天你要查询这个标识符是干什么的,你能搜索到,至少得到了这是弃用的这个信息,而不是我漏掉了。这是GitHub里分享的所有解释说明的md文件,可以见到我是按照关联到的的引擎模块功能来划分的。这样的好处是有时好几个标识符都是跟某个功能相关,这样你就可以一下子了解到这个特性的所有相关标识符。- 首先,你可以在自己项目的代码里,为你的那些Class,Function,Property写自己的meta,然后在别的地方检测获取使用,从而实现专有的逻辑。这个可以帮你搭建游戏内一些专用编辑器或工具。
- 第二,你知道了引擎很多功能都是基于这些标识符和meta,因此你可以动态的根据你自己的需要去修改它们。只要对象、时机、值都正确,就能达到一样的效果。
- 第三,我们如果再大胆一点,引擎内建的一些功能组件上的数据也可以在外部通过反射的方式去动态修改,这在实现插件功能的时候有时候很有用,不需要去修改引擎的源码。
GitHub展示
这是我这个GitHub库地址,最近几天才填充东西进去。写个了简单的readme如图所示,Github Doc目录里,包含了所有文档的md文件。也提供了列表让你搜索。Project目录里有附带的示例C++代码以及蓝图。Tools目录包含用来生成PDF电子书的脚本和步骤。- 而且肯定的是,总共几百个标识符和meta,肯定有缺漏和错误的地方,欢迎大家跟我反馈,我会持续维护。
- 下一步我也计划用AI翻译一下,提供一个英文版老外。
PDF展示
有些朋友访问GitHub不是那么方便,或者想离线在自己的电脑里日常参考查看,因此我也特别制作了PDF版本,最后出来的页数连我自己都震惊到了。目前1.0版本竟然有779页。显然这个文档不是希望你一条条读下来的,连单纯滚动目录都得滚动半分钟。我的建议是你利用搜索功能或者左边的目录直接定位到你想要查看的标识符。下载
最后汇总成一页,大家现在就可以拿出手机直接扫码访问这些资源。左侧的是GitHub链接,包含所有的资源。也可以通过上面那个名字 UnrealSpecifiers 在GitHub搜索。右边的是PDF版本的电子书,包含了所有的标识符文档。希望你们喜欢。- GitHub/UnrealSpecifiers(https://github.com/fjz13/UnrealSpecifiers)
- UE5标识符详解 电子书(https://qr61.cn/oIkMiz/qUWRG5c)
声明
最后我也声明一下,我整理这些资源是为了免费开放提供给大家学习使用,欢迎大家扩散转发给有需要的人。但请不要用于商业用途售卖。谢谢大家。
扫描下方二维码,关注后点击菜单栏按钮“更多内容”并选择“联系我们”获得更多虚幻引擎的授权合作方式和技术支持。“虚幻引擎”微信公众账号是Epic Games旗下Unreal Engine的中文官方微信频道,在这里我们与大家一起分享关于虚幻引擎的开发经验与最新活动。