*最近項目更新了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重新擺放物體等資訊)
...