1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 /// <summary> 6 /// LoadAssets打开某资源文件并加载其中的所有Prefab到场景中 7 /// </summary> 8 public class LoadAssets : MonoBehaviour 9 { 10 [HideInInspector] 11 public string address;//资源所在文件夹路径 12 public string fileToLoad;//资源文件名 13 private string manifestAssetBundleName;//Manifest文件,一般与所在文件夹名称相同 14 private AssetBundleManifest manifest; 15 private List<AssetBundle> assetBundles = new List<AssetBundle>(); 16 17 private void Awake() 18 { 19 if(address.Equals("")) 20 return; 21 //Manifest文件的名称与生成的AssetBundle所在的文件夹同名 22 string[] ss = address.Split('/'); 23 manifestAssetBundleName = ss[ss.Length - 2]; 24 LoadManifest(address + manifestAssetBundleName); 25 LoadDepend(fileToLoad); 26 27 } 28 void OnGUI() 29 { 30 if (address.Equals("")) 31 return; 32 //第1步:读取Manifest 33 if (GUILayout.Button("地图加载(选择map.unity3d)")) 34 { 35 StartCoroutine(LoadObj(address, fileToLoad)); 36 Caching.CleanCache(); 37 } 38 } 39 //同步下载并读取Manifest文件 40 public void LoadManifest(string mainfestpath) 41 { 42 //Debug.Log("LoadManifest:"+mainfestpath); 43 AssetBundle manifestBundle = AssetBundle.LoadFromFile(mainfestpath); 44 if (manifestBundle != null) 45 { 46 manifest = (AssetBundleManifest)manifestBundle.LoadAsset("AssetBundleManifest"); 47 } 48 } 49 //获取资源所依赖的资源并下载 50 void LoadDepend(string assetName) 51 { 52 string[] dps = manifest.GetAllDependencies(assetName); 53 for (int i = 0; i < dps.Length; i++) 54 { 55 StartCoroutine(LoadAsset(address, dps[i])); 56 } 57 } 58 //下载资源 59 IEnumerator LoadAsset(string url, string fileName) 60 { 61 //Debug.Log("LoadAsset:" + url+" "+fileName); 62 WWW www = WWW.LoadFromCacheOrDownload("file://" + url + fileName, manifest.GetAssetBundleHash(fileName)); 63 yield return www; 64 assetBundles.Add(www.assetBundle); 65 www.Dispose(); 66 } 67 //下载并实例化游戏对象 68 IEnumerator LoadObj(string url, string fileName) 69 { 70 //Debug.Log("LoadOBJ:" + url + " " + fileName); 71 72 WWW www = WWW.LoadFromCacheOrDownload("file://" + url + fileName, manifest.GetAssetBundleHash(fileName)); 73 yield return www; 74 string[] AssetsNames = www.assetBundle.GetAllAssetNames(); 75 foreach (string m in AssetsNames) 76 { 77 GameObject prefab = www.assetBundle.LoadAsset(m) as GameObject; 78 GameObject obj = GameObject.Instantiate(prefab); 79 } 80 81 assetBundles.Add(www.assetBundle); 82 www.Dispose(); 83 UnloadUnuseAssetBundle(); 84 } 85 //清理未使用资源所占用的内存 86 void UnloadUnuseAssetBundle() 87 { 88 foreach (var item in assetBundles) 89 { 90 item.Unload(false); 91 } 92 } 93 }