《搬磚日記》AssetsBundle實現資源更新及通過反射新增指令碼
該隨筆分兩部分,第一部分 AssetsBundle實現遊戲物體和程式碼的打包,第二部分遊戲物體和程式碼的載入及通過反射新增指令碼
一. AssetsBundle打包
1.在Assets中新建資料夾Editor,並在Editor中新建C#指令碼,編寫以下內容,
using UnityEditor; using System.IO; public class CreatAssetsBundle { [MenuItem("AssetsBundle/Build AssetBundles")] static void BuildAllAssetBundles()//進行打包 { string dir = "AssetBundles"; //判斷該目錄是否存在 if (Directory.Exists(dir) == false) { Directory.CreateDirectory(dir);//在工程下建立AssetBundles目錄 } //引數一為打包到哪個路徑,引數二壓縮選項 引數三 平臺的目標 BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); } }
此時Unity選單欄中會多出
2.開啟VS新建類庫(我使用的是VS2015),注意使用 .NEt Framework3.5 高版本的Unity不支援
在專案中新建CubeTest.CS檔案,將測試指令碼內容編寫進去
此時會發現有報錯,是因為我們沒有新增Unity類庫的引用,右鍵引用為工程新增UnityEngine.dll引用,UnityEngine.dll引用在安裝目錄下的 /Unity/Editor/Data/Manager/UnityEngine.dll
然後生成解決方案,在輸出欄中可以看到生成的解決方案的所在路徑
我們將生成的.dll檔案字尾名改為.bytes並將檔案放入Unity專案中
3.專案中新建Cube並將Cube變成預製體,通過New 修改紅框中的內容
修改ABTest.bytes,注意要和Cube預製體的一樣
4.點選選單欄中AssetsBundle/Build AssetBundles,這時會在 AssetBundles 資料夾中生成我們自己定義的assetbundle檔案,其中 cubeab.ab是我們的資原始檔, cubeab.ab.manifest檔案是我們的配置檔案,用記事本開啟cubeab.ab .manifest檔案,可以看到我們打包的預製體
到此為止預製體和程式碼的打包就完成了
二. AssetsBundle載入及通過反射新增指令碼
1.將步驟一生成的 cubeab.ab和cubeab.ab.manifest檔案放入本地伺服器
2.新建Unity工程在空物體上新增 LoadAssetbundles.cs 指令碼
using UnityEngine; using System.Collections; using UnityEngine.Networking; using System.Reflection; using System; using System.IO; using System.Net; public class LoadAssetbundles : MonoBehaviour { IEnumerator Start() { //本地伺服器assetbundle檔案存放路徑 string path = "http://localhost/AssetBundle/cubeab.ab"; //通過WWW載入assetbundle檔案,1代表版本號 WWW www = WWW.LoadFromCacheOrDownload(path, 1); yield return www; //取得www中的assetBundle AssetBundle ab = www.assetBundle; //將.bytes檔案轉化為TextAsset TextAsset text = ab.LoadAsset("ABTest.bytes", typeof(TextAsset)) as TextAsset; //轉化為byte陣列 byte[] by = text.bytes; //通過反射獲取CubeTest類 Assembly am = Assembly.Load(by); Type type = am.GetType("CubeTest"); //將assetBundle中的物體加載出來放入陣列中 GameObject[] obj = ab.LoadAllAssets<GameObject>(); //在場景中生成assetBundle中的物體 foreach (GameObject o in obj) { Instantiate(o); } //給生成的遊戲物體新增 CubeTest指令碼 GameObject.Find("Cube(Clone)").AddComponent(type); } }
3.執行Unity