备注:
- 当前没有AB包内存清理部分,后续会完善。
- 加载方式目前比较单一,不包含依赖加载。
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
namespace Common
{
public class AssetBundleMgr
{
private Dictionary<string, AssetBundle> assetBundlePool = new Dictionary<string, AssetBundle>();
public static AssetBundleMgr Instance = new AssetBundleMgr();
private AssetBundleMgr()
{
}
public T Load<T>(string fullPath, string assetName) where T : UnityEngine.Object
{
if (string.IsNullOrEmpty(fullPath))
{
Debug.LogError("Path can't be null or empty !");
return default(T);
}
if (string.IsNullOrEmpty(assetName))
{
Debug.LogError("Name can't be null or empty !");
return default(T);
}
AssetBundle ab;
if (assetBundlePool.TryGetValue(fullPath, out ab) && ab != null)
{
return ab.LoadAsset<T>(assetName);
}
try
{
var assetBundle = AssetBundle.LoadFromMemory(File.ReadAllBytes(fullPath));
assetBundlePool[fullPath] = assetBundle;
return assetBundle.LoadAsset<T>(assetName);
}
catch (Exception ex)
{
Debug.LogException(ex);
return default(T);
}
}
}
}
通过AssetBundleManifest获取所有的AB包名字和依赖信息:
private void LoadManifest()
{
var manifestAB = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/Plants/Plants");
var manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");// 固定格式
foreach (var item in manifest.GetAllAssetBundles())
{
Debug.Log(item);
}
var strs = manifest.GetAllDependencies("cube.assetbundle");
foreach (var item in strs)
{
Debug.Log("cube依赖的是:" + item);
}
}