关于AssetBundle、热更新、BestHttp

Unity3D研究院之Assetbundle的实战(六十三)

Unity3D研究院之Assetbundle的原理(六十一)

Unity官方公布热更新方案性能对比

U3D HTTP 最好用的插件BestHttp

ME_SLua

Slua 帮助

使用Slua框架开发创建Unity引擎中的对象

Unite 2016

AssetBundle下载:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class WWWManager : MonoBehaviour {
    public bool cache = false;
    private string address = "http://192.168.46.95/unity/ABs/cube";//目标是:cube文件捆绑资源
    /// 
    /// 要下载的assetBundle的url列表
    /// 
    public List assetBundleNames;
    /// 
    /// 最多maxCount个WWW一起下载
    /// 
    private int maxCount = 4;
    /// 
    /// string保存要下载的url,www保存下载实例
    /// 
    private Dictionary wwwDownloading = new Dictionary();
    void OnGUI()
    {
        if(GUILayout.Button("Load"))
        {
            StartCoroutine(Load(address));
        }
    }
    IEnumerator Load(string url)
    {
        Debug.Log(url);
        WWW www = null;
        if(!cache)
        {
            //普通下载
            www = new WWW(url);
        }
        else
        {
            //读取本地资源 或 下载至本地。
            www = WWW.LoadFromCacheOrDownload(url,0);
            //下载的资源可以通过Caching.CleanCache()全部删除
         
        }
        yield return www;//等待下载完成?
        //读取assetbundle中名为233cube的资源并解析为游戏对象
        GameObject prefab = www.assetBundle.LoadAsset("233Cube");//从cube文件捆绑资源里读取名为"233Cube"的游戏对象。
          yield return GameObject obj = GameObject.Instantiate(prefab);//实例化他,其余的不管
        www.assetBundle.Unload(false);//释放www资源,否则下次使用报错
        www.Dispose();//释放www资源,否则下次使用报错
    }
	// Use this for initialization
	void Start () {
        assetBundleNames.Add(address);
        assetBundleNames.Add(address);
	}
	
	// Update is called once per frame
	void Update () {       //在Update函数中通过WWW.isDone判断下载完成。

            foreach (var item in wwwDownloading)
            {
                if (item.Value.isDone)//如果www下载列表完成了。
                {
                    Debug.Log("完成一个!");
                    GameObject.Instantiate(item.Value.assetBundle.LoadAsset("233Cube"));
                    item.Value.assetBundle.Unload(false);
                    //卸载释放bundle中所有序列化数据。假,bundle内的序列化数据将被释放,但是任何从这个bundle中实例化的物体都将完好。
                    //为真,所有从该bundle中加载的物体也将被销毁。如果场景中有游戏物体引用该资源,那么引用也会丢失。
                    //这个函数有问题,加载完后需要1秒后再Unload。否则会丢失贴图等数据
                    item.Value.Dispose();
                    wwwDownloading.Remove(item.Key);//删除已经完成额下载
                    break;
                }
            }
        
        foreach(string s in assetBundleNames)
        {
            if(wwwDownloading.Count

关于关联:

如果关联的AsetBundle是Node会自动帮你关联。如果关联的是同一个包,可以直接Instance新对象,如果关联的不是同一个包。就要先下载、加载所依赖的资源。


如果关联的包不是Node。下面是下载、加载所有关联资源:

using UnityEngine;
using System.Collections;

using System.Collections.Generic;
public class NewBehaviourScript1 : MonoBehaviour {
    private string address = "http://192.168.46.95/unity/ABs/";//目标是:cube文件捆绑资源
    private string target = "cube";//要加载的目标
    private string manifestName;//资源清单名称
    private AssetBundleManifest manifest;//资源清单
    private List dependList = new List();//加载的所有资源
    void OnGUI()
    {
        if(GUILayout.Button("Load Manifest获取资源清单"))
        {
            StartCoroutine(LoadManifest());
        }
        if(GUILayout.Button("Load Depend下载关联"))
        {
            LoadDepend();
        }
        if(GUILayout.Button("Load Obj下载并加载目标_2336Cube"))
        {
            StartCoroutine(LoadObj());
        }
        if (GUILayout.Button("Clean_Caching.CleanCache()"))
        {
            Caching.CleanCache();
        }
    }
    IEnumerator LoadObj()
    {
        WWW www = WWW.LoadFromCacheOrDownload(address + target, manifest.GetAssetBundleHash(target));
        yield return www;
        GameObject.Instantiate(www.assetBundle.LoadAsset("2336Cube"));
        dependList.Add(www.assetBundle);
        www.Dispose();
        UnloadUnuseAssetBundle();
    }
    void UnloadUnuseAssetBundle()
    {
        foreach(var item in dependList)
        {
            item.Unload(false);
        }
    }
    void LoadDepend()
    {
        string[] dps = manifest.GetAllDependencies("cube");
        Debug.Log("cube依赖的文件:");
        foreach(var s in dps)
        {
            StartCoroutine(LoadAsset(s));
            Debug.Log(s);
        }
        
    }
    IEnumerator LoadAsset(string fileName)
    {
        WWW www = WWW.LoadFromCacheOrDownload(address + fileName, manifest.GetAssetBundleHash(fileName));
        yield return www;
        dependList.Add(www.assetBundle);//如果不把关联的放在变量里,自动垃圾回收会把它删除掉!
        www.Dispose();
    }
    IEnumerator LoadManifest()
    {
        WWW www = new WWW(address + manifestName);
        yield return www;
        manifest = www.assetBundle.LoadAsset("AssetBundleManifest") as AssetBundleManifest;
        www.Dispose();
    }
	void Start()
    {
        string[] ss = address.Split('/');
        manifestName = ss[ss.Length - 2];
    }
}


你可能感兴趣的:(关于AssetBundle、热更新、BestHttp)