1.Asset Bundle
- 序列化文件(Serialized file):一般用於存儲預製體、模型、材質等在遊戲場景中渲染以後才能看見的東西
- 源文件(Resource file):一般用於存儲圖片、聲音等隨時可以看見的文件
2.指定Asset Bundle標籤
這是屬性面板右下角的面板,左邊的輸入框可以設置包的名稱,可以用“/”來劃分目錄,如:“mat”或者“resources/mat”,右邊的輸入框代表包的後綴,比如:u3d。
3.構建Asset Bundle目錄
- 新建一個腳本,這裏取名爲ABTest(這個腳本一定要放在Editor目錄下)
- 寫代碼
using UnityEditor;
using System.IO;
public class ABTest
{
//創建菜單欄選項
[MenuItem ("Tools/Asset Bundles/Build AssetBundles")]
static void BuildAssetBundle()
{
//相對於工程文件夾的路徑
string path = "Asset Bundles";
//判斷路徑是否存在,不存在則創建
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
//構建Asset Bundle包
BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
}
}
- 代碼解析
MenuItem這個程序集引用是在菜單欄中產生“Tools/Asset Bundles”並在之後產生一個“Build AssetBundles’按鈕,只要點擊這個按鈕就可以執行下面的方法。
Path路徑是“Asset Bundles”,這是相對於工程文件夾的路徑(注意:不是相對於Asset目錄的路徑),因爲我們只需要它在編輯器中執行就可以了,所以無需繼承MonoBehaviour並放到場景中。
構建Asset Bundle的核心代碼:
BuildPipeline.BuildAssetBundles(path,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
path是構建的Asset Bundle包保存的路徑,BuildTarget是打包的平臺,這個一定要注意,比如你要打包到安卓平臺,一定要寫BuildTarget.Android。BuildAssetBundleOptions以後再解釋,現在就這樣寫。
4.上傳的服務器
-
我們接下來是在本地操作,上傳到服務器有時間再說。
5.載入Asset Bundle
- 新建一個腳本,這裏取名爲ABSet吧
-
還記得我們之前創建的材質嗎?它叫“pige_mat“(爲什麼要提這個?之後你就知道了)。
在場景中新建一個立方體,取名爲“CubePrefab“,記住這個名字,然後把“pige_mat”這個材質賦予給“CubePrefab”,做成一個預製體(那麼預製體的名字就叫“CubePrefab“了)。
- 寫代碼
using UnityEngine;
public class ABSet : MonoBehaviour
{
void Start ()
{
//載入的Asset Bundle包的路徑,精確到文件名(帶後綴)
AssetBundle ab1 = AssetBundle.LoadFromFile("Asset Bundles/resources/mat.u3d");
AssetBundle ab2 = AssetBundle.LoadFromFile("Asset Bundles/resources/prefab.u3d");
//把Asset Bundle作爲GameObject載入
ab1.LoadAsset<GameObject>("pige_mat");
GameObject cube =ab2.LoadAsset<GameObject>("CubePrefab");
//實例化對象
Instantiate(cube);
}
}
- 代碼解析
-
從Asset Bundle解壓文件的核心代碼
AssetBundle.LoadFromFile("路徑");
注意該路徑一定要保證完整,連後綴名都要記住,該方法返回的值是AssetBundle,所以用一個AssetBundle類型的變量來存儲它。
ab.load<類型>(“文件名”)
遊戲場景中的物體類型以GameObject爲主,文件名注意不是Asset Bundle包的名稱,而是原來文件的名稱,建議這些文件在工程完成之前不要刪除,否則忘記名字就麻煩了。
- 補充
-
最後把這個腳本掛在遊戲場景中的物體上,如果要一次性解壓包裏的所有文件,可以用ab.LoadAllAsset(),這時用Object數組來存儲它,然後遍歷Object數組使得它們都實例化。