有什么办法可以从内容管理器获取的动画蓝图资产中获取类数据吗?

问题描述

我有一个名为 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;
}

它内部有一些自定义属性,它是动画蓝图资产的父类,如下图所示:

Blueprint Animation Editor

它位于这个位置:“/Game/SensorialXR/Blueprints/Gestures/RightHand”

Asset Location in Content Manager

我的主要问题是我想从内容管理器中选择该对象,所以首先我尝试将其作为另一个类(AActor 类)中的属性

UPROPERTY(EditAnywhere,BlueprintReadWrite)
    TArray<UHandsAnimInstance*> gestureData;

但我无法在编辑器选择器中选择任何对象:

Editor Selector Example

因此,我尝试使用自定义 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 的特定实例,则需要找到已实例化它的关联骨架网格体。