Asset Status
This is another attempt of mine to learn more about the unreal engine editor. The idea is to create a way to set a “status” on an asset and then being able to filter it out using custom filters. It’s based on studying colleagues code and Unreal Engines editor extensions.
Preview
Assigning Asset Status using RMB menu
Once asset status is assigned, you can use the newly added filters to isolate them in the asset browser
Asset Status System – Unreal Editor Plugin
This plugin adds asset development tagging functionality directly into the Unreal Editor’s Content Browser.
1. Asset Status Enum Definition
Purpose: Defines asset lifecycle stages.
- None: Default, untagged
- Whitebox: Placeholder geometry
- WIP: Work in progress
- Final: Production-ready
- DoNotUse: Deprecated or invalid
UENUM(BlueprintType)
enum class EAssetStatus : uint8
{
None UMETA(DisplayName = "None"),
Whitebox UMETA(DisplayName = "Whitebox"),
WIP UMETA(DisplayName = "WIP"),
Final UMETA(DisplayName = "Final"),
DoNotUse UMETA(DisplayName = "Do not use"),
Count UMETA(Hidden)
};
2. Setting Asset Status Metadata
Purpose: Writes and persists metadata to identify asset state.
void UAssetAction::SetAssetStatus(UObject* Asset, EAssetStatus Status)
{
if (!Asset) return;
FString StatusString = GetStatusAsString(Status);
UPackage* Package = Asset->GetOutermost();
UMetaData* MetaData = Package->GetMetaData();
MetaData->SetValue(Asset, TEXT("AssetStatus"), *StatusString);
Package->MarkPackageDirty();
if (!UEditorAssetLibrary::SaveLoadedAsset(Asset))
{
UE_LOG(LogTemp, Error, TEXT("Failed to save asset %s"), *Asset->GetName());
}
FAssetRegistryModule::AssetCreated(Asset);
}
3. Context Menu Extension for Asset Status
Purpose: Adds right-click functionality in Content Browser for status tagging.
- InitCBMenuExtension() – Registers the custom menu.
- BuildAssetStatusMenu() – Adds submenu titled "Set Asset Status".
- AddAssetStatusOptions() – Creates status entries that call SetAssetStatus().
4. Setting Status from Context Menu
Purpose: Assigns status to all selected assets.
void FBUtilitiesModule::SetSelectedAssetsStatus(EAssetStatus Status, const TArray<FAssetData>& SelectedAssets)
{
for (const FAssetData& AssetData : SelectedAssets)
{
UObject* Asset = AssetData.GetAsset();
if (Asset)
{
UAssetAction::SetAssetStatus(Asset, Status);
}
}
}
5. Adding Asset Status Filters
Purpose: Enables filtering by development stage in the Content Browser.
CustomFiltersInstance->AddFrontEndFilterExtensions(CustomCategory, FilterExtensions);
6. Filter Matching with Asset Status
Purpose: Filters assets based on their metadata tag.
Assets are shown only if their AssetStatus matches the filter’s target value.