Unity3D動態下載資源,有沒有解?有,AssetBundle就是通用解,任何一本書都會花大幅篇章來介紹AssetBundle.android
咱們試全面的分析一下Unity3D提供的資源加載機制ios
1.Resources//內嵌資源,使用方法Resources.Load,能夠加載任意種類的資源,不能動態修改,卒。web
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幫你解決了跨平臺問題,幫你解決了依賴關係。
而這個系列,不打算只講別人講的東西,咱們要告訴你一些小祕密。
首先AB的確很好很強大,他能收納Unity本身的全部資源種類,貼圖、材質、shader、預設。
而後能夠每平臺支持,這就是第一個陷阱,注意是每平臺支持,不是多平臺支持。
每一個平臺要單獨導出,而每一個平臺到底差了些什麼呢?答案是,nothing。
那麼爲何每一個平臺要單獨導出呢?由於Unity考慮到每一個平臺的質量關係,進行了質量相關的差別化。
而最大的質量差別,源自貼圖。
有些平臺貼圖不壓縮,有些平臺貼圖要壓縮,並且根據不一樣的平臺特性,套用不一樣的壓縮算法,先壓過再存到包裏。
這就是AB幫你乾的最主要的事情。
聽起來很貼心呢,等等,你是否是忘了一個特定的命題,這個命題叫作UI。
壓縮的圖片會有質量損失,UI貼圖咱們一般是不壓縮的。
而後UI還會觸及到AB的另外一個問題
以NGUI爲例,NGUI的資源關係比較複雜,有貼圖-》圖集-》佈局
不一樣佈局常常交叉引用貼圖
若是用AB想把每一個界面分開打包,給用戶最小的資源更新量,這個任務能夠用災難來形容。
最終熱更新推送給用戶的東西是以文件爲單位的,而AB在小粒度文件而且之間有較爲複雜的引用關係這種需求下的使用是一場災難。
AB對每一個平臺的差別編譯不是可選的,而是強制的,假如你有web、ios、android三個平臺,不管如何你都要導出三次。
把碎片文件下載回來,而且組裝
對於UI這個情境,是徹底可行的。把佈局和圖集保存爲文本形式,把文本和貼圖下載回來,而後組裝。
對於其餘的場景片斷,在有動畫和貼圖須要壓縮的狀況下,AB依然是惟一選擇。
unity沒有提供在運行時壓縮貼圖的手段,動畫也不容易存取,只能在運行時壓縮DXT,只有pc和wp8支持。
對於各類各樣的資源加載會特別的凌亂麼?不會。
其實本質上能夠統一成Bytes的處理
Texture能夠從Bytes加載
字符串 能夠從Bytes加載
AB能夠從Bytes加載
自定義二進制存儲,嘛自己就是bytes
因此只要咱們的下載系統提供下載bytes並緩存,以後全部的資源加載都從Bytes進行,就能夠統一塊兒來。
下載部分咱們在另外一個專題介紹。
下一篇介紹將UI佈局保存到文件與恢復。