1. 程式人生 > >【小松教你手遊開發】【unity系統模塊開發】Unity Assetbundle打包筆記

【小松教你手遊開發】【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重新擺放物體等信息)

...

【小松教你手遊開發】【unity系統模塊開發】Unity Assetbundle打包筆記