Unity資源熱更新之AssetsBundle

新版本的包要發佈,用到的最多的策略就是熱更新,那麼unity中AssetBundle的資源熱更新的方式是怎樣的呢?下面就給大家分享AssetBundle資源熱更新的方法


簡單實現功能

1.菜單欄中添加一個打包的按鈕

using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;  
using UnityEditor;  
using System.IO;  
public class CreateAssetsBundle{  
    [MenuItem("MyTool/CreateAssetsBundles")]  
    public static void CreateBundles()  
    {  
        //不能直接打包到Assets目錄下,下面的代碼提示路徑錯誤  
        //string pathTest = Application.streamingAssetsPath + "/AssetsBundles";  
        //這個是本地路徑Assets  
        string path="AssetsBundles";  
        if (!Directory.Exists(path))  
        {  
            Directory.CreateDirectory(path);  
        }  
        //打包 (路徑 打包時壓縮的方式(使用默認不作處理) 面向的平臺)  
            BuildPipeline.BuildAssetBundles(  
            path,  
            BuildAssetBundleOptions.None,  
            BuildTarget.StandaloneOSXIntel64);  
    }  
}  
2.設置要打包的遊戲物體

先把遊戲物體(Cube /Sphere)拖爲預製體


通過單擊打包按鈕可得如下文件


這是這個包的信息

把Hierarchy和預製體中的Cube和Sphere刪除,這樣可以減小我們工程的大小



3.把這個AssetsBundle放到本地服務器

在Mac搭建服務器

通過WWW來加載打包文件


using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;  
public class CreatAssets : MonoBehaviour {  
    //  // Use this for initialization  
    //  //本地加載  
    //  IEnumerator Start () {  
    //        AssetBundle ab = AssetBundle.LoadFromFile(  
    //            "AssetsBundles/m.assetsbundle"  
    //                        );  
    //        yield return ab;  
    //        Object[] objs = ab.LoadAllAssets();  
    ////        Instantiate(ab.LoadAsset<GameObject>("Cube"));  
    ////        Instantiate(ab.LoadAsset<GameObject>("Sphere"));  
    //       //每使用一次foreach會在堆中產生24bate字節文件,並且無法刪除,自能通過GC自動釋放  
    //       //使用GC,GC會服務所有的程序,會大大降低cup的性能,因此要減少使用foreach  
    //       foreach(Object item in objs)  
    //       {  
    //           Instantiate(item);  
    //       }  
    //        //false卸載掉所有已經使用     
    //       ab.Unload(false);  
    //}  
    public IEnumerator Start()  
    {  
        AssetBundle ab = null;  
        WWW www = new WWW("http://localhost//AssetsBundles/CubeSphere.assetsbundle");  
        yield return www;  
        if (!string.IsNullOrEmpty(www.error))  
        {  
            Debug.LogError(www.error);  
        }  
        else  
        {  
            ab = www.assetBundle;  
            Object[] objs = ab.LoadAllAssets();  
            foreach (var item in objs)  
            {  
                Instantiate(item);  
            }  
        }  
        ab.Unload(false);  
    }  
}  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章