Hi, I’m loading some static game data using ObjectLibrary. ObjectLibrary’s comments say it’s better to use AssetManager, but I couldn’t figure out how to accomplish this. AssetRegistry is an editor subsystem and internet FUD said not to use it.
I subclassed UDataAsset adding some properties, then use the editor created those assets in some folders. So /Content/Data/Categories has 4 assets created from Category.h. In my GameState, I’m loading and caching them when accessed with GetCatagories(). That happens in this code:
void ATortillaRushGameState::GetCategories(TArray<UCategory*> &OutCategories)
{
if (!IsLoaded) LoadGameLibraryCaches();
for (UCategory* Item : CategoryCache)
{
OutCategories.AddUnique(Item);
}
}
void ATortillaRushGameState::LoadGameLibraryCaches()
{
TArray<UObject*> OutCache;
// Categories
// Clear the current cache
CategoryCache.Empty();
// Load Objects into OutCache (LoadObjectsFromPath empties OutCache)
LoadObjectsFromPath(UCategory::StaticClass(), TEXT("/Game/Data/Categories"), OutCache);
// Copy Categories into CategoryCache
for (UObject* Item : OutCache) CategoryCache.AddUnique(Cast<UCategory>(Item));
IsLoaded = true;
// Same for other caches
UE_LOG(LogTemp, Warning, TEXT("Loaded static assets: %d Categories, %d Upgrades, %d Ingredients, %d Recipes"), CategoryCache.Num(), UpgradeCache.Num(), IngredientCache.Num(), RecipeCache.Num());
}
void ATortillaRushGameState::LoadObjectsFromPath(UClass* InBaseClass, FString AssetPath, TArray<UObject*> &OutCache)
{
OutCache.Empty();
UObjectLibrary* MyObjectLibrary = UObjectLibrary::CreateLibrary(InBaseClass, true, GIsEditor);
TArray<FString> AssetPaths;
AssetPaths.Add(AssetPath);
MyObjectLibrary->LoadAssetDataFromPaths(AssetPaths);
// Query Results
TArray<FAssetData> AssetData;
MyObjectLibrary->GetAssetDataList(AssetData);
// Cache assets with Sync Load
for (FAssetData AssetDatum : AssetData)
{
OutCache.AddUnique(AssetDatum.GetAsset());
}
}
ObjectLibrary appears to work, but I ran all over the county trying to get AssetManager to work using PrimaryDataAsset and failed.
Did I misunderstand AssetManager’s use or purpose? I didn’t understand how to select the class (UCategory), or the path, or how to get the objects out. How could I get this to work with AssetManager?
Would AssetRegistrywork outside the editor? This seems like a handy AssetRegistry example.
Thanks for your help!