【小松教你手遊開發】【unity系統模塊開發】Unity Assetbundle打包筆記
首先打包分為兩部分,一部分是打包成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打包筆記