关于UE4反射的简单理解

反射是什么?

根据维基百科的定义,反射是指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力。
抽象的来说,反射就是程序在运行时动态获取对象信息以及调用对象方法的能力。
在UE4C++中 ,反射的的功能意义之一就是支持蓝图和C++的交互功能。可视化的体现就是,我们可以在UE4编辑器或蓝图中等让各种类,函数,成员变量,结构等在我们想出现的地方出现,在我们想使用的地方使用。
原生C++并不支持反射,UE4C++构建了一套反射系统,如在虚幻4中声明的任意一个类,都是继承于UObject类,使用这个类进行网络复制,执行垃圾回收,让他和蓝图交互等等。
UE4C++的应用体现之一便是 UCLASS() UPROPERTY() UFUNCTION()等宏

反射实现机制及原理

UE4C++中关于反射的工具
Unrael Header Tool(UHT):支持UObject系统的自定义解析和代码生成工具。
	代码里写的那些宏UCLASS等和#include “*.generated.h”都为UHT提供了信息来生成相应的C++反射代码。
	代码编译在两个阶段中进行:1.UHT 被调用。它将解析 C++ 头中引擎相关类元数据,并生成自定义代码,以实现诸多 UObject 相关的功能。2.普通 C++ 编译器被调用,以便对结果进行编译。)
	生成的代码存储在 Intermediates 目录下。
	UBT 会调用 UHT 生成的代码和原始 C++ 代码一起编译。
UnrealBuildTool(UBT):自定义工具,管理多个编译配置中的虚幻4源代码编译过程。
	Target.cs,Build.cs都是为这个工具服务的。
	平台相关的工程文件生成:GenerateProjectFiles.bat
	从 .build.cs 和 .target.cs 中生成 compiler 和 linker 的编译选项。

UBT和UHT两个协同工作来生成运行时反射需要的数据。UBT属性通过扫描工程目录下的所有 modules 和plugin,头文件,寻找哪些工程需要进行 rebuild,记录任何至少有一个反射类型的头文件的模块。如果其中任意一个头文件从上一次编译起发生了变化,那么 UHT就会被调用来利用和更新反射数据。
UHT分析头文件,创建一系列反射数据,并且生成包含反射数据的C++代码(放到每一个模块的moulde.generated.inl中。注:最新版会生成到moudle.generated.cpp中),还有各种帮助函数以及thunk函数(每一个 头文件 .generated.h)
generate.h”里面是宏,而且包含一个非常庞大的宏,这个宏把所有和反射相关的方法(包括定义)和结构体连接到一起。
“.generate.cpp”里面是许多的函数定义,UHT根据你在头文件里面使用的宏(UFUNCTION等)自动的生成这个文件,所以这个文件并不需要你去修改,也不允许修改。

反射类型和层次结构

UField
UStruct
    UClass (C++ class)
    UScriptStruct (C++ struct)
    UFunction (C++ function)

UEnum (C++ enumeration)

UProperty (C++ member variable or function parameter)

    (Many subclasses for different types)

在这里插入图片描述

热重载

在编辑器模式下,UE4将工程代码编译成动态链接库,这样编辑器可以动态的加载和卸载某个动态链接库。UE4为工程自动生成一个cpp文件(本工程为HelloUE4.generated.cpp),cpp文件包含了当前工程中所有需要反射的类信息,以及类成员列表和每个成员的类型信息。在动态链接库被编辑器加载的时候,自动将类信息注册到编辑器中。反之,卸载的时候,这样类信息也会被反注册。
​ 在开发的过程中,当我们编译完成工程的时候,UE4编辑器会自动检测动态链接库的变化,然后自动热重载这些动态链接库中的类信息。

反射代码实例分析

UE4引擎启动时候,是分Module(dll)来构建类型信息的。Module采用模拟一般程序的构建流程的方法,大致需要以下几个阶段:生成、收集、注册、链接。

生成阶段:借助UHT(Unreal Header Tool)工具,生成UClass代码,包括UClass构造,注册属性和函数等;
收集阶段:利用Static自动注册方式,在模块加载的时候,将所有UClass登记,集中在Array管理;
注册阶段:在模块初始化的时候,将Array中的所有UClass相关的Function和Property注册;
链接阶段:就是反射功能。
详细传送门

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值