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