有没有办法从内容管理器获取的动画蓝图资源中获取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
的特定实例,您将需要找到已实例化的关联骨架网格体。
我有一个名为 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*
.
UHandsAnimInstance* MyHandsAnimCDO = Cast<UHandsAnimInstance>(MyClass->GetDefaultObject());
以上 CDO 需要转换为您的特定类型。然后您可以从那里访问任何 属性 默认值。不要修改或调用 CDO 上的非常量函数,它不是设计为一般意义上的可变的,因为它只是在运行时生成真实实例的模板对象。
如果您要查找 UHandsAnimInstance
的特定实例,您将需要找到已实例化的关联骨架网格体。