了解了Unity的打包方式以后,還需要面對(duì)一個(gè)問題,怎么組織我們的資源。
是一個(gè)資源打一個(gè)包,還是多個(gè)文件打成一個(gè)包,資源之間的依賴關(guān)系怎么處理。
可以針對(duì)資源類型一個(gè)個(gè)梳理打包方案,分析依賴關(guān)系,按類型打包。
通過AssetDatabase.GetDependencies(pathname)可以得到所有依賴文件。
Shader、Font資源
Shader基本被大部分需要繪制的資源有關(guān),所有可以把所有的Shader單獨(dú)打成一個(gè)Bundle
Font被所有UI資源文件引用,單獨(dú)打成一個(gè)公用Bundle
Texture資源
可以通過貼圖的長(zhǎng)寬,壓縮格式計(jì)算出最后的貼圖大小,按一個(gè)Bundle 1MB的標(biāo)準(zhǔn),count = 1MB / (width * height)。
Material資源
在分離貼圖后,材質(zhì)的數(shù)據(jù)非常小,可以不把材質(zhì)分離處理。如果分離材質(zhì)會(huì)有一個(gè)問題是在增量打包的時(shí)候需要把所有的Texture,PushDepend后才能打。這樣基本上是等于不增量,所以還是建議不去分離Material資源。
Mesh、Animation資源
同理可以按照大小、資源類型合并資源到一個(gè)Bundle里面去。比如區(qū)分Player,Npc這些資源。Mesh可以按場(chǎng)景或者角色分類,資源的面數(shù)做個(gè)大概了解即可。動(dòng)作可以區(qū)分是短動(dòng)作,還是長(zhǎng)動(dòng)作來打包。
Prefab資源
當(dāng)把Texture,Mesh,Animation等資源抽離打成共享包以后,可以發(fā)現(xiàn)剩下的一些文本數(shù)據(jù)非常小,基本可以把上百個(gè)Prefab打成一個(gè)Bundle。
NGUI資源
UI的資源依賴關(guān)系比正常的資源復(fù)雜,通用的處理方式并不是很合適。比如一個(gè)Common Atlas,Atlas包括一個(gè)材質(zhì)和圖素的UV坐標(biāo),里面存放了UI資源的基本元素。基本上所有的UI Prefab都會(huì)引用到這個(gè)圖集。如果修改這個(gè)圖集會(huì)導(dǎo)致所有的UI Prefab重新打包,這樣是不合理。所以可以單獨(dú)把Atlas抽離出來,這樣更新只用打一個(gè)Atlas包即可。由于Atlas抽離了Texture后很小,所有可以把所有的Atlas打成一個(gè)公用的Bundle。
資源解耦
除了依賴Unity提供的打共享包的方式外,還有一個(gè)方式是自身對(duì)資源做解耦。比如一個(gè)引用一個(gè)Prefab,可以把這個(gè)引用替換成Prefab路徑,然后再運(yùn)行的時(shí)候通過路徑去加載資源。對(duì)一個(gè)場(chǎng)景文件,通常是需要按這種方式對(duì)資源做解耦,即減少了依賴文件,也可以動(dòng)態(tài)加載場(chǎng)景模型。
通過PrefabUtility.GetPropertyModifications可以得到本地Prefab與場(chǎng)景Prefab的差異。修改其中不支持的,保存修改的支持屬性,比如坐標(biāo)、縮放。
結(jié)語
根據(jù)不同的資源類型與實(shí)際使用情況,來定制打包規(guī)則,基本上能得到較規(guī)整的AB資源。