1. 程式人生 > >實力封裝:Unity打包AssetBundle(一)

實力封裝:Unity打包AssetBundle(一)

 說明:這是一系列循序漸進的教程,今天先介紹最簡單的AssetBundle打包方式。

這是一個由在Unity中需要載入模型而引發出來的一系列坑,為了填坑花了不少時間,如果有需要在Unity中自定義選單,或者建立視窗,擴充套件編輯器,特別是有需要打包AssetBundle包的筒子們,請看過來←_←

 在Unity中載入模型最簡單的方式是直接將模型檔案放到工程目錄下,然後拖進場景中。但是如果我們需要在程式執行時將網路或任意目錄下的模型載入到場景中,那麼我們只能自己編寫解析模型檔案的指令碼。因為Unity並沒有提供載入模型的API,也可能是沒有開放給使用者。這個過程很痛苦,而且總是有意想不到的錯誤,模型格式也千奇百怪。Unity自己的格式是.prefab檔案,也就是預製體,使用方便,也不會出錯,因為所有資源都打包在了一起。但問題是Unity載入Prefab的API只有兩個,一是Resource.Load,需要將prefab檔案放在Resource目錄下;二是AssetDatabase.LoadAssetAtPath,檔案必須在Assets目錄下。這就意味著網路上和其他資料夾下的prefab是無法載入的。

好,還有AssetBundle可以用,我們可以通過WWW載入AssetBundle,這樣就沒有檔案路徑的限制了。

那麼接下來的 問題就是如何打包AssetBundle了,在Unity5之前,可以通過BuildPipeline.BuildAssetBundle這個API來打AssetBundle包。但是很不幸,在Unity5之後,這個API就被廢棄了。Unity提供了一個新的API來打AssetBundle包。

public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);

要使用這個API打包還得費一番周折。首先要在你的工程中建立一個Editor資料夾(如果沒有的話),然後在Editor檔案下新建一個指令碼,名字自己定。然後輸入如下程式碼:

[MenuItem("AssetBundle/Package (Default)")]
private static void PackageBuddle() {
	Debug.Log("Packaging AssetBundle...");
	string packagePath = UnityEditor.EditorUtility.OpenFolderPanel ("Select Package Path", "F:/", "");
	if (packagePath.Length <= 0 || !Directory.Exists (packagePath))
		return;
	Debug.Log ("Output Path: " + packagePath);
	BuildPipeline.BuildAssetBundles (packagePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
	AssetDatabase.Refresh ();
}

儲存後切換到Unity,你就會看到你的Unity跟以前不一樣了。在選單欄多了一個叫做AssetBundle的選單,點開這個選單,還有一個叫Package (Default)的子選單,就是這麼神奇。點選Package (Default)選單,就會執行上面我們寫的PackageBundle函數了。不信你看Console視窗,已經有東西打印出來了。

說明一下:

第一,這個指令碼必須放在Editor資料夾下才會有效;

第二,使用[MenuItem("AssetBundle/Package (Default)")]建立選單時,必須有子選單,否則主選單會被忽略,不會建立。

第三,UnityEditor.EditorUtility.OpenFolderPanel這個API會彈出一個資料夾選擇視窗,返回你選擇的路徑。要注意BuildAssetBundles打包時不會建立資料夾,也就是說你必須保證你帶入的路徑是存在的,否則就會出錯。

現在打Asset包的功能就寫好了,下面的問題是怎麼用?

首先,點選某個prefab檔案,看圖↓


在Inspector面板的最下面有個預覽區域,就是在這裡設定哪些檔案需要打包的。

AssetBundle後面有個下拉按鈕,點選一下,看下圖↓


點選new,輸入名字,這就是這個檔案打包後的名字,後面第二個None是字尾名,可以不用填,但是如果填的話也要注意好像不是任意字串都行的。這也就是說AssetBundle包是沒有固定字尾名的,你可以輸入任何字尾名,也可以沒有後綴名,都能打包成功,也能正確載入。

說明:

只有AssetBundle後面名字不能None的檔案才會被BuildAssetBundles函式打包,為None的都不會打包。

當看到BuildAssetBundles函式時,我也一臉懵逼,引數中居然沒有可以輸入要打包檔案的地方??其實Unity是把這個引數移到Inspector面板中了,在呼叫BuildAssetBundles函式時,只要Inspector面板中設定了AssertBundle名字的檔案都會被打包。

設定完成以後,點選選單AssetBundle→Package (Default),你會看到出現了一個現實進度的視窗,這就是Unity正在打包檔案。

去你選擇的資料夾下,你可以看到多了四個檔案,AssetBundle包已經打包好了,下面解釋下這四個檔案,看圖↓


我是將它們打包在ksvk_prefab資料夾下,ksvk_prefab和ksvk_prefab.manifest是和資料夾相關的,沒啥用;ksvk_prefab.assetbundle和ksvk_prefab.assetbundle.manifest是我選擇的檔案打出的包,載入的時候直接載入ksvk_prefab.manifest檔案就行了。.manifest是清單檔案,裡面記錄了迴圈冗餘校驗(CRC)資料和捆綁檔案的依賴資訊等。

今天的教程就到這裡了,這才是剛剛開始,後面才是高能開啟。