Based on the existing API, the AB package manager is organized to make it easier to load resources.
Four functions are provided: synchronous loading, asynchronous loading, single package uninstallation, and all package uninstallation.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class AB_Manager : SingletonAutoMono<AB_Manager>
{
private AssetBundle mainAB = null;
private AssetBundleManifest manifest = null;
private Dictionary<string, AssetBundle> abDic = new Dictionary<string, AssetBundle>();
private string PathUrl
{
get
{
return Application.streamingAssetsPath + "/";
}
}
private string MainABPath
{
get
{
#if UNITY_IOS
return "IOS";
#elif UNITY_ANDROID
return "Android";
#else
return "AB_Path";
#endif
}
}
public void LoadAB_And_Dependencies(string abName)
{
#region 1.先从主包中加载资源包依赖相关
if (mainAB == null)
{
mainAB = AssetBundle.LoadFromFile(PathUrl + MainABPath);
manifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
}
AssetBundle ab = null;
string[] strs = manifest.GetAllDependencies(abName);
for (int i = 0; i < strs.Length; i++)
{
if (!abDic.ContainsKey(strs[i]))
{
ab = AssetBundle.LoadFromFile(PathUrl + strs[i]);
abDic.Add(strs[i], ab);
}
}
#endregion
#region 2.加载完依赖后,再加载目标资源包
if (!abDic.ContainsKey(abName))
{
ab = AssetBundle.LoadFromFile(PathUrl + abName);
abDic.Add(abName, ab);
}
#endregion
}
#region 同步加载资源
public Object LoadRes(string abName, string resName)
{
LoadAB_And_Dependencies(abName);
Object obj = abDic[abName].LoadAsset(resName);
return obj;
}
public Object LoadRes(string abName, string resName, System.Type type)
{
LoadAB_And_Dependencies(abName);
return abDic[abName].LoadAsset(resName, type);
}
public T LoadRes<T>(string abName, string resName) where T : Object
{
LoadAB_And_Dependencies(abName);
return abDic[abName].LoadAsset<T>(resName);
}
#endregion
#region 异步加载资源
public void LoadResAsyncStart(string abName, string resName, UnityAction<object> callBack)
{
StartCoroutine(LoadResAsync(abName, resName, callBack));
}
public IEnumerator LoadResAsync(string abName, string resName, UnityAction<object> callBack)
{
LoadAB_And_Dependencies(abName);
AssetBundleRequest abr = abDic[abName].LoadAssetAsync(resName);
yield return abr;
if (abr.asset is GameObject)
{
callBack(Instantiate(abr.asset));
}
else
{
callBack(abr.asset);
}
}
public void LoadResAsyncStart(string abName, string resName, System.Type type, UnityAction<object> callBack)
{
StartCoroutine(LoadResAsync(abName, resName, callBack));
}
public IEnumerator LoadResAsync(string abName, string resName, System.Type type, UnityAction<object> callBack)
{
LoadAB_And_Dependencies(abName);
AssetBundleRequest abr = abDic[abName].LoadAssetAsync(resName, type);
yield return abr;
if (abr.asset is GameObject)
{
callBack(Instantiate(abr.asset));
}
else
{
callBack(abr.asset);
}
}
public void LoadResAsyncStart<T>(string abName, string resName, UnityAction<T> callBack) where T : Object
{
StartCoroutine(LoadResAsync<T>(abName, resName, callBack));
}
public IEnumerator LoadResAsync<T>(string abName, string resName, UnityAction<T> callBack) where T : Object
{
LoadAB_And_Dependencies(abName);
AssetBundleRequest abr = abDic[abName].LoadAssetAsync<T>(resName);
yield return abr;
if (abr.asset is GameObject)
{
callBack(Instantiate(abr.asset) as T);
}
else
{
callBack(abr.asset as T);
}
}
#endregion
public void AB_UnLoadSingle(string abName)
{
if (abDic.ContainsKey(abName))
{
abDic[abName].Unload(false);
abDic.Remove(abName);
}
}
public void AB_CleraAll()
{
AssetBundle.UnloadAllAssetBundles(false);
abDic = null;
mainAB = null;
manifest = null;
}
}