一、反射系统相关:
C++中并没有内置的反射系统,UE4有专属的反射系统负责采集数据。该系统负责合并C++数据与UE4系统数据,并在蓝图中显示。同时也负责垃圾回收。
垃圾回收相关:
与项目相关的程序管理器内存会自动删除无需再使用到的对象,这样便释放了内存。在UE4中的垃圾回收系统中 追踪着变量引用给定对象的数量,只要对象不再被变量引用,对象就会被删除。
类、变量、函数参与垃圾回收相关:
1.类参与UE4的垃圾回收系统,需要使用特定宏指令标记(宏指令是被赋予名称的特定代码片段)
解释:UE4中的UHT(虚幻头工具)是在项目编译时收集带有特定宏指令类信息的程序,当识别到特定宏指令时,会为类生成额外代码(可理解成 生成的额外代码将宏指令替换),反射系统就会工作,收集此类中的信息。
2.UCLASS宏指令位于所有类修饰的顶部,使用此宏指令来标记类就会被Garbage Collection系统回收垃圾。
3.变量必须使用UPROPERTY宏指令标记,才能参与反射系统。
4.函数必须用UFUNCTION宏指令标记,才能参与反射系统。
5.重点:需要将include写到文件顶部,名称为 .generated.h文件的类,
.generated.h文件的类包含了所有从类中为反射系统收集数据相关的代码。有了它可以进行反射和采集数据,可以命令垃圾回收,并将变量和函数反射至虚幻编辑器。
注意:只是反射至虚幻编辑器,并不能直接在蓝图中访问,需要进行额外的参数设置。
二、将类成员显示到蓝图:
注意:c++类的创建此文章中的示例是基于object类型为父类。如果是基于Actor为父类创建的类,在宏指令中的无需加入关键词就能被反射,因为在Actor中已经继承了反射所需要的属性。
1.创建基于此类的蓝图类。
注意:如果类名上方的宏指令的括号内没有关键词,在UE场景中创建基于此类的蓝图类是灰色的。所以想让类中的成员显示到蓝图,需要在宏指令的括号中加入关键词,关键词不能输入错误,否则无法识别。
UCLASS(Blueprintable)
保存后,在vs界面选择生成,完成编译。回到UE4,创建基于类的蓝图类,重命名为MyObject_BP并选择路径生成。
2.在c++类中声明的变量及函数在上方的宏指令中加入关键词,并在.cpp中进行变量和函数定义。完成后vs中生成,编译完成后到MyObject_BP蓝图中进行访问
变量:UPROPERTY(BlueprintReadWrite)
注意:想使用BlueprintReadWrite,就必须放在public下面。
函数:UFUNCTION(BlueprintCallable)
3.在MyObject_BP访问变量及函数
补充扩展:对变量及函数在蓝图中进行分类。在宏指令括号内,输入第二个分类参数并起名称,在蓝图中就会将变量和函数放置在对应的分类下。关键词决定了反射系统如何在蓝图中显示变量和函数。
变量:UPROPERTY(BlueprintReadWrite,Category="MyVariables")
函数:UFUNCTION(BlueprintCallable,Category="MyFunctions")