UE4 AssetManager
介绍
UAssetManager是UE4提供给开发者的资源管理类,大家知道一般情况下UE4会自动加载和卸载资源,然而我们有些时候项目需要对资源有更多地掌控则就需要它来帮忙了。
Tip:UAssetManager本质是对StreamableManager的封装。
资源分类
PrimaryAsset(主资源)
在游戏中可以进行手动载入/释放的东西。包括地图文件以及一些游戏相关的物件,默认情况下只有Map是PrimaryAsset。
SecondaryAsset(次资源)
除了PrimaryAsset外都是,例如贴图声音等。SecondaryAsset都是跟随着PrimaryAsset自行加载的。所以一般代码中都是直接对PrimaryAsset进行加载无需关心SecondaryAsset。
将SecondaryAsset提升为PrimaryAsset
在资源类重载FPrimaryAssetId GetPrimaryAssetId()参数为对象类型和对象的资源名称。
对象类型推荐在UAssetManager类中定义FPrimaryAssetType类型的静态变量来定义资源类型。
AssetType注册方法
编辑器注册
如果需要在蓝图中引用该资源的话则需要在编辑器中Game=>AssetManager中进行AssetType的设置。可以进行下列参数的设置
-
PrimaryAssetType(必须和上面定义的FPrimaryAssetType类型的静态变量名称一致)
-
Asset base Class
-
HasBlueprint Classes
-
Directories
-
Rules
代码注册
编写UMyAssetManager继承UAssetManager重写 UAssetManager的StartInitialLoading 函数并从该处调用 ScanPathsForPrimaryAssets。因此,推荐您将所有同类型的主资源放入相同的子文件夹中。这将使资源查找和注册更为迅速。
ScanPathsForPrimaryAssets(TEXT("Flower"), TArray<FString>{"/Game/Path"}, UObject::StaticClass(), true);
ScanPathForPrimaryAsset(GameItem, TArray<FString>{"/Game/Path/Items"}, USGItems::StaticClass(), false);
这里还需要记得后续要将编辑器中Engine=>General Settings=>Asset Manager Class改为UMyAssetManager。
常用函数
-
LoadPrimaryAssets
-
LoadPrimaryAsset
-
LoadPrimaryAssetsWithType
-
UnloadPrimaryAssets
-
UnloadPrimaryAsset
-
UnloadPrimaryAssetsWithType
使用这些加载函数时,可指定一个资源束列表。以此法进行加载将使资源管理器按以上描述的方式加载这些资源束应用的次资源。
资源束
资源束(Asset Bundle) 是与主资源相关特定资源的命名列表。
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Display, AssetRegistrySearchable, meta = (AssetBundles = "TestBundle"))
用“AssetBundles”元标签可以对UObject 的TAssetPtr和FStringAssetReference 成员的 UPROPERTY 代码段进行标记即可创建资源束。
标志后UObject 被保存时将被添加到名为“TestBundle”的资源束。