Use Asset Registry Tags to Audit Content at Scale
Asset Registry tags are one of the fastest ways to expose QA-relevant metadata directly in the Content Browser and query it without loading assets. I use them to flag ownership, validation state, gameplay categories, and anything else the team needs to filter fast.
Overview
- Add custom tags from a UObject asset class
- Make the tag visible and searchable in the editor
- Query the tag from C++ without loading every asset
- Use the pattern for lightweight content QA checks
If your project has thousands of assets, QA falls apart when basic metadata lives only in naming conventions or spreadsheets. Asset Registry tags let you attach searchable metadata to assets so designers, tools programmers, and QA can filter content instantly in the Content Browser and in automation code.
Add Tags from Your Asset Class
The core pattern is overriding the asset-tag export path on your UObject-derived asset class. I usually expose fields like review status, gameplay family, owner, or validation version, then emit them as registry tags so they are available without fully loading the asset.
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "MyItemDefinition.generated.h"
UCLASS(BlueprintType)
class MYGAME_API UMyItemDefinition : public UPrimaryDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="QA")
FString OwnerTeam;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="QA")
bool bValidatedForRelease = false;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Gameplay")
FName ItemCategory;
#if WITH_EDITORONLY_DATA
virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag>& OutTags) const override;
#endif
};
#include "MyItemDefinition.h"
#if WITH_EDITORONLY_DATA
void UMyItemDefinition::GetAssetRegistryTags(TArray<FAssetRegistryTag>& OutTags) const
{
Super::GetAssetRegistryTags(OutTags);
// String tags are easy to filter in the Content Browser and in validation tooling.
OutTags.Add(FAssetRegistryTag(TEXT("OwnerTeam"), OwnerTeam, FAssetRegistryTag::TT_Alphabetical));
// Storing validation state as text keeps the filter syntax simple for non-programmers.
OutTags.Add(FAssetRegistryTag(
TEXT("ValidatedForRelease"),
bValidatedForRelease ? TEXT("true") : TEXT("false"),
FAssetRegistryTag::TT_Alphabetical));
OutTags.Add(FAssetRegistryTag(TEXT("ItemCategory"), ItemCategory.ToString(), FAssetRegistryTag::TT_Alphabetical));
}
#endif
Use the Tags in the Content Browser
Once the asset is resaved, Unreal indexes the tags into the Asset Registry. That gives you two immediate wins: custom columns in the Content Browser and filterable metadata for mass triage. For production QA, this is much faster than opening each asset to inspect properties manually.
- Open the Content Browser and enable Columns view
- Add your custom columns if they are available for the asset type
- Use search terms like ValidatedForRelease=true or OwnerTeam=Weapons
- Save filtered searches for repeatable review passes
Query Tags Without Loading Assets
The real QA value is querying metadata without loading every package. I use this pattern in editor utilities, commandlets, and validation tools to find missing states, wrong categories, or assets that skipped a review step.
#include "AssetRegistry/AssetRegistryModule.h"
#include "Misc/MessageDialog.h"
void AuditItemDefinitions()
{
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
FARFilter Filter;
Filter.ClassPaths.Add(UMyItemDefinition::StaticClass()->GetClassPathName());
Filter.bRecursiveClasses = true;
TArray<FAssetData> Assets;
AssetRegistryModule.Get().GetAssets(Filter, Assets);
for (const FAssetData& Asset : Assets)
{
const FString Validated = Asset.GetTagValueRef<FString>(TEXT("ValidatedForRelease"));
const FString Owner = Asset.GetTagValueRef<FString>(TEXT("OwnerTeam"));
// This audit runs on metadata only, so it scales well and avoids loading packages during broad checks.
if (!Validated.Equals(TEXT("true"), ESearchCase::IgnoreCase))
{
UE_LOG(LogTemp, Warning, TEXT("Unvalidated asset: %s Owner=%s"), *Asset.GetObjectPathString(), *Owner);
}
}
}
Good QA Uses for Registry Tags
- Mark assets that passed manual review or gameplay verification
- Track source ownership so broken content routes to the right team quickly
- Expose gameplay categories for coverage tracking in automation
- Store expected platform support flags for packaging audits
- Version validation rules so old assets can be rechecked after a pipeline change
Resave Assets After Adding New Tags
A common mistake is adding the override and expecting existing assets to show the tag immediately. The asset has to be resaved so the registry data updates. For large projects, I batch this with a resave commandlet instead of touching assets by hand.
"C:\Program Files\Epic Games\UE_5.3\Engine\Binaries\Win64\UnrealEditor-Cmd.exe" "D:\Projects\MyGame\MyGame.uproject" -run=ResavePackages -ProjectOnly -AllowCommandletRendering
# Resaving refreshes Asset Registry metadata so new tags appear in searches and tooling.
This is one of the lowest-cost ways to make a big Unreal project easier to audit. Once your assets expose the metadata QA actually needs, you can stop treating the Content Browser like a file explorer and start using it like a searchable test surface.
Source Reference
Inspired by a discussion on r/unrealengine (61 upvotes, 17 comments)