aeestbundle基础

  1 using System.Collections;
  2 using System.Collections.Generic;
  3 using UnityEngine;
  4 
  5 public class LoadManager
  6 {
  7     #region 单例
  8     private static LoadManager instance;
  9     public static LoadManager Intance
 10     {
 11         get {
 12             if (instance == null)
 13             {
 14                 instance = new LoadManager();
 15             }
 16             return instance;
 17         }
 18     }
 19 
 20     #endregion
 21     private LoadManager() {
 22         abDic = new Dictionary<string, AssetBundle>();
 23         abPath = Application.streamingAssetsPath + "/AssetBundle/";
 24         singleABName = "AssetBundle";
 25     }
 26 
 27 
 28     /// <summary>
 29     /// 用来存储已经加载了的AB包,键是AB包的名字,值就是AB包。
 30     /// </summary>
 31     public Dictionary<string, AssetBundle> abDic;
 32 
 33     //用来存储单一的ab包。
 34     public AssetBundle singleAB;
 35 
 36     //单一的构建清单,所有的ab包的依赖全部从这获取。
 37     public AssetBundleManifest singleManifest;
 38 
 39     //存储ab包的路径
 40     public string abPath;
 41 
 42     //单一的ab包的名字
 43     public string singleABName;
 44 
 45     /// <summary>
 46     /// 加载单一的ab包和单一的构建清单
 47     /// </summary>
 48     void LoadSingleAssetBundle()
 49     {
 50         //每次加载单一的ab包需要判断是否加载过,
 51         //singleAB为null没加载过,不为null就是加载过
 52         if (null == singleAB)
 53         {
 54             singleAB = AssetBundle.LoadFromFile(abPath + singleABName);
 55         }
 56 
 57         //从单一的ab包中加载单一的构建清单
 58         if (singleManifest == null)
 59         {
 60             singleManifest = singleAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
 61         }
 62     }
 63 
 64     /// <summary>
 65     /// 加载指定ab包的所有的依赖项
 66     /// </summary>
 67     /// <param name="abName"></param>
 68     void LoadAllDependencies(string abName)
 69     {
 70         LoadSingleAssetBundle();
 71         //首先先获取指定的这个ab包的所有的依赖项
 72         //从单一的构建清单中获取
 73         string[] deps = singleManifest.GetAllDependencies(abName);
 74 
 75         //遍历去加载依赖项
 76         for (int i = 0; i < deps.Length; i++)
 77         {
 78             //加载该依赖项前,先判断之前加载没加载过该依赖项
 79             //就是判断存储ab包的字典里有没有这个ab包
 80             if (!abDic.ContainsKey(deps[i]))
 81             {
 82                 //如果未加载过,需要加载.
 83                 AssetBundle ab = AssetBundle.LoadFromFile(abPath + deps[i]);
 84 
 85                 //ab包加载完之后, 把加载来的ab包存储在字典里
 86                 abDic[deps[i]] = ab;
 87             }
 88           
 89         }
 90     }
 91 
 92     /// <summary>
 93     /// 加载指定的ab包,并且返回该ab包
 94     /// </summary>
 95     /// <param name="abName"></param>
 96     /// <returns></returns>
 97     public AssetBundle LoadAssetBundle(string abName)
 98     {
 99         //先加载该ab包的所有的依赖项
100         LoadAllDependencies(abName);
101 
102         //加载指定的ab包。
103         //加载前先判是否已经加载过,如果加载过,把加载过的ab包给你
104         //如果未加载过,就加载该ab包。
105         AssetBundle ab = null;
106         if (!abDic.TryGetValue(abName, out ab))//证明该ab包已经加载过
107         {
108             //如果进入到这,证明该键没有指定的值,那么证明该ab包未加载,需要加载
109             ab = AssetBundle.LoadFromFile(abPath + abName);
110             //把加载进来的ab包添加的字典中
111             abDic[abName] = ab;
112         }
113 
114         return ab;
115     }
116 
117     /// <summary>
118     /// 加载指定的ab包中的指定名字的指定类型的资源
119     /// </summary>
120     /// <typeparam name="T">指定资源的类型</typeparam>
121     /// <param name="abName">ab包的名字</param>
122     /// <param name="assetName">资源的名字</param>
123     /// <returns></returns>
124     public T LoadAssetByAB<T>(string abName, string assetName) where T : Object
125     {
126         //先获取指定的ab包
127         AssetBundle ab = LoadAssetBundle(abName);
128         if (ab != null)
129         {
130             //从ab包中加载指定的资源
131             return ab.LoadAsset<T>(assetName);
132         }
133         else
134         {
135             Debug.LogError("指定的ab包的名字有误!");
136         }
137         return null;
138     }
139 
140     /// <summary>
141     /// 卸载指定的ab包
142     /// </summary>
143     /// <param name="abName"></param>
144     public void UnloadAssetBundle(string abName, bool unloadAllLoadedObjects)
145     {
146         //先判断有没有这个ab包
147         AssetBundle ab = null;
148         if (abDic.TryGetValue(abName, out ab))
149         {
150             //卸载ab包
151             ab.Unload(unloadAllLoadedObjects);
152             //从容器中删除该ab包
153             abDic.Remove(abName);
154         }
155     }
156 
157     /// <summary>
158     /// 卸载全部的ab包
159     /// </summary>
160     /// <param name="unloadAllLoadedObjects"></param>
161     public void UnloadAllAssetBundle(bool unloadAllLoadedObjects)
162     {
163         //遍历每一个ab包,调用ab包的卸载的方法
164         //遍历键,通过键去获取值进行卸载
165         /*
166         foreach (var item in abDic.Keys)
167         {
168             //卸载ab包
169             abDic[item].Unload(unloadAllLoadedObjects);
170         }
171         */
172         //直接遍历值去卸载
173         foreach (var item in abDic.Values)
174         {
175             item.Unload(unloadAllLoadedObjects);
176         }
177 
178         //把字典所有内容清空
179         abDic.Clear();
180         
181     }
182 
183 
184 }
原文地址:https://www.cnblogs.com/cyct/p/10660874.html