Unity-AB包
导入
PackageManager ——>Add ByName :"com.unity.assetbundlebrowser"
AssetBundleManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;public class AssetBundleManager : MonoSingleton<AssetBundleManager>
{//主包private AssetBundle abMain = null;//依赖信息的配置文件private AssetBundleManifest manifest = null;private Dictionary<string,AssetBundle> abDic = new Dictionary<string,AssetBundle>();//AB包存放路径,目前是在streamingAssets下private string pathURL{get{return Application.streamingAssetsPath + "/";}}//主包名private string abMainName{get{
#if UNITY_IOSreturn "IOS";
#elif UNITY_ANDROIDreturn "Android";
#elsereturn "PC";
#endif}}//同步加载(AB包不能重复加载)public Object LoadRes(string abName,string resName){LoadMainABPack();LoadDependences(abName);LoadTargetABPack(abName);//加载资源return abDic[abName].LoadAsset(resName);}private void LoadTargetABPack(string abName){//加载目标包if (!abDic.ContainsKey(abName)){AssetBundle abTarget = AssetBundle.LoadFromFile(pathURL + abName);abDic.Add(abName, abTarget);}}private void LoadDependences(string abName){//获取所有依赖信息string[] strs = manifest.GetAllDependencies(abName);if (strs.Length != 0){for (int i = 0; i < strs.Length; i++){//判断包是否被加载过if (!abDic.ContainsKey(strs[i])){AssetBundle ab = AssetBundle.LoadFromFile(pathURL + strs[i]);abDic.Add(strs[i], ab);}}}}private void LoadMainABPack(){if (abMain == null){abMain = AssetBundle.LoadFromFile(pathURL + abMainName);manifest = abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest");}}public T LoadRes<T>(string abName, string resName) where T : Object{LoadMainABPack();LoadDependences(abName);LoadTargetABPack(abName);//加载资源return abDic[abName].LoadAsset<T>(resName);}//异步加载public void LoadResAsync(string abName, string resName,UnityAction<Object> callBack){LoadMainABPack();LoadDependences(abName);LoadTargetABPack(abName);StartCoroutine(LoadResByAsync(abName, resName, callBack));}private IEnumerator LoadResByAsync(string abName, string resName, UnityAction<Object> callBack){AssetBundleRequest abr = abDic[abName].LoadAssetAsync(resName);yield return abr ;callBack.Invoke(abr.asset);}public void LoadResAsync<T>(string abName, string resName, UnityAction<T> callBack) where T : Object{LoadMainABPack();LoadDependences(abName);LoadTargetABPack(abName);StartCoroutine(LoadResByAsync<T>(abName, resName, callBack));}private IEnumerator LoadResByAsync<T>(string abName, string resName, UnityAction<T> callBack) where T:Object{AssetBundleRequest abr = abDic[abName].LoadAssetAsync<T>(resName); yield return abr;callBack.Invoke(abr.asset as T);}//单个包卸载public void UnLoad(string abName){if (abDic.ContainsKey(abName)){abDic[abName].Unload(false);abDic.Remove(abName);}}//所有包卸载public void UnLoad(){AssetBundle.UnloadAllAssetBundles(false);abDic.Clear();abMain = null;manifest = null;}
}