vault backup: 2024-10-12 17:19:45

This commit is contained in:
2024-10-12 17:19:46 +08:00
parent ff94ddca61
commit 244c0c52f6
960 changed files with 31348 additions and 10 deletions

View File

@@ -0,0 +1,76 @@
# Export
- **功能描述:** 在对Asset导出的时候决定该类的对象应该导出内部的属性值而是对象的路径。
- **元数据类型:** bool
- **引擎模块:** Serialization
- **限制类型:** Object属性或Object数组
- **作用机制:** 在PropertyFlags中加入[CPF_ExportObject](../../../../Flags/EPropertyFlags/CPF_ExportObject.md)
- **常用程度:** ★
在对Asset导出的时候决定该类的对象应该导出内部的属性值而是对象的路径。
- 说明Object被复制时例如复制/粘贴操作指定到此属性的Object应整体导出为一个子Object块后文的例子里会看到其实就是也输出内部属性的值而非只是输出Object引用本身。
- 只适用于Object属性或Object数组因为是用在对象的导出的上的。
- 其实就是浅复制和深复制的区别。不标Export就是浅复制只输出对象路径。标上Export后是深复制也输出对象的内部属性。
## 示例代码:
```jsx
UCLASS(Blueprintable, BlueprintType)
class INSIDER_API UMyProperty_ExportObject :public UDataAsset
{
public:
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 MyValue = 123;
};
UCLASS(Blueprintable, BlueprintType)
class INSIDER_API UMyProperty_Export :public UDataAsset
{
public:
public:
GENERATED_BODY()
UMyProperty_Export(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
public:
//PropertyFlags: CPF_Edit | CPF_BlueprintVisible | CPF_ExportObject | CPF_ZeroConstructor | CPF_NoDestructor | CPF_HasGetValueTypeHash | CPF_NativeAccessSpecifierPublic
UPROPERTY(EditAnywhere, BlueprintReadWrite, Export, Category = Behavior)
UMyProperty_ExportObject* ObjectExport;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Behavior)
UMyProperty_ExportObject* ObjectWithoutExport;
};
```
配置的对象值:
![Untitled](Untitled.png)
主要是用在Export 操作的时候用来决定如何导出Object*属性的内容。NoExport的话是只输出对象引用的路径而Export的话会输出这个对象其再内部的的属性值。
![Untitled](Untitled%201.png)
导出的文本:
```jsx
Begin Object Class=/Script/Insider.MyProperty_Export Name="MyPropertyExportAsset" ExportPath=/Script/Insider.MyProperty_Export'"/Game/Property/MyPropertyExportAsset.MyPropertyExportAsset"'
Begin Object Class=/Script/Insider.MyProperty_ExportObject Name="EO1" ExportPath=/Script/Insider.MyProperty_ExportObject'"/Game/Property/EO1.EO1"'
"MyValue"=456
End Object
"ObjectExport"=/Script/Insider.MyProperty_ExportObject'"/Game/Property/EO1.EO1"'
"ObjectWithoutExport"=/Script/Insider.MyProperty_ExportObject'"/Game/Property/EO2.EO2"'
End Object
```
可以看到ObjectExport的对象也导出的字段值但是ObjectWithoutExport只有路径。
## 原理:
源码内作用的函数要注意一点的是要让Export标记在ExportProperties起作用export标记不能用在对象的sub object上否则会走ExportInnerObjects的调用路线。上面例子中ObjectExport和ObjectWithoutExport都是指向了外部的另外一个对象所以用DataAsset来产生资产。
```cpp
void ExportProperties()
{
FObjectPropertyBase* ExportObjectProp = (Property->PropertyFlags & CPF_ExportObject) != 0 ? CastField<FObjectPropertyBase>(Property) : NULL;
}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB