对于虚幻引擎中的某些内容,定义了USTRUCT structs类型特征。TStructOpsTypeTraits<T>它们提供了有关struct T.
USTRUCT我什么时候应该在项目中为我的自定义定义这些特征?*引擎内的使用示例:
struct TStructOpsTypeTraitsBase2
{
enum
{
WithZeroConstructor = false, // struct can be constructed as a valid object by filling its memory footprint with zeroes.
WithNoInitConstructor = false, // struct has a constructor which takes an EForceInit parameter which will force the constructor to perform initialization, where the default constructor performs 'uninitialization'.
WithNoDestructor = false, // struct will not have its destructor called when it is destroyed.
WithCopy = !TIsPODType<CPPSTRUCT>::Value, // struct can be copied via its copy assignment operator.
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
其用法如下
template<>
struct TStructOpsTypeTraits<FGameplayEffectContextHandle> : public TStructOpsTypeTraitsBase2<FGameplayEffectContextHandle>
{
enum
{
WithCopy = true, // Necessary so that TSharedPtr<FGameplayEffectContext> Data is copied around
WithNetSerializer = true,
WithIdenticalViaEquality = true,
};
};
Run Code Online (Sandbox Code Playgroud)
看起来,traits 是用于USTRUCT蓝图中使用的 s;并且它们是具有NetSerialize()功能的结构所必需的。我进行了抽查:
WithIdenticalViaEquality-> UScriptStruct::HasIdentical()->EStructFlags::STRUCT_IdenticalNative仅用于::IdenticalHelper()蓝图EStructFlags::STRUCT_NetSerializeNative用于错误消息(当在蓝图中使用结构时)以及在FObjectReplicator和FRepLayout中,其中需要存在此特征以进行自定义属性复制的描述TStructOpsTypeTraitsBase2似乎告诉我们,这些特征只有USTRUCT在蓝图中使用 s时才重要
类型特征以涵盖脚本结构的自定义方面
UnrealEngine还为其容器类定义了许多专门的特征(例如TTypeTraitsBase)。与 c++ type_traits 的比较可能是有意义的。
虚幻引擎 4 中的许多“开箱即用”功能(例如复制、初始化、序列化等)都依赖于每个类的特定信息。例如,这允许不同的类自定义如何序列化自己的数据。
对于从基类继承的类UObject,所有需要的信息都存储在属性中或由可重写的方法返回。例如,如果要自定义 UObject 派生类管理序列化的方式,只需重写其虚拟Serialize()方法即可。这足以让 UE4 在需要序列化类的实例时能够调用您的自定义实现。
UE4 中结构的问题在于它们不继承自公共基类/接口。所以UE4没有任何预声明的属性或方法可以调用。尝试调用未声明的方法当然会导致 C++ 中的编译错误。按照前面关于自定义序列化的示例 - UE4 通常无法在结构上调用 Serialize() 方法,因为其中一些/大多数结构不会具有此类方法,并且编译器会将其报告为错误。
TStructOpsTypeTraitsBase2就是上述问题的解决方案。您可以为自定义结构声明它的专门化,以告知 UE4 哪些方法可用。完成后,结合使用模板元编程和自动生成的代码,UE4 将能够调用此类方法来再次提供开箱即用的服务或允许您自定义默认行为。例如,声明WithSerializer = true您通知 UE4 您的结构有一个自定义Serialize()方法,这样 UE4 将能够在每次需要序列化您的结构实例时自动调用它。
TStructOpsTypeTraitsBase2不仅限于与蓝图一起使用的结构,还可以与USTRUCT()C++ 中使用的结构一起使用。
关于何时使用它,您需要声明一个自定义专门化,TStructOpsTypeTraitsBase2即当 UE4 在您的结构上的默认行为不是您想要的时(例如,您希望以不同的方式序列化其数据,而默认实现则序列化所有非瞬态数据)UPROPERTY()使用“标准”格式)。
虽然“形式”相似,但范围TStructOpsTypeTraitsBase2与 C++ 不同type_traits:type_traits编译器使用它来告知程序/程序员有关平台特征的信息。TStructOpsTypeTraitsBase2程序员使用它来通知 UE4 有关自定义结构的可用“额外”功能。