有没有办法从内容管理器获取的动画蓝图资源中获取class数据?

Is there any way to get the class data from the animation blueprint asset obtained from the Content Manager?

我有一个名为 UHandsAnimInstance 的自定义 C++ class :

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, BlueprintReadWrite, Category = Fingers)
        FRotator wrist;
}

它内部有一些自定义属性,它是动画蓝图资产的父级 class,如您在这张图片中所见:

Blueprint Animation Editor

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

Asset Location in Content Manager

我的主要问题是我想 select 来自 Content Manager 的对象,所以首先我尝试将其作为 属性 放入另一个 class(AActor class):

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

但是我不能select编辑器中的任何对象select或者:

Editor Selector Example

因此,我尝试在自定义 AActor class:

内的 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)
    }
}

问题是获得的资产的 class 是 UAnimBlueprint(这就是我将该资产转换为该类型的原因):

Main class of the obtained asset

但我无法做任何事情,既无法从该资产中获取 UHandsAnimInstance 对象:

Data from the UAnimBlueprint obtained variable

那么,我该怎么做才能从内容管理器中的蓝图对象中获取自定义 C++ class 所需的数据?

内容浏览器中的资源不是这些对象的真实“实例”。

如果您希望能够 select 内容浏览器中的资产类型并将其输入 属性,您将需要使用 TSubclassOf<UHandsAnimInstance> 类型。

这将为您提供 UClass* 资产类型。请记住,这不是一个实例。如果您想访问该类型的默认 属性 数据,您可以使用其 CDO(Class 默认对象)。可以直接从 UClass*.

访问 CDO

UHandsAnimInstance* MyHandsAnimCDO = Cast<UHandsAnimInstance>(MyClass->GetDefaultObject());

以上 CDO 需要转换为您的特定类型。然后您可以从那里访问任何 属性 默认值。不要修改或调用 CDO 上的非常量函数,它不是设计为一般意义上的可变的,因为它只是在运行时生成真实实例的模板对象。

如果您要查找 UHandsAnimInstance 的特定实例,您将需要找到已实例化的关联骨架网格体。