当前位置: 首页 > news >正文

UE C++ 代码上构建反射

一. 反射如何具体到代码上

我们读了那么多反射的概念,反射的理念作用。但具体到代码上,总感觉空的,虚的。有神而没有行。今天我们就简单的从最基本的代码理解反射,这也是今天从一个视频上学来的,结合上最近反射的理论学习觉得很有意思。

二.首先构造None

1.这个是在UE里构建一个最简单的类,它本身是没有反射的。我们叫他SimpleClass

2.在这个类里面需要,修改它是个 空的C++类需要将它,改成有反射的类。首先是让它继承自UObject。所有需要反射的都要继承UObject,因为这样你才能使用里面设计好的反射基础。

但是必须要改名字不然,不符合规则,所以前面加个U。那原先生成好的构造,析构也要一并改掉。

#include "CoreMinimal.h"/*** */
class THIRDLEARN_API USimpleClass : public UObject
{
public:USimpleClass();~USimpleClass();
};

3.这样能用了吗?还不行。每一个基于UObject类的实现类,都有对应的UClass用于存元数据等反射数据。

所以就算你一个方法不反射,一个变量也不反射。你的类至少得反射。所以C++类上面加个UClass


#include "CoreMinimal.h"/*** */
UCLASS()
class THIRDLEARN_API USimpleClass : public UObject
{
public:USimpleClass();~USimpleClass();
};

拓展(无关紧要)

问题来了,什么是元数据。

元数据(Metadata) 是用来给类、属性、函数等添加额外描述信息的。它本质上是一些不会直接影响运行逻辑,但会被编辑器、蓝图系统、序列化、文档生成、插件系统等工具使用的标签或注解。

✅ 元数据的作用概述
元数据是“数据的附加说明”,用来告诉 UE 编辑器/蓝图/工具“如何展示”“如何行为”“是否隐藏”等。
————————————————
版权声明:本文为CSDN博主「二进制备忘录」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_64798796/article/details/148711166

UClass 到底是啥

UE 创建对象用的不是 new 关键字,而是 NewObject 方法。MyObj 对象的类型是 UMyObject ,同时还有个伴随对象用于实现对象自省;这个伴随对象存放在 UMyObject 类的变量内,伴随对象的类型就是大名鼎鼎的 UClass(获取 UClass 对象请参考:GetClass 和 StaticClass)。UClass 主要就是为了实现虚幻引擎中的反射(又名类型系统)

注意:类型系统不仅仅是 UClass 一个类就能实现,它对应的是一整套系统。UClass 只是用来描述 UObject 对象;结构体、枚举、方法也得有对应的类来描述,分别是 UScriptStruct ,UEnum ,UFunction;同时还有各种基础类型的属性也需要描述,它们的基类是 FField

既然 UClass 都被设计出来,本着不用白不用的原则,其它一些跟类相关的元素也往这里面放;比如:类的继承关系,类的元数据,垃圾回收 ReferenceSchema 等

综合以上,UClass 有以下用处:

  • 用于实现虚幻引擎中的反射系统(可用于 编辑器显示对象属性、序列化、性能优化和调试、蓝图脚本等调用C++方法等地方)
  • 记录类的继承关系和类的 CastFlags,用于类之间的 Cast 转换
  • 记录类的一些元数据,用于编辑器相关
  • 生成当前类型 CDO 并保留引用
  • 生成对象之间引用关系,用于垃圾回收

4.加了UClass后,还是不能用。因为那是运行时的反射,加载管理反射数据时用的。编译时,生成静态代码的反射你还没有,就是说生成基础代码C++给引擎用的你还缺。这部分就是 GENERATED_BODY()

#include "CoreMinimal.h"/*** */
UCLASS()
class THIRDLEARN_API USimpleClass : public UObject
{GENERATED_BODY()
public:USimpleClass();~USimpleClass();
};

 5.如果你觉得这个就完事大吉那你又错了,UHT 也生成了 .generated.h。每次改类或属性时会重新生成,反应最新的元数据。它也属于静态表,也生成代码。我粗糙的觉得,它和Generated共同写静态代码,就像补充好了头文件,和定义的关系。

#include "CoreMinimal.h"
#include "SimpleClass.generated.h"
/*** */
UCLASS()
class THIRDLEARN_API USimpleClass : public UObject
{GENERATED_BODY()
public:USimpleClass();~USimpleClass();
};

现在终于能编过了,如果你像构造一个UStuct。那这些步骤和这个一样,以前学UStruct觉得奇怪,现在看来那不过是反射需要的最基本的格式罢了。

http://www.dtcms.com/a/570508.html

相关文章:

  • 360建筑网官方网站网站运营编辑
  • 网站点赞怎么做邮箱域名和网站域名
  • 企业采购如何管理部门预算?
  • 三、ILA逻辑分析仪抓取及查看波形
  • asp.net网站本机访问慢网络运维需要懂什么技术
  • 网站的相关性 实用性网站建设项目登记表
  • 深圳本地做网站wordpress 文章列表只显示标题
  • notion模版 | 小胡的第二大脑[特殊字符]-任务篇
  • harmonyos的鸿蒙的跳转页面的部署
  • Godaddy优惠码网站怎么做的红豆梧州论坛
  • 商户查询缓存、商户更新缓存(opsForHash、opsForList、ObjectMapper、@Transactional、@PutMapping、RequestParam、装箱拆箱、线程池)
  • 做网站如何推销网站建设论证方案
  • 济南企业网站推广网络销售的工作内容
  • 大神自己做的下载音乐的网站域名是什么意思举个例子
  • Python中常用内置函数下【含代码理解】
  • QuickDruid
  • Java 文件上传-阿里云OSS对象存储
  • 国外 网站源码西部建设公司官网
  • 深圳做h5网站设计济南冰河世纪网站建设
  • 如何为公司做网站施工企业风险防控
  • 宁波市高等级公路建设指挥部网站wordpress建企业网站设置
  • 网站广告招商应该怎么做昆明大型网页开发企业
  • helmfile使用指南
  • 平谷做网站wordpress 百万ip
  • 网站开发兼职群网店装修网站
  • 网站开发设计资讯用php做图书管理网站
  • 博客建站系统设计网站p站
  • 有什么网站可以做简历深圳网站开发哪些
  • 如何做国外的电商网站设计企业网站建设费
  • RT-Thread 在SD卡实现ulog+时间戳保存不同日志方法