【问题标题】:How to edit AssetRegistry tags with function?如何使用功能编辑 AssetRegistry 标签?
【发布时间】:2022-11-05 04:15:43
【问题描述】:

对于工作流程(以及学习目的),我尝试创建一个函数,以便我们可以将 AssetRegistry 标签添加到内容浏览器中的现有静态网格对象(来自 EditorUtilityWidget 或任何蓝图),因此能够通过这些标签对其进行排序,无需通过上下文菜单“资产操作”->“显示元数据”来查看它们(就像我们可以使用“设置元数据标签”-Editor Scripting Utilities 插件中的节点一样)。

ExpBl​​ueprintFunctionLibrary.h

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "ExpBlueprintFunctionLibrary.generated.h"


UCLASS()
class DP_API UExpBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintCallable, Category = "")
    static void AddCustomTag(UObject* Asset);

};

Exp蓝图函数库.c++

#include "AssetRegistry/IAssetRegistry.h"
#include "ExpBlueprintFunctionLibrary.h"
void UExpBlueprintFunctionLibrary::AddCustomTag(UObject* Asset)
{
    int32 NewParam = 454;
    static TArray<FAssetRegistryTag> AssetTags;
    Asset->UObject::GetAssetRegistryTags(AssetTags);
    AssetTags.Add(FAssetRegistryTag(
        "ExtraTag", 
        FString::FromInt(NewParam),
        FAssetRegistryTag::ETagType::TT_Numerical));
    for (const FAssetRegistryTag& AssetTag : AssetTags)
    {    
        UE_LOG(LogTemp, Log, TEXT("Tag : %s :: %s"), *AssetTag.Name.ToString(), *AssetTag.Value)
    }
    //Super::GetAssetRegistryTags(AssetTags);
}

我要添加到AssetRegistryTagsScreenshot 的标签列表

上面的代码实际上添加了标签,但它不在列表中,也没有过滤器搜索

输出日志:

LogTemp: Tag : Triangles :: 48
LogTemp: Tag : Vertices :: 54
LogTemp: Tag : UVChannels :: 2
LogTemp: Tag : Materials :: 1
LogTemp: Tag : ApproxSize :: 100x100x100
LogTemp: Tag : CollisionPrims :: 1
LogTemp: Tag : LODs :: 1
LogTemp: Tag : MinLOD :: 0
LogTemp: Tag : SectionsWithCollision :: 1
LogTemp: Tag : DefaultCollision :: BlockAll
LogTemp: Tag : CollisionComplexity :: CTF_UseSimpleAndComplex
LogTemp: Tag : AssetImportData :: []
LogTemp: Tag : LODGroup :: None
LogTemp: Tag : NeverStream :: False
LogTemp: Tag : ExtraTag :: 454

我有一种感觉,我必须以某种方式注册它并且不太明白我想念什么。

我在蓝图中连接它的方式BlueprintScreenshot

通过我能找到的一小部分示例,我们设法创建了一个自定义类对象并覆盖GetAssetRegistryTags,但它不适用于现有的静态网格实例:

。H

...
public:
        UPROPERTY(EditAnywhere, BlueprintReadOnly, AssetRegistrySearchable, Category = Max)
        int32 MaxCount;
    
        int32 DummyData;

.cpp

void UExpBlueprintFunctionLibrary::GetAssetRegistryTags(TArray<FAssetRegistryTag>& OutTags) const
{
    Super::GetAssetRegistryTags(OutTags);

    OutTags.Add(FAssetRegistryTag(
        "DummyData",
        FString::FromInt(DummyData),
        FAssetRegistryTag::ETagType::TT_Numerical
    ));
}

(这里非常感谢 Alex Stevens (@MilkyEngineer) 在他的tweetorial 中的解释)

这可能是我试图实现的目标吗?

PS:欢迎任何确切和概念性的解释,这将非常有帮助!我已经花了很多时间试图弄清楚它应该如何工作并且现在感觉有点绝望和无用

【问题讨论】:

    标签: c++ oop unreal-engine4


    【解决方案1】:

    您的代码不会在您传入的 UObject 上添加标签,它只是将标签添加到您的静态函数本地 AssetTags 数组中。

    我看到不需要覆盖UObject::GetAssetRegistryTags 的唯一方法是绑定到静态OnGetExtraObjectTags 委托并在回调中添加标签。这将要求您保留自己的数据结构,哪些标签应该添加到哪个对象。

    换句话说,您对AddCustomTag 的调用将在一些静态或单例映射上添加一个标签,为每个对象保留一组额外的标签,例如

    TMap<UObject*, TArray<FAssetRegistryTag>> ExtraTags;
    

    void UExpBlueprintFunctionLibrary::AddCustomTag(UObject* Asset)
    {
        int32 NewParam = 454;
        ExtraTags.FindOrAdd(Asset).Add(FAssetRegistryTag(
            "ExtraTag", 
            FString::FromInt(NewParam),
            FAssetRegistryTag::ETagType::TT_Numerical));
    }
    

    在回调中,您将检查传入的对象是否应该接收任何额外的标签:

    void UExpBlueprintFunctionLibrary::ModifyTags(const UObject* Obj, TArray<FAssetRegistryTag>& InOutTags)
    {
        if (const TArray<FAssetRegistryTag>* pTags = ExtraTags.Find(Obj))
        {
            InOutTags.Append(*pTags);
        }
    }
    

    请记住,在您保存资产之前,实际上不会添加标签。

    【讨论】:

      【解决方案2】:

      您能否分享有关向资产添加标签并保存它的完整示例代码?我试过了,但不幸的是它没有用......

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      相关资源
      最近更新 更多