1. 程式人生 > >《搬磚日記》AssetsBundle實現資源更新及通過反射添加腳本

《搬磚日記》AssetsBundle實現資源更新及通過反射添加腳本

windows yield -c test 點擊 第一部分 sem dll all

該隨筆分兩部分,第一部分 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

技術分享圖片

《搬磚日記》AssetsBundle實現資源更新及通過反射添加腳本