预备部分
实现部分
(1)加载方式一(未优化)
①同步加载方式一
using System.Collections;using System.Collections.Generic;using UnityEngine;/// <summary>/// 知识点/// 1.AB包先关的API/// 2.单例模式/// 3.委托 -> Lambda表达式/// 4.协程/// 5.字典/// </summary>public class ABMgr : SingletonAutoMono<ABMgr>{//AB包管理器 目的是:让外部更方便的进行资源加载//主包private AssetBundle mainAB = null;//依赖包获取用的配置文件private AssetBundleManifest manifest = null;/// <summary>/// AB包存放路径 方便修改/// </summary>private string pathUrl{get{return Application.streamingAssetsPath + "/";}}/// <summary>/// 主包名 方便修改/// </summary>private string MainABName{get{#if UNITY_IOSreturn "IOS";#elif UNITY_ANDROIDreturn "Android";#elsereturn "PC";}}//AB包不能够重复加载 重复加载会报错//字典 用字典来存储 加载过的AB包private Dictionary<string,AssetBundle> abDic = new Dictionary<string, AssetBundle>();//存储AB包容器//同步加载public Object LoadRes(string abName,string resName){//加载AB包if(mainAB == null){mainAB = AssetBundle.LoadFromFile(pathUrl + "PC");manifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//得到主包的配置文件}//获取依赖包相关信息AssetBundle ab;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);}}//加载资源来源包(如果没有加载过,再加载)if (!abDic.ContainsKey(abName)){ab = AssetBundle.LoadFromFile(pathUrl + abName);}//加载资源return abDic[abName].LoadAsset(resName);}}
②具体实现
void Start(){Object obj = ABMgr.GetInstance().LoadRes("model","Cube");Instantiate(obj);//一定要记得实例化}
(2)加载方式一(添加优化)
//为了外面方便 在加载资源时 判断一下 资源是不是GameObject//如果是 直接实例化了 再返回给外部Object obj = abDic[abName].LoadAsset(resName);if (obj is GameObject){return Instantiate(obj);}else return obj;
Object obj = ABMgr.GetInstance().LoadRes("model","Cube") as GameObject;obj.transform.position = Vector3.up();//得到后直接使用
(3)加载方式二(指定类型加载)
Object obj = ABMgr.GetInstance().LoadRes("model","Cube",typeof(GameObject)) as GameObject;obj.transform.position = Vector3.up();//得到后直接使用
(4)加载方式二(指定泛型加载)
Object obj = ABMgr.GetInstance().LoadRes<GameObject>("model","Cube");obj.transform.position = Vector3.up();//得到后直接使用
(5)以上方法汇总
using System.Collections;using System.Collections.Generic;using UnityEngine;/// <summary>/// 知识点/// 1.AB包先关的API/// 2.单例模式/// 3.委托 -> Lambda表达式/// 4.协程/// 5.字典/// </summary>public class ABMgr : SingletonAutoMono<ABMgr>{//AB包管理器 目的是:让外部更方便的进行资源加载//主包private AssetBundle mainAB = null;//依赖包获取用的配置文件private AssetBundleManifest manifest = null;/// <summary>/// AB包存放路径 方便修改/// </summary>private string pathUrl{get{return Application.streamingAssetsPath + "/";}}/// <summary>/// 主包名 方便修改/// </summary>private string MainABName{get{#if UNITY_IOSreturn "IOS";#elif UNITY_ANDROIDreturn "Android";#elsereturn "PC";}}//AB包不能够重复加载 重复加载会报错//字典 用字典来存储 加载过的AB包private Dictionary<string,AssetBundle> abDic = new Dictionary<string, AssetBundle>();//存储AB包容器/// <summary>/// 加载AB包/// </summary>/// <param name="abName"></param>private void LoadAB(string abName){//加载AB包if (mainAB == null){mainAB = AssetBundle.LoadFromFile(pathUrl + "PC");manifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//得到主包的配置文件}//获取依赖包相关信息AssetBundle ab;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);}}//加载资源来源包(如果没有加载过,再加载)if (!abDic.ContainsKey(abName)){ab = AssetBundle.LoadFromFile(pathUrl + abName);}}//同步加载 不指定类型public Object LoadRes(string abName,string resName){LoadAB(abName);//加载AB包//为了外面方便 在加载资源时 判断一下 资源是不是GameObject//如果是 直接实例化了 再返回给外部Object obj = abDic[abName].LoadAsset(resName);if (obj is GameObject){return Instantiate(obj);}else return obj;}//同步加载 根据type指定类型public Object LoadRes(string abName, string resName,System.Type type){LoadAB(abName);//加载AB包//为了外面方便 在加载资源时 判断一下 资源是不是GameObject//如果是 直接实例化了 再返回给外部Object obj = abDic[abName].LoadAsset(resName,type);if (obj is GameObject){return Instantiate(obj);}else return obj;}//同步加载 根据泛型指定类型public T LoadRes<T>(string abName, string resName) where T:Object{LoadAB(abName);//加载AB包//为了外面方便 在加载资源时 判断一下 资源是不是GameObject//如果是 直接实例化了 再返回给外部T obj = abDic[abName].LoadAsset<T>(resName);if (obj is GameObject){return Instantiate(obj);}else return obj;}//单个包卸载public void UnLoad(string abName){if(abDic.ContainsKey(abName)){abDic[abName].Unload(false);abDic.Remove(abName);}}//所有包的卸载public void ClearAB(){AssetBundle.UnloadAllAssetBundles(false);abDic.Clear();mainAB = null;manifest = null;}}
