Announcement

Collapse
No announcement yet.

Accessing static Game Data: DataAssets, ObjectLibrary, AssetManager, AssetRegistry

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Accessing static Game Data: DataAssets, ObjectLibrary, AssetManager, AssetRegistry

    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:

    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 AssetRegistry work outside the editor? This seems like a handy AssetRegistry example.

    Thanks for your help!
    Last edited by FunAndFriendly; 09-29-2020, 12:31 PM.

    #2
    Bump does anyone use static data in their games? Or do you design it into the actors themselves?

    Comment


      #3
      If you're trying to load blueprint assets, it works a little bit differently

      Code:
      TArray<FAssetData>AssetData;
      
      const FAssetRegistryModule &AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
      
      AssetRegistry.Get().GetAssetsByClass( UBlueprint::StaticClass()->GetFName() , AssetData , true );
      
      for (auto &myData : AssetData) {
      
          UBlueprint* BP = GetBlueprintFromCDO( myData.GetAsset() );
      
          /// ..
      }

      "true" param in GetAssetsByClass() is an important thing to note there.
      And there's no reason why this wouldn't work outside editor, AssetRegistry is a Runtime module.
      | Savior | USQLite | FSM | Object Pool | Sound Occlusion | Property Transfer | Magic Nodes | MORE |

      Comment

      Working...
      X