在 UE 里给 UObject* 配表时,经常会看到Instanced的字段标记或是DefaultToInstanced的类标记, 他们可以控制这个字段是嵌入在当前配置数据中还是独立创建并引用在当前数据上。下面通过例子来讲解。
1.标记Instanced
一个很简单的敌人配置例子,一个继承UObject的字段代表基础数据,继承UDataAsset的字段代表UE配置数据。
#pragmaonce#include"CoreMinimal.h"#include"Engine/DataAsset.h"#include"EnemyDataTypes.generated.h"UCLASS(EditInlineNew,BlueprintType)classMYPROJECT_APIUEnemyData:publicUObject{GENERATED_BODY()public:UPROPERTY(EditAnywhere,BlueprintReadWrite,Category="Enemy")FText EnemyName;UPROPERTY(EditAnywhere,BlueprintReadWrite,Category="Enemy")int32 Level=1;};UCLASS(BlueprintType)classMYPROJECT_APIUEnemyDefinition:publicUDataAsset{GENERATED_BODY()public:UPROPERTY(EditDefaultsOnly,Category="Enemy Table")TArray<TObjectPtr<UEnemyData>>enemyDataArray;};现在没有标记Instanced,进UE创建DataAsset测试:
目前是需要引用一个对象状态,因为UEnemyData是UObject,需要更改为UDataAsset才可独立创建。
接下来加上Instanced标记:
UPROPERTY(EditDefaultsOnly,Instanced,Category="Enemy Table")TArray<TObjectPtr<UEnemyData>>enemyDataArray;进UE看下:
可以发现加上该标记已可以内嵌修改。
2.DefaultToInstanced
但为每个使用这个结构类的字段都加上Instanced标记未免太麻烦,可以在类上直接加上DefaultToInstanced标记,默认就让这个类是Instanced的,避免每次标记。
UCLASS(EditInlineNew,DefaultToInstanced,BlueprintType)classMYPROJECT_APIUEnemyData:publicUObject{运行后测试,仍然可直接编辑无问题。