Unity3D動態下載資源,有沒有解?有,AssetBundle就是通用解,任何一本書都會花大幅篇章來介紹AssetBundle.
我們也來說說AssetBundle
我們試全面的分析一下Unity3D提供的資源加載機制
1.Resources//內嵌資源,使用方法Resources.Load,可以加載任意種類的資源,不能動態修改,卒。
2.StreamingAssets//隨包資源,使用方法IO或WWW.Load。WWW.Load可以加載任意種類資源,IO僅限bytes 和 text。
3.WWW 從網絡下載並加載
4.WWW 從網絡加載AssetBundle
一和二顯然不具有熱更新的效果,這里就不做討論。
3 4都是從網絡加載,他們有什么區別呢。
首先說3,這是沒有緩存的,我們顯然不想讓用戶重復的浪費流量,不可取。
然后是4,assetBundle提供了一個版本號來做緩存比對,可以比較好的起到更新的目標
assetBundle原來就是Unity3D為我們准備的解決方案,難怪每本書都會大篇介紹AssetBundle,后文簡稱AB。
每本書都告訴你,AB很強大,AB幫你解決了跨平台問題,幫你解決了依賴關系。
而這個系列,不打算只講別人講的東西,我們要告訴你一些小秘密。
AssetBundle是天使還是惡魔
首先AB的確很好很強大,他能收納Unity自己的所有資源種類,貼圖、材質、shader、預設。
然后可以每平台支持,這就是第一個陷阱,注意是每平台支持,不是多平台支持。
每個平台要單獨導出,而每個平台到底差了些什么呢?答案是,nothing。
那么為什么每個平台要單獨導出呢?因為Unity考慮到每個平台的質量關系,進行了質量相關的差異化。
而最大的質量差異,源自貼圖。
有些平台貼圖不壓縮,有些平台貼圖要壓縮,而且根據不同的平台特性,套用不同的壓縮算法,先壓過再存到包里。
這就是AB幫你干的最主要的事情。
聽起來很貼心呢,等等,你是不是忘了一個特定的命題,這個命題叫做UI。
壓縮的圖片會有質量損失,UI貼圖我們通常是不壓縮的。
然后UI還會觸及到AB的另一個問題
以NGUI為例,NGUI的資源關系比較復雜,有貼圖-》圖集-》布局
不同布局經常交叉引用貼圖
如果用AB想把每個界面分開打包,給用戶最小的資源更新量,這個任務可以用災難來形容。
最終熱更新推送給用戶的東西是以文件為單位的,而AB在小粒度文件並且之間有較為復雜的引用關系這種需求下的使用是一場災難。
AB對每個平台的差異編譯不是可選的,而是強制的,假如你有web、ios、android三個平台,無論如何你都要導出三次。
沒了AssetBundle,我們怎么辦
把碎片文件下載回來,並且組裝
對於UI這個情境,是完全可行的。把布局和圖集保存為文本形式,把文本和貼圖下載回來,然后組裝。
對於其他的場景片段,在有動畫和貼圖需要壓縮的情況下,AB依然是唯一選擇。
unity沒有提供在運行時壓縮貼圖的手段,動畫也不容易存取,只能在運行時壓縮DXT,只有pc和wp8支持。
對於各種各樣的資源加載會特別的凌亂么?不會。
其實本質上可以統一成Bytes的處理
Texture可以從Bytes加載
字符串 可以從Bytes加載
AB可以從Bytes加載
自定義二進制存儲,嘛本身就是bytes
所以只要我們的下載系統提供下載bytes並緩存,之后所有的資源加載都從Bytes進行,就可以統一起來。
下載部分我們在另一個專題介紹。
下一篇介紹將UI布局保存到文件與恢復。