属性声明
属性使用标准的C++变量语法声明,前面用UPROPERTY宏来定义属性元数据和变量说明符。
UPROPERTY([specifier, specifier, ...], [meta(key=value, key=value, ...)])
Type VariableName;
核心数据类型
整数
整数数据类型转换是"int"或"uint"后跟位大小。
| 变量类型 | 说明 |
|---|---|
| uint8 | 8位无符号 |
| uint16 | 16位无符号 |
| uint32 | 32位无符号 |
| uint64 | 64位无符号 |
| int8 | 8位有符号 |
| int16 | 16位有符号 |
| int32 | 32位有符号 |
| int64 | 64位有符号 |
作为位掩码
整数属性现在可以位掩码形式公开给编辑器。要将整数属性标记为位掩码,只需在meta分段中添加"bitmask"即可,如下所示:
/*~ BasicBits appears as a list of generic flags in the editor, instead of an integer field. */
UPROPERTY(EditAnywhere, Meta = (Bitmask))
int32 BasicBits;
添加此元标记将使整数作为下拉列表形式可供编辑,它们使用笼统命名标记("Flag 1"、"Flag 2"、"Flag 3"等等),可以 单独打开或关闭。
你也可以让蓝图可调用函数的整型参数表现为位掩码,方法是在参数的 UPARAM 指定器上添加 Bitmask 元标签(不需要值)。
/*~ You can set MyFunction using a generic list of flags instead of typing in an integer value. */
UFUNCTION(BlueprintCallable)
void MyFunction(UPARAM(meta=(Bitmask)) int32 BasicBitsParam)
为了自定义位标记名称,首先必须使用"bitflags"元标记来创建UENUM:
UENUM(Meta = (Bitflags))
enum class EColorBits
{
ECB_Red,
ECB_Green,
ECB_Blue
};
比特掩码枚举类型的范围是0到31,包括0和31。其对应于32位整型变量的位数(从第0位开始)。在上面的例子中,第0位是 ECB_Red,第1位是 ECB_Green,第2位是 ECB_Blue。
作为另一种声明方式,你可以使用 ENUM_CLASS_FLAGS 在定义完枚举类型后,将其变成一个位掩码。为了在编辑器中使用标志选择器(flag selector),我们还必须添加元字段 UseEnumValuesAsMaskValuesInEditor 并将其设置为 true。关键的区别在于,这个方法直接使用掩码值,而不是比特数。使用此方法制作的等效枚举类型看起来像这样:
UENUM(Meta = (Bitflags, UseEnumValuesAsMaskValuesInEditor = "true"))
enum class EColorBits
{
ECB_Red = 0x01,
ECB_Green = 0x02,
ECB_Blue = 0x04
};
ENUM_CLASS_FLAGS(EColorBits);
创建该UENUM后,可以使用"BitmaskEnum"元标记来引用它,如:
/*~ This property lists flags matching the names of values from EColorBits. */
UPROPERTY(EditAnywhere, Meta = (Bitmask, BitmaskEnum = "EColorBits"))
int32 ColorFlags;
完成这个更改后,下拉框中列出的位标记将使用列举类条目的名称和值。在上述示例中, ECB_Red 值为0,表示它被选中时将激活位0(将ColorFlags增加1)。ECB_Green对应于位1(将ColorFlags增加2),ECB_Blue 对应于位2(将ColorFlags增加4)。
同样,你可以在 UPARAM 标签的meta部分添加 BitmaskEnum 和对应的枚举类型名称来定制它。
/*~ MyOtherFunction shows flags named after the values from EColorBits. */
UFUNCTION(BlueprintCallable)
void MyOtherFunction(UPARAM(meta=(Bitmask, BitmaskEnum = "EColorBits")) int32 ColorFlagsParam)
虽然列举类型包含超过32个条目,但在属性编辑器UI中,位掩码关联中只会看到前32个值。同样,虽然可接受显式值条目,但显式值介于0-31的条目不会包含在下拉列表中。
浮点类型
虚幻使用标准C++浮点类型、浮点和双精度。
布尔类型
布尔类型可以使用C++ ool关键字表示或表示为位域。
uint32 bIsHungry : 1;
bool bIsThirsty;
字符串
虚幻引擎4支持三种核心类型的字符串。
- FString是典型的"动态字符数组"字符串类型。
- FName是对全局字符串表中不可变且不区分大小写的字符串的引用。相较于FString,它的大小更小,更能高效的传递,但更难以操控。
- FText是指定用于处理本地化的更可靠的字符串表示。
对于大多数情况下,虚幻依靠TCHAR类型来表示字符。TEXT()宏可用于表示TCHAR文字。
MyDogPtr->DogName = FName(TEXT("Samson Aloysius"));
有关这三种字符串类型、何时使用哪个类型以及如何使用它们的更多信息,请参阅字符串处理文档。
属性说明符
在声明属性时,可以将 属性说明符 添加到声明中,以控制属性如何处理引擎和编辑器的各项特性。
| 属性标签 | 效果 |
|---|---|
AdvancedDisplay |
该属性将被置于显示属性的任何面板的高级(下拉)分段中。 |
AssetRegistrySearchable |
AssetRegistrySearchable 说明符表示,此属性及其值将被自动添加到将此属性纳为成员变量的资产类实例的资产注册表中。 在结构体属性或参数上使用是不合法的。 |
BlueprintAssignable |
仅适用于组播委托。公开该属性,以便在蓝图中指定。 |
BlueprintAuthorityOnly |
此属性必须是组播委托。在蓝图中,此属性只接受标记为 BlueprintAuthorityOnly 的事件。 |
BlueprintCallable |
仅限组播委托。应公开属性以便在蓝图代码中调用。 |
BlueprintGetter=GetterFunctionName |
此属性指定自定义访问函数。如果此属性不带 BlueprintSetter 或 BlueprintReadWrite 标记,则暗指 BlueprintReadOnly 标记。 |
BlueprintReadOnly |
蓝图可以读取此属性,但无法修改。此说明符与 BlueprintReadWrite 说明符不兼容。 |
BlueprintReadWrite |
可以从蓝图读取或写入此属性。此说明符与 BlueprintReadOnly 说明符不兼容。 |
BlueprintSetter=SetterFunctionName |
此属性具有自定义变异函数,并被隐式标记为 BlueprintReadWrite 。请注意,变异函数必须被命名并且属于同一个类。 |
Category="TopCategory\|SubCategory\|..." |
指定在蓝图编辑工具中显示的属性类别。使用|运算符定义嵌套类别。 |
Config |
此属性将变为可配置。当前值可以保存到与类关联的 .ini 文件中,并在创建时加载。无法在默认属性中被赋值。暗指 BlueprintReadOnly 。 |
DuplicateTransient |
表示在任何类型的复制(复制/粘贴、二进制复制等)过程中,应将属性的值重置为类默认值。 |
EditAnywhere |
表示可以通过属性窗口在原型和实例上编辑此属性。此说明符与任何"Visible"类说明符都不兼容。 |
EditDefaultsOnly |
表示该属性可以通过属性窗口编辑,但仅限于在原型上编辑。此说明符与任何"Visible"类说明符都不兼容。 |
EditFixedSize |
仅对动态数组有用。这将阻止用户通过虚幻编辑器属性窗口更改数组的长度。 |
EditInstanceOnly |
表示此属性可以通过属性窗口编辑,但仅限于实例,而不能在原型上编辑。此说明符与任何"Visible"类说明符都不兼容。 |
Export |
仅对对象属性(或对象数组)有用。表示在复制对象(例如复制/粘贴操作)时,应将分配给此属性的对象作为子对象块完整导出,而不是仅输出对象引用本身。 |
GlobalConfig |
其运行方式与 Config 类似,只是你不能在子类中重载它。无法在默认属性中被赋值。暗指 BlueprintReadOnly . |
Instanced |
仅限对象(UCLASS)属性。当创建此类的实例时,将被赋予默认情况下分配给此属性的对象的唯一副本。用于实例化类默认属性中定义的子对象。暗指 EditInline 和 Export 。 |
Interp |
表示该值可由Sequencer中的轨道随着时间的推移而驱动。 |
Localized |
此属性的值将具有定义的本地化值。主要用于字符串。暗指 ReadOnly 。 |
Native |
属性是原生的:C++代码负责将其序列化并公开给垃圾回收。 |
NoClear |
防止编辑器将此对象引用设置为无。隐藏编辑器中的清除(和浏览)按钮。 |
NoExport |
仅对原生类有用。此属性不应包含在自动生成的类声明中。 |
NonPIEDuplicateTransient |
该属性将在复制期间重置为默认值,除非属性是为"在编辑器中运行(PIE)"会话而复制。 |
NonTransactional |
表示对此属性值的更改将不会包含在编辑器的撤消/重做历史记录中。 |
NotReplicated |
跳过复制。这仅适用于服务请求函数中的结构成员和参数。 |
Replicated |
该属性应通过网络复制。 |
ReplicatedUsing=FunctionName |
ReplicatedUsing 说明符指定了一个回调函数,当属性通过网络更新时执行该函数。 |
RepRetry |
仅适用于结构体属性。如果无法完全发送(例如,对象引用尚无法通过网络序列化),则重试复制此属性。对于简单引用,这是默认值,但对于结构体,考虑到带宽成本,这通常不可取,因此除非指定此标记,否则它会被禁用。 |
SaveGame |
此说明符可以用来轻松在属性级别显式包含检查点/保存系统的字段。应该在旨在作为已保存游戏一部分的所有字段上设置该标记,然后可以使用代理归档器来读取/写入该标记。 |
SerializeText |
原生属性应该被序列化为文本( ImportText 、 ExportText )。 |
SkipSerialization |
此属性不会被序列化,但仍可以导出为文本格式(例如用于复制/粘贴操作)。 |
SimpleDisplay |
可见或可编辑的属性,显示在 细节(Details) 面板中,无需打开"高级(Advanced)"分段即可看到。 |
TextExportTransient |
此属性不会被导出为文本格式(因此,不能用于复制/粘贴等操作)。 |
Transient |
属性是临时的,这意味着既不会被保存,也不会被加载。以此方式标记的属性将在加载时以零填充。 |
VisibleAnywhere |
表示此属性在所有属性窗口中可见,但不可编辑。此说明符与"Edit"类说明符不兼容。 |
VisibleDefaultsOnly |
表示此属性仅在原型的属性窗口中可见,并且无法编辑。此说明符与任何"Edit"类说明符都不兼容。 |
VisibleInstanceOnly |
表示此属性仅在实例的属性窗口中可见,在原型的属性窗口中不可见,并且不可编辑。此说明符与任何"Edit"类说明符都不兼容。 |
元数据说明符
声明类、接口、结构体、列举、列举值、函数,或属性时,可添加 元数据说明符 来控制其与引擎和编辑器各方面的相处方式。每一种类型的数据结构或成员都有自己的元数据说明符列表。
Metadata只存在于编辑器中。请不要编写能够访问到Metadata的游戏逻辑。
| 属性元标签 | 效果 |
|---|---|
AllowAbstract="true/false" |
用于 Subclass 和 SoftClass 属性。说明抽象类属性是否应显示在类选取器中。 |
AllowedClasses="Class1, Class2, .." |
用于 FSoftObjectPath 属性。逗号分隔的列表,表明要显示在资源选取器中的资源类类型。 |
AllowPreserveRatio |
用于 Fvector 属性。在细节面板中显示此属性时将添加一个比率锁。 |
ArrayClamp="ArrayProperty" |
用于整数属性。将可在UI中输入的有效值锁定在0和命名数组属性的长度之间。 |
AssetBundles |
用于 SoftObjectPtr 或 SoftObjectPath 属性。主数据资源中使用的束列表命名,指定此引用属于哪个束的一部分。 |
BlueprintBaseOnly |
用于 Subclass 和 SoftClass 属性。说明蓝图类是否应显示在类选取器中。 |
BlueprintCompilerGeneratedDefaults |
属性默认项由蓝图编译器生成,CopyPropertiesForUnrelatedObjects 在编译后调用时将不会被复制。 |
ClampMin="N" |
用于浮点和整数属性。指定可在属性中输入的最小值 N。 |
ClampMax="N" |
用于浮点和整数属性。指定可在属性中输入的最大值 N。 |
ConfigHierarchyEditable |
此属性被序列化为一个配置(.ini)文件,可在配置层级中的任意处进行设置。 |
ContentDir |
由 FDirectoryPath 属性使用。说明将使用 Content 文件夹中的Slate风格目录选取器来选取路径。 |
DisplayAfter="PropertyName" |
在蓝图编辑器中,名为 PropertyName 的属性后即刻显示此属性。前提是两个属性属于同一类别,则忽略其在源代码中的顺序进行显示。如多个属性有相同的 DisplayAfter 值和相同的 DisplayPriority 值,将在指定属性之后,按照自身在标头文件中声明的顺序显示。 |
DisplayName="Property Name" |
此属性显示的命名,不显示代码生成的命名。 |
DisplayPriority="N" |
如两个属性有相同的 DisplayAfter 值,或属于同一类别且无 DisplayAfter 元标签,则此属性将决定其顺序。最高优先级值为1,表示 DisplayPriority 值为1的属性将在 DisplayProirity 值为2的属性之上显示。如多个属性有相同的 DisplayAfter 值,其将按照在标头文件中声明的顺序显示。 |
DisplayThumbnail="true" |
说明属性是一个资源类型,其应显示选中资源的缩略图。 |
EditCondition="BooleanPropertyName" |
对一个布尔属性进行命名,此属性用于说明此属性的编辑是否被禁用。将"!"放置在属性命名前可颠倒测试。 EditCondition元标签不再不再局限于单个布尔属性。现在它使用一个功能完备的表达式解析器进行求值,这意味着你可以包含完整的C++表达式。 |
EditFixedOrder |
使排列的元素无法通过拖拽来重新排序。 |
ExactClass="true" |
结合 AllowedClasses 用于 FSoftObjectPath 属性。说明是否只能使用 AllowedClasses 中指定的准确类,或子类是否同样有效。 |
ExposeFunctionCategories="Category1, Category2, .." |
在蓝图编辑器中编译一个函数列表时,指定其函数应被公开的类目的列表。 |
ExposeOnSpawn="true" |
指定此属性是否应在此类类型的一个Spawn Actor节点上公开。 |
FilePathFilter="FileType" |
由 FFilePath 属性使用。说明在文件选取器中显示的路径过滤器。常规值包括"uasset"和"umap",但这些并非唯一可能的值。 |
GetByRef |
使该属性的"Get"蓝图节点返回对属性的常量引用,而不是其值的副本。只对稀疏类数据生效,只能在不存在 NoGetter 时使用。 |
HideAlphaChannel |
用于 Fcolor 和 FLinearColor 属性。说明详细显示属性控件时 Alpha 属性应为隐藏状态。 |
HideViewOptions |
用于 Subclass 和 SoftClass 属性。隐藏在类选取器中修改显示选项的功能。 |
InlineEditConditionToggle |
表示出布尔属性只内联显示为其他属性中的一个编辑条件切换,不应显示在其自身的行上。 |
LongPackageName |
由 FDirectoryPath 属性使用。将路径转换为一个长的包命名。 |
MakeEditWidget |
用于变换或旋转体属性,或变换/旋转体的排列。说明属性应在视口中公开为一个可移动控件。 |
NoGetter |
防止蓝图为该属性生成一个"get"节点。只对稀疏类数据生效。 |
ScriptName="DisplayName" |
在将此类、属性或函数导出到脚本语言时使用的名称。可以包含以启用的名称作为以分号分隔的额外条目。 |