天天看點

【unity系統子產品開發】Unity Assetbundle打包筆記

*最近項目更新了Unity5.5.2,順便更新了項目的ui打包,也更新一下這邊的筆記

首先打包分為兩部分,一部分是打包成Assetbundle包,一部分是從Assetbundle包解包出來成為可用的資源。

首先說第一部分 打包

所有資源都可以打包,甚至不是資源(一些資料)也可以打包,隻要你需要。

打包出來的東西都可以直接用,一個字型,一個Texture,一個Prefab,一個場景,都是一打出來成Assetbundle包就可以直接用,但是為什麼大家還是要各自開發自己的打包流程呢?

最重要的原因就是,如果不論什麼都直接打包,比如你在開發兩個UI界面,這兩個UI界面都用到同一個Texture,同一個Font,而你又各自打包兩個Prefab,這時在兩個bundle包裡就都會包含這個Texture和這個Font,也就是它重複存在占用了多一份記憶體。

是以為了解決這種問題,基本上每個項目都會在打包的時候把Texture,Atlas,Font等用到的相同資源剝離,記錄,之後再打包,等到用的時候再加載回來。

這就是每個項目自己的打包流程主要的開發工作。

而現在的unity版本(我們項目用的是unity5.3.5f)提供了剝離方法,以前的unity版本需要自己剝離。等下在下面講打包的時候兩種都會講到。(雖然你隻需要用一種,為了詳細 就兩種都講)

接下來講我們項目的打包流程。

首先打包一般的Texture,Atlas都比較簡單,有兩個是比較特殊需要獨立開發的情況

1.打包Panel(UI界面)

2.打包Scene(遊戲場景)

先來說一下打包Panel 

一個UI界面裡你會用到很多圖檔,很多字型,不管是Atlas或者Texture你都需要把這些剝離開來。

打包Panel我們使用自己的剝離方式。

假設現在有一個BattleUI.Prefab

下面是打包步驟。

1.清理資料,建立檔案夾(存放不同類型的檔案,如Texture、Atlas)

2.PrefabUtils.Instantiate執行個體化這個Prefab。

3.擷取這個執行個體化後的Prefab下的所有動态元件(這個看不同項目)

4.擷取這個GameObject上挂的所有NGUI腳本。(如果有動态元件,每個動态元件也要周遊所有NGUI腳本)

5.把NGUI腳本複制下來用一個類存放并挂載這個GameObject上,如:

Public Class PRefabHierarchyInfo:MonoBehavior
{
 public Transform[] transforms;
 public UILabel[] uilabels;
 public UIPanel[] uipanels;
 public UISprite[] uisprites;
}
           

6.把引用到的Texture、Atlas、Font、Panel(界面)記錄下來

7.把原本NGUI腳本女上引用到的Texture.Atlas全部置空

*步驟3-7的目的在于,把這個界面或者多個界面用到的Texutre、Atlas資訊來出來,統一處理,不然直接打包就會一個資源存在多份

8.把步驟6找到的所有資源打包BuildPipeline.Build(如果是Atlas不用CreateGameObject,其他要用PrefabUtility.CreatePrefab())(這裡還可以根據不同平台不同要求設定Atlas屬性等)

9.打包Panel

*原本想寫在這裡,發現東西太多另起一篇文章來記錄

*下面是更新新的打包ui方式連結

http://blog.csdn.net/chrisfxs/article/details/60136875

接下來是打包Scene

打包場景的目的是在于,把場景中的所有動态元件抽出來,把所有用到的Material和Shader分離并單獨打包

而我們打包場景的方式選擇現在unity的自動剝離方法(改AssetBundle名即會獨自打包(自動分離)(用AssetImporter類,改assetImporter.assetBundleName))

下面是打包步驟:

1.清除所有AssetBundleName

2.找到項目裡所有需要打包的Scene

3.找到每個Scene下的所有需要打包和需要獨立打包的東西(如Material、Shader)

4.擷取所有需要打包的物件的資源位址,一個場景寫一個Config檔案并存放到裡面

5.改每個scene的AssetBundleName

6.改每個需要單獨打包(剝離)的物件的AssetBundleName(如Shader、Texture、Material、GameObject(動态元件))

7.BuildPipeline.BuildAssetBundle()

打包系統會把重新改了AssetBundleName的物件剝離并獨自打包,剩餘的統一打成一個場景包

這樣就基本完成打包工作。

接下來是解包。

加載Panel

1.加載AssetBundle(AssetBundle.LoadFromFileAsync(path))

2.放入記憶體

3.在打開界面的時候執行個體化界面類,把資料還原。如,CDialog為界面類,CPanel為這個界面的資料類,把之前打包流程6-7記錄的Atlas和Font等資料重新指派回去

加載Scene場景

1.加載Config

2.加載場景Scene到記憶體

3.移步執行個體化Scene

4.加載Shader,Texture

5.加載Material

*4.5這兩個順序不能,因為之前打包有依賴關系,加載Material之前要先加載Shader、Texture

6.加載動态元件(根據之前的Config重新擺放物體等資訊)

...