什么是反射
反射是程序在运行时检查自身,将参与反射的数据(变量,类,函数等等)暴露给蓝图,允许运行时去调用。
为了标记一个头文件包含反射类型,需要添加一个头文件"XXX.generate.h"
,必须放在头文件的尾部,该文件一般位于“Project\工程名\Intermediate\Build\Win64\ Inc\工程名\类名.generate.h”
#include "XXX.generate.h"
可以使用UENUM()、UCLASS()、USTRUCT()、UFUNCTION()、以及UPROPERTY()来在头文件中注解不同的类型以及成员变量。每一个宏都会出现在类型或者成员变量的前面,并且可以包含额外的修饰符关键字。
UCLASS() //标识类参与反射
UPROPERTY()//标识属性参与反射
UFUNCTION()//标识函数参与反射
GENERATED_CODE//反射后的结果放置位置
反射实例:
#include "MyObject.generated.h"//虚幻引擎将生成所有反射数据并将放入此文件
UCLASS(Blueprintable)//Blueprintable:此类可由蓝图延展
class UMyObject : public UObject
{
GENERATED_BODY()
public:
MyUObject();
UPROPERTY(BlueprintReadOnly, EditAnywhere)//BlueprintReadOnly:此属性只可从蓝图读取,不可写入
float ExampleProperty;//EditAnywhere:说明此属性可通过属性窗口在原型和实例上进行编辑
UFUNCTION(BlueprintCallable)//BlueprintCallable:公开属性在蓝图代码中调用
void ExampleFunction();
};
圾收集比较自动化,通过垃圾回收便无需手动删除 UObjects,只需维持对它们的有效引用即可。类须派生自 UObject,才能启用垃圾回收。
UCLASS()
class MyGCType : public UObject
{
GENERATED_BODY()
};
右键新建c++类后会出现两个新文件,一个.cpp格式的文件,一个.h格式的文件,其中.cpp文件是用来编写代码的,而.h文件是用来编写声明的,比如上面的反射和回收就是写在.h文件里面的。
classGroup
此关键字用于在编辑器中设置显示该类的actor组。
Within
UCLASS(Within=PlayerController)
声明此类的实例应始终具有指定类的外部。除非被覆盖,否则它由子类继承。
BlueprintType
将此类公开为可用于蓝图中变量的类型。
NotBlueprintType
防止此类用于蓝图中的变量。
Blueprintable
将此类公开为创建蓝图的可接受基类。
NotBlueprintable
指定该类不是创建蓝图的可接受基类。
MinimalAPI
此关键字指示该类应该在其模块外部可以访问,但是不需要导出所有方法。仅导出为dynamic_cast <>等工作所需的自动生成的方法。
customConstructor
防止自动生成构造函数声明。
Intrinsic
类直接在C ++中声明,并且没有UnrealHeaderTool生成的样板。请勿在新课程上使用此标志。
noexport
不会为此类创建自动生成的代码;标头仅用于解析元数据。请勿在新课程上使用此标志。
placeable
表明该类可在虚幻编辑器内进行创建并被放置在关卡,UI场景,或蓝图内(取决于该类类型)。此标识被传递到所有的子类中,子类可使用 NotPlaceable 关键字来重载该标识。
notplaceable
否定从基类继承的Placeable关键字。表示在虚幻编辑器中不可以将这个类放置到关卡等位置。
DefaultToInstanced
此类的所有实例均被视为“实例”。实例化的类(组件)在构造时被复制。该标志由子类继承。
Const
此类中的所有属性和函数都是const,应将其导出为const。该标志由子类继承。
Abstract
类是抽象的,不能直接实例化。
deprecated
不推荐使用此类,并且在序列化时不会保存此类的对象。该标志由子类继承。
Transient
此类无法保存;在保存时将其清空。该标志由子类继承。
nonTransient
此类应正常保存(它会取消继承的瞬态标志)。
config
在构造时加载对象配置。这些标志被子类继承。包含配置属性的类。用法config = ConfigName或config = inherit(继承自基类的配置名称)。
perObjectConfig
根据每个对象而不是每个类来处理对象配置。
configdonotcheckdefaults
确定是否在序列化为配置时应在base / defaults ini的基础上进行检查
defaultconfig
仅将对象配置保存到默认INI,而不保存到本地INI。
editinlinenew
这些会影响属性编辑器的行为。可以通过editinline新建按钮构造类。
noteditinlinenew
无法通过editinline“新建”按钮构造类。
hidedropdown
未在编辑器下拉列表中显示的类用于选择类。
showCategories
在属性查看器中显示指定的类别。用法:showCategories = CategoryName或showCategories =(category0,category1,...)
hideCategories
在属性查看器中隐藏指定的类别。用法:hideCategories = CategoryName或hideCategories =(category0,category1,...)
ComponentWrapperClass
表示此类是组件的包装器类,而组件的内部功能很少(如果该类在蓝图中被子类化,则将导致hideCategories和showCategories之类的东西被忽略)
showFunctions
在属性查看器中显示指定的函数。用法:showFunctions = FunctionName或showFunctions =(category0,category1,...)
hideFunctions
在属性查看器中隐藏指定的函数。用法:hideFunctions = FunctionName或hideFunctions =(category0,category1,...)
autoExpandCategories
指定应在属性查看器中自动扩展哪些类别。
autoCollapseCategories
指定应在属性查看器中自动折叠哪些类别。
dontAutoCollapseCategories
清除自动折叠类别的列表。
collapseCategories
在编辑器中显示属性,而不使用类别。
dontCollapseCategories
使用类别(默认行为)在编辑器中显示属性。
AdvancedClassDisplay
默认情况下,该类的所有属性都隐藏在主显示中,并且仅在高级详细信息部分中显示。
ConversionRoot
根转换将子类限制为只能转换为层次结构中第一个根类的子类。
Experimental
将该类标记为“实验性”(完全不受支持和未记录的原型)
EarlyAccessPreview
将该类标记为“抢先体验”预览(虽然尚未考虑生产准备,但已超出“实验性”一步,将作为将来的预览提供)
SparseClassDataType
有些属性每个类在sidecar结构中存储一次,而不是在类的实例中存储。
可在UCLASS中使用的元数据。
BlueprintSpawnableComponent
用于Actor组件类。如果存在,则表示可以由蓝图生成。
ChildCanTick
用于Actor和Component类。如果本机类不能打勾,则即使bCanBlueprintsTickByDefault为false,Blueprint生成的基于此Actor或Component的类也可以覆盖bCanEverTick标志。
用于Actor和组件类。如果本地类无法tick,那么可以覆盖基于此Actor或组件的蓝图生成类的 bCanEverTick 标签,即使 bCanBlueprintsTickByDefault 为false也同样如此。
ChildCannotTick
用于Actor和组件类。如果本地类无法tick,那么基于此Actor或组件的蓝图生成类则无法tick,即使 bCanBlueprintsTickByDefault 为true也同样如此。
IgnoreCategoryKeywordsInSubclasses
用于使类的第一个子类忽略所有继承的showCategories和hideCategories命令
DeprecatedNode
对于BehaviorTree节点,表明该类已弃用,并且在编译时将显示警告。
DeprecationMessage
DeprecationMessage="Message Text"
[ClassMetadata] [PropertyMetadata] [FunctionMetadata]与DeprecatedNode,DeprecatedProperty或DeprecatedFunction结合使用以自定义显示给用户的警告消息。
如果类已废弃,尝试编译使用此类的蓝图时,其将被添加到标准废弃警告。
DisplayName
[ClassMetadata] [PropertyMetadata] [FunctionMetadata]为该类,属性或函数显示的名称,而不是根据其名称自动生成的名称。
ToolTip
ToolTip="Hand-written tooltip"
覆盖从代码注释自动生成的提示文本。
ShortTooltip
ShortToolTip="Short tooltip"
完整提示文本过长时使用的简短提示文本,例如父类选取器对话。
ScriptName
[ClassMetadata] [PropertyMetadata] [FunctionMetadata]将类,属性或函数导出为脚本语言时要使用的名称。可以包括不赞成使用的名称,作为其他用分号分隔的条目。
IsBlueprintBase
IsBlueprintBase="true/false"
指定该类是创建蓝图的可接受基类。说明此类是否为创建蓝图的一个可接受基类,与 UCLASS 说明符、Blueprintable 或 'NotBlueprintable` 相似。
KismetHideOverrides
逗号分隔的蓝图事件列表,不允许在此类型的类中重写
ProhibitedInterfaces
指定与该类不兼容的接口。
RestrictedToClasses
由BlueprintFunctionLibrary类用于限制图形,可将库中的函数用于指定的类。
ShowWorldContextPin
说明放置在此类拥有的图表中的蓝图节点必须显式其World情景引脚(即使其通常状态下为隐藏也同样如此),因为此类的对象无法被用作World情景。
指示在将蓝图节点放置在此类拥有的图形中时,隐藏的世界上下文图钉应该可见,因为该类的自身上下文无法。
提供世界环境,必须手动将其连接。
DontUseGenericSpawnObject
不要使用“蓝图”中的“通用创建对象”节点来生成类的对象。仅对于既不是Actor也不是ActorComponent的BluprintType类,它才有意义。
ExposedAsyncProxy
在“异步任务”节点中公开此类的代理对象。
BlueprintThreadSafe
仅对蓝图函数库有效。将此类中的函数标记为在动画蓝图中的非游戏线程上可调用。
UsesHierarchy
指示该类使用分层数据。用于实例化详细信息面板中的分层编辑功能。
报错:
由于UE5使用了livecode进行热编译,热编译时只会编译本身项目的工程,不会编译第三方插件的代码,可以关闭掉livecode编译
再次生成,成功:
在安装引擎的路径下找到下面的文件
路径
E:\UE_5.0\Engine\Binaries\Win64
文件名 UnrealHeaderTool.target
用notepad++打开
在第二行添加一个空格
未修改前:
生成反射文件耗时很久
修改后:
只要没有修改内容,反射文件就不会重复生成,大大减少了时间的损耗。
PS:修改不需要关闭程序,修改后的第一次执行仍会生成反射文件,但是第二次及以后只要没有修改内容,反射文件就不会重复生成
并且是对不同版本的UE引擎都有效的,只要修改了一次,以后电脑上安装其他版本的引擎也不需要再进行修改了