UE5 AssetManager类使用详解

打印 上一主题 下一主题

主题 1047|帖子 1047|积分 3141


前言

在 Unreal Engine 中,AssetManager 是资源管理的核心类,重要负责异步资源加载、卸载、主资源(Primary Assets)管理和资源审计等功能。以下是结合代码的详细阐明:

一、AssetManager 基础使用

1.1 初始化

在项目设置中启用 Asset Manager:

  • 打开 Edit > Project Settings > Engine > General Settings
  • 设置 Asset Manager Class 为自界说类(如 UMyAssetManager
  1. // 自定义 AssetManager 示例
  2. class MYPROJECT_API UMyAssetManager : public UAssetManager
  3. {
  4.     GENERATED_BODY()
  5. public:
  6.     virtual void StartInitialLoading() override;
  7. };
  8. void UMyAssetManager::StartInitialLoading()
  9. {
  10.     Super::StartInitialLoading();
  11.     // 初始化逻辑(如加载全局资源)
  12. }
复制代码
二、异步资源加载

2.1 基础异步加载

使用 LoadAssetLoadPrimaryAsset 异步加载资源:
  1. void LoadTextureAsync()
  2. {
  3.     FStreamableManager& Streamable = UAssetManager::GetStreamableManager();
  4.     FSoftObjectPath TexturePath(TEXT("/Game/Textures/MyTexture.MyTexture"));
  5.     TSharedPtr<FStreamableHandle> Handle = Streamable.RequestAsyncLoad(
  6.         TexturePath,
  7.         FStreamableDelegate::CreateUObject(this, &ThisClass::OnTextureLoaded)
  8.     );
  9. }
  10. void OnTextureLoaded()
  11. {
  12.     UTexture2D* LoadedTexture = Cast<UTexture2D>(
  13.         UAssetManager::GetStreamableManager().GetLoadedAsset(TexturePath)
  14.     );
  15.     UE_LOG(LogTemp, Warning, TEXT("Texture Loaded: %s"), *LoadedTexture->GetName());
  16. }
复制代码
2.2 批量加载资源

  1. TArray<FSoftObjectPath> AssetsToLoad;
  2. AssetsToLoad.Add(FSoftObjectPath(TEXT("/Game/Meshes/Weapon_Sword")));
  3. AssetsToLoad.Add(FSoftObjectPath(TEXT("/Game/Animations/Character_Idle")));
  4. FStreamableManager& Streamable = UAssetManager::GetStreamableManager();
  5. TSharedPtr<FStreamableHandle> Handle = Streamable.RequestAsyncLoad(
  6.     AssetsToLoad,
  7.     FStreamableDelegate::CreateLambda([](){
  8.         UE_LOG(LogTemp, Warning, TEXT("All assets loaded!"));
  9.     })
  10. );
复制代码
三、主资源(Primary Assets)

主资源是游戏中必要显式管理的核心资源(如角色、武器、关卡等)。
3.1 界说主资源类型

DefaultEngine.ini 中设置:
  1. [/Script/Engine.AssetManagerSettings]
  2. +PrimaryAssetTypesToScan=(PrimaryAssetType="Weapon", AssetBaseClass="/Script/Engine.Blueprint", Directories=("/Game/Blueprints/Weapons"))
复制代码
3.2 加载主资源

  1. void LoadPrimaryAsset()
  2. {
  3.     UAssetManager& Manager = UAssetManager::Get();
  4.     FPrimaryAssetId WeaponID("Weapon", "RocketLauncher");
  5.    
  6.     TSharedPtr<FStreamableHandle> Handle = Manager.LoadPrimaryAsset(
  7.         WeaponID,
  8.         TArray<FName>(),
  9.         FStreamableDelegate::CreateUObject(this, &ThisClass::OnWeaponLoaded)
  10.     );
  11. }
  12. void OnWeaponLoaded()
  13. {
  14.     UBlueprint* WeaponBP = Cast<UBlueprint>(
  15.         UAssetManager::Get().GetPrimaryAssetObject(WeaponID)
  16.     );
  17.     if (WeaponBP) {
  18.         AActor* SpawnedWeapon = GetWorld()->SpawnActor(WeaponBP->GeneratedClass);
  19.     }
  20. }
复制代码
四、资源释放

4.1 手动释放资源

  1. void UnloadAssets()
  2. {
  3.     FStreamableManager& Streamable = UAssetManager::GetStreamableManager();
  4.     if (Handle.IsValid())
  5.     {
  6.         Handle->ReleaseHandle(); // 释放加载句柄
  7.         Handle.Reset();
  8.     }
  9. }
复制代码
4.2 自动垃圾回收

  1. // 强制触发垃圾回收(慎用)
  2. GetWorld()->ForceGarbageCollection(true);
复制代码
五、高级功能

5.1 资源依赖扫描

  1. TArray<FName> Bundles;
  2. TArray<FSoftObjectPath> Assets;
  3. UAssetManager::Get().GetPrimaryAssetDependencies(WeaponID, Bundles, Assets);
复制代码
5.2 资源审计

  1. UAssetManager::Get().GetAssetRegistry().EnumerateAllAssets(
  2.     [](const FAssetData& AssetData) {
  3.         UE_LOG(LogTemp, Warning, TEXT("Found asset: %s"), *AssetData.AssetName.ToString());
  4.         return true;
  5.     }
  6. );
复制代码
留意事项


  • 路径格式:使用 FSoftObjectPathFStringAssetReference 避免硬编码路径。
  • 内存泄漏:确保释放 FStreamableHandle
  • 异步回调:避免在回调中执行耗时操作。
  • 主资源类型:在项目设置中正确界说主资源。
通过 AssetManager 可以实现高效的资源管理,尤其适合大型项目的资源动态加载需求

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表