问题描述
我有一个名为 UHandsAnimInstance 的自定义 C++ 类:
UCLASS(transient,Blueprintable,hideCategories = AnimInstance,BlueprintType)
class SENSORIALSDK_API UHandsAnimInstance : public UAnimInstance
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = Fingers)
bool isRight = true;
UPROPERTY(EditAnywhere,Category = Fingers)
Frotator wrist;
}
它内部有一些自定义属性,它是动画蓝图资产的父类,如下图所示:
它位于这个位置:“/Game/SensorialXR/Blueprints/Gestures/RightHand”
Asset Location in Content Manager
我的主要问题是我想从内容管理器中选择该对象,所以首先我尝试将其作为另一个类(AActor 类)中的属性:
UPROPERTY(EditAnywhere,BlueprintReadWrite)
TArray<UHandsAnimInstance*> gestureData;
但我无法在编辑器选择器中选择任何对象:
因此,我尝试使用自定义 AActor 类中的 BeginPlay 函数中的此代码从 FString 参数加载所有资产,该参数是运行时所有 UHandsAnimInstance 的路径:
FString gesturesPath = "/Game/SensorialXR/Blueprints/Gestures/RightHand";
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
TArray<FAssetData> AssetData;
AssetRegistryModule.Get().GetAssetsByPath(FName(*gesturesPath),AssetData);
for (int i = 0; i < AssetData.Num(); i++) {
UAnimBlueprint* animx = Cast<UAnimBlueprint>(AssetData[i].GetAsset());
if (animx) {
//Do Something (like add to the gestureData list)
}
}
问题在于获取的资源的类是 UAnimBlueprint(这就是我将该资源转换为该类型的原因):
Main class of the obtained asset
但我不能做任何事情,也不能从该资产中获取 UHandsAnimInstance 对象:
Data from the UAnimBlueprint obtained variable
那么,我该怎么做才能从内容管理器中的蓝图对象中获取我想要的自定义 C++ 类的数据?
解决方法
内容浏览器中的资产并不是这些对象的真正“实例”。
如果您希望能够从内容浏览器中选择资产类型并将其输入到属性中,您将需要使用 TSubclassOf<UHandsAnimInstance>
类型。
这将为您提供资产类型的 UClass*
。请记住,这不是一个实例。如果您想访问该类型的默认属性数据,您可以使用其 CDO(类默认对象)。 CDO 可以直接从 UClass*
访问。
UHandsAnimInstance* MyHandsAnimCDO = Cast<UHandsAnimInstance>(MyClass->GetDefaultObject());
上述 CDO 需要转换为您的特定类型。然后您可以从那里访问任何属性默认值。不要在 CDO 上修改或调用非常量函数,它不是一般意义上的可变设计,因为它只是在运行时生成真实实例的模板对象。
如果您要查找 UHandsAnimInstance
的特定实例,则需要找到已实例化它的关联骨架网格体。