新版本的包要發佈,用到的最多的策略就是熱更新,那麼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);
}
}