下载某资源文件并加载其中的所有Prefab到场景中

 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 }

 

posted @ 2017-03-29 10:59  露夕逝  阅读(546)  评论(0编辑  收藏  举报