Unity AssetBundle 從入門到掌握(適合初學者)

2021-03-02 Unity3D遊戲開發精華教程乾貨

文章目錄

AssetBundle從入門到掌握

1. AssetBundle的定義和作用

2. 什麼是AssetBundle?

3. AssetBundle使用步驟

4. 代碼打包AssetBundle

5. AssetBundle的加載和卸載

AB的加載

AB的卸載

6. AssetBundle分組策略總結

邏輯實體分組

注意

7. Manifest文件

什麼是Manifest文件

通過Manifest文件得到某個包的依賴

8. 文件校驗

9. AssetBundles瀏覽工具

1. AssetBundle的定義和作用

AssetBundle(簡稱AB包)是一個資源壓縮包,包含模型、貼圖、預製體、聲音、甚至整個場景,可以在遊戲運行的時候被加載;

AssetBundle自身保存著互相的依賴關係;

壓縮包可以使用LZMA和LZ4壓縮算法,減少包大小,更快的進行網絡傳輸;

把一些可以下載內容放在AssetBundle裡面,可以減少安裝包的大小;

2. 什麼是AssetBundle?

它是一個存在於硬碟上的文件。可以稱之為壓縮包。這個壓縮包可以認為是一個文件夾,裡面包含了多個文件。這些文件可以分為兩類:serialized file 和 resource files。(序列化文件和源文件)

serialized file:資源被打碎放在一個對象中,最後統一被寫進一個單獨的文件(只有一個)

resource files:某些二進位資源(圖片、聲音)被單獨保存,方便快速加載,可以Editor上讀取,方便查看

它是一個AssetBundle對象,我們可以通過代碼從一個特定的壓縮包加載出來的對象。這個對象包含了所有我們當初添加到這個壓縮包裡面的內容,我們可以通過這個對象加載出來使用。

3. AssetBundle使用步驟

指定資源的AssetBundle屬性

(xxxa/xxx)這裡xxxa會生成目錄,名字為xxx。』/'可以用於目錄劃分,Remove UnUsed name 可以移除沒有使用的屬性名

構建AssetBundle包

上傳AB包

加載AB包和包裡面的資源

4. 代碼打包AssetBundle

使用編輯器擴展方法,將打包按鈕Build AssetBundles放於Asset菜單下

using UnityEditor;

using System.IO;

public class CreateAssetBundles{    [MenuItem("Assets/Build AssetBundles")]    static void BuildAllAssetBundles()    {        string dir = "AssetBundles";        if (Directory.Exists(dir) == false)        {            Directory.CreateDirectory(dir);        }                BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);    }}

壓縮方式

Build的路徑(隨意只要是在硬碟上都可以的)

BuildAssetBundleOptions

BuildAssetBundleOptions.None:使用LZMA算法壓縮,壓縮的包更小,但是加載時間更長。使用之前需要整體解壓。一旦被解壓,這個包會使用LZ4重新壓縮。使用資源的時候不需要整體解壓。在下載的時候可以使用LZMA算法,一旦它被下載了之後,它會使用LZ4算法保存到本地上。

BuildAssetBundleOptions.UncompressedAssetBundle:不壓縮,包大,加載快

BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4壓縮,壓縮率沒有LZMA高,但是我們可以加載指定資源而不用解壓全部。

注意:使用LZ4壓縮,可以獲得可以跟不壓縮想媲美的加載速度,而且比不壓縮文件要小。

依賴打包

將需要同時加載的資源放在同一個包裡,各個包之間會保存相互依賴的信息

5. AssetBundle的加載和卸載

AB的加載

在開發階段將AB包放在本地,開發結束後再上傳到伺服器

public class LoadFromLocal : MonoBehaviour{    private void Start()    {        AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/scene/wall.jy");        GameObject obj = ab.LoadAsset<GameObject>("wall");        Instantiate(obj);    }}

private void Start(){    AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes("AssetBundles/scene/cube.jy"));    GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)");    Instantiate(obj);}

IEnumerator Start(){    AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes("AssetBundles/scene/cube.jy"));    yield return request;    AssetBundle ab = request.assetBundle;    GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)");    Instantiate(obj);}

 IEnumerator Start(){    while (Caching.ready == false)    {        yield return null;    }

WWW www = WWW.LoadFromCacheOrDownload(@"file://E:\U3D-Projects\Test2017.2.0\AssetBundles\scene\cube.jy", 1); yield return www; if (!string.IsNullOrEmpty(www.error)) { Debug.Log(www.error); yield break; } AssetBundle ab = www.assetBundle; GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)"); Instantiate(obj);}

 IEnumerator Start(){    string url = @"file:///E:\U3D-Projects\Test2017.2.0\AssetBundles\scene\cube.jy";    UnityWebRequest request = UnityWebRequest.GetAssetBundle(url);    yield return request.SendWebRequest();                AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;    GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)");    Instantiate(obj);}

AB加載方式:

AssetBundle.LoadFromFile 從本地加載

AssetBundle.LoadFromMemory 從內存加載

WWW.LoadFromCacheOrDownload 下載後放在緩存中備用(該方法逐漸被棄用)

UnityWebRequest 從伺服器下載

從AB中加載資源:

AssetBundle.LoadAsset(assetName)

AssetBundle.LoadAllAssets() 加載AB包中所有的對象,不包含依賴的包

AssetBundle.LoadAssetAsync() 異步加載,加載較大資源的時候

AssetBundle.LoadAllAssetsAsync() 異步加載全部資源

AssetBundle.LoadAssetWithSubAssets 加載資源及其子資源

AB的卸載

減少內存的使用

有可能導致丟失

在切換場景,或者確定不使用的時候卸載

AssetBundle.Unload(true) 卸載所有資源,包含其中正被使用的資源

AssetBundle.Unload(false) 卸載所有沒被使用的資源

Resources.UnloadUnusedAssets 卸載個別未使用的資源

6. AssetBundle分組策略總結

邏輯實體分組

一個UI界面或者所有UI界面一個包(這個界面裡面的貼圖和布局信息一個包)

一個角色或者所有角色一個包(這個角色裡面的模型和動畫一個包)

所有的場景所共享的部分一個包(包括貼圖和模型)

按照類型分組

所有聲音資源打成一個包,所有shader打成一個包,所有模型打成一個包,所有材質打成一個包

按照使用分組

把在某一時間內使用的所有資源打成一個包。可以按照關卡分,一個關卡所需要的所有資源包括角色、貼圖、聲音等打成一個包。也可以按照場景分,一個場景所需要的資源一個包

注意

經常更新的資源放在一個單獨的包裡面,跟不經常更新的包分離

把需要同時加載的資源放在一個包裡面

可以把其他包共享的資源放在一個單獨的包裡面

把一些需要同時加載的小資源打包成一個包

如果對於一個同一個資源有兩個版本,可以考慮通過後綴來區分,例如v1、v2、v3

7. Manifest文件

什麼是Manifest文件

crc為校驗碼,通過其檢查是否完整

Assets 表示包裡包含多少資源

Dependencies 表示包有哪些依賴

注意:在加載這些包之前,也需要加載依賴的包,不然會丟失這部分內容,顯示效果不正確

通過Manifest文件得到某個包的依賴

可以注意到scene/cube.jy依賴於material.jy,而material.jy依賴於texture.jy

AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");string[] strs = manifest.GetAllDependencies("scene/cube.jy");foreach (var item in strs){    Debug.Log(item);      AssetBundle.LoadFromFile("AssetBundles/" + item);}

如此,對象的材質也加載顯示出來:

8. 文件校驗

CRC、MD5、SHA1都是通過對數據進行計算,來生成一個校驗值,該校驗值用來校驗數據的完整性。

CRC一般用於通信數據的校驗,MD5和SHA1用於安全領域,例如文件校驗,密碼加密等

9. AssetBundles瀏覽工具

GitHub下載地址

工具面板如下:

Build Target 用於設置AB包的目標平臺

OutPut Path 設置AB的輸出路徑

Build 一鍵打包

————————————————

聲明:發布此文是出於傳遞更多知識以供交流學習之目的。若有來源標註錯誤或侵犯了您的合法權益,請作者持權屬證明與我們聯繫,我們將及時更正、刪除,謝謝。

作者:虛擬喵

來源:https://blog.csdn.net/qq_35361471/article/details/82854560

More:【微信公眾號】 u3dnotes

相關焦點

  • AssetBundle從入門到掌握(基於Unity2017)
    AssetBundle從入門到掌握-->Lua編程-->xLua熱更新方案,這個最新的關於熱更新方案的學習流程,今天發布第一課
  • Unity零基礎到就業 7.5折預售
    ,預計2021年4月更新完畢(質量為先,實際發布時間為準,但誤差不會太大)購買地址:https://www.taikr.com/course/1093適合什麼學員:接觸unity不久,需要系統的學習不知道如何從頭到尾,系統深入的學習掌握unity
  • Unity 2020怎樣改成中文
    UnityUnity 2020版本無論是功能方面的大更新,還是編輯器功能上的改進,對絕大多數Unity初學者來說暫時都用不到。所以如果是剛學習 Unity 用來開發遊戲或者做工業設計,這次不要追求軟體一步到位最新的版本,Unity 2020就連最便捷下載免費模型的Unity asset store都不再支持在編輯器內打開了(之前的便捷:
  • 首發:適合初學者入門人工智慧的路線及資料下載
    本文為AI入門提供了一個簡易的學習路線,並提供了代碼和數據集下載。(黃海廣)一、前言AI以及機器學習入門,初學者遇到的問題非常多,但最大的問題就是:資料太多!!!看不完!!!不知道如何取捨!!!人的精力有限!!!
  • 適合初學者自學日語的書籍,快速掌握學習日語的技巧
    適合初學者自學日語的書籍,快速掌握學習日語的技巧學習日語很難嗎?如果用學校裡的傳統方法來學習,那麼發音要學半年,語法要學半年,基本會話要學兩年。這樣的你需要一些能夠快速掌握髮音、單詞、語法、會話的零基礎入門書。小編今天推薦的這6本書非常適合日語零基礎的你,趕快行動起來吧!
  • 【厚積薄發】AssetBundle如何計算可靠的Hash值
    但因為AssetBundle建置的不穩定性,常常Asset沒有改變但是AssetBundle變了,導致用戶端下載到不必要的AssetBundle。所以後來開始試著從Asset算一個Version Hash值。
  • 初學者怎麼學習畫手?從入門到簡單,學會畫手很簡單,快來學習
    很多初學者覺得手其實很好畫,相比眼睛、鼻子、嘴巴等,手的結構簡單,更好畫,但並不是這樣的,手的結構是固定的,但是手的表現形式卻是千變萬化,畫法何止千萬種。 簡單易學的手勢結構是初學者需要臨摹學習的,從簡單到複雜,初學者畫簡單的結構手勢,必須要臨摹開始,由於天賦不一樣,有的畫起來可以直接畫 好造型,但由於有的對造型不能完全地掌握,所以畫時可以試著畫
  • 「零基礎」入門速寫,初學者掌握這些技巧,將超越96%的同屆生
    零基礎入門畫速寫,需要注意的點特別多,因為速寫講究下手快與準,往往一處細節一筆勾勒。對於速寫的要領,初學者特別是零基礎的美術生,短時間內是很難掌握的,初學者學速寫有獨特技巧,不像有基礎那麼容易,但只要掌握,也不會太難。對於初學者畫速寫,小編已將技巧匯總。
  • 「零基礎」入門速寫,初學者掌握這些技巧,將超越95%的同屆生
    零基礎入門畫速寫,需要注意的點特別多,因為速寫講究下手快與準,往往一處細節一筆勾勒。對於速寫的要領,初學者特別是零基礎的美術生,短時間內是很難掌握的,初學者學速寫有獨特技巧,不像有基礎那麼容易,但只要掌握,也不會太難。對於初學者畫速寫,小編已將技巧匯總。
  • Unity技術分享(83)|耗時分析|AssetBundle加載出錯|失真……
    https://issuetracker.unity3d.com/issues/textures-rgba-compressed-pvrtc-2-slash-4bit-texture-with-compression-quality-set-to-to-best-slash-normal-is-less-detailed-than-fast
  • 樂器初學者怎麼選吉他?2020最適合新手入門的吉他推薦
    吉他作為不少新手玩家首選的入門樂器,多年來一直熱度不斷,很多新手玩家入門首先面臨的問題就是如何選一款適合自己的吉他。那麼,市面上吉他品牌那麼多,樂器初學者怎麼選擇一款合適自己的吉他?有沒有適合新手入門的吉他推薦呢?2020年最值得新手選擇的吉他有哪些呢?
  • 初學者怎麼學動漫繪畫?動漫初學者入門教程
    初學者怎麼學動漫繪畫?動漫初學者入門教程!零基礎小白學動漫繪畫,通常是比較困難的,很多時候都是靠一股熱血支撐,但由於種種原因, 那種激情就會消退,久而久之就學不下去了。面對這種情況,小白們也很無奈,所以今天,小編給小白們送福利啦!告訴你零基礎小白學動漫繪畫應該怎麼學。
  • 吉他初學者適合買什麼吉他來學習入門?
    吉他初學者適合買什麼吉他?好多想學吉他的朋友們,都不知買什麼吉他,從那樣吉他開始入門,對常見的吉他又不是非常的了解等,都會有少少的迷茫,今天我們就來聊下這方面吧...............電吉他而想學吉他,又是吉他初學的話,還是推薦你買民謠吉他吧,從民謠吉他開始學起,打好基礎了再轉學電吉他也不遲,因為電吉他關係到各種設備等,對於新手來說一時是難以下手的,所以建議先從民謠木吉他開始先
  • PhotoShop軟體初學者如何快速入門學習
    ps有很多功能,應用在圖像、圖形、文字、視頻、出版物等,行業中的廣告攝影、影像創意、後期修飾、網頁製作、照相館、影樓等都會用到該軟體。如何學習PS初學者面對完全陌生的軟體PS,如何快速入門呢?是剛開始學習時想到的一些問題,都想快速學會。一開始建議少看些理論,因為看也看不懂,直接去做有詳細步驟的實例,按步驟照做。
  • 每日瑜伽21天入門精講課 帶初學者高效入門瑜伽
    呼吸刻意——呼吸可以平衡身體,控制人體能量流動,是整個瑜伽練習過程中非常重要的一環,如何呼氣和吸氣對於初學者來說比較難把握。過度拉伸——初學者常常因為過度拉伸而使身體受傷。每日瑜伽明星學員慧慧(化名)在瑜伽練習初期便遇到了類似的問題。慧慧說,在初期自主練習過程中,由於身體僵硬,很多體式做不到位,甚至有的體式就算做到位了也不知道是否正確。
  • 適合初學者嗎?
    適合初學者嗎?Python入門階段零基礎學員打好基礎是非常重要的。在非常高的抽象計算中,高級的Python程序設計非常難學,高級程序語言不等於簡單,但對於初學者和完成普通任務Python語言是非常簡單易用的。
  • 書法初學者,顏體入門為佳!
    鄧散木前輩談過,初學書法應該從大楷入門,那麼從當時到現在,不少朋友問道,大楷很多,比如四大家應該從哪入手好?前人優秀的碑帖書法數不勝數,單單是常人聽說的較多的歐顏柳趙四大家楷書,而此四大家各人的碑帖也有許多,這些都是初學者或小學生可以學習楷書的常用範本。這眾多的古代法帖有深有淺,學有難易,習有先後。初學者或小學生在初涉習書的時候,要考慮到起步時期的感悟能力,要有一個相對科學的選擇。楷書始發於漢魏,發展於晉,鼎盛於唐,唐楷是楷書中的典範,選擇唐楷是無可厚非的。
  • 最適合初學者的10本Python書籍
    幫讀者學習這門語言打下堅實的基礎,包括測試、調試、代碼復用和其他開發技巧的實踐。註:目前這本書沒有中文版2、《像計算機科學家一樣思考Python》貫穿全書的主體是如何思考、設計、開發的方法。從基本的編程概念開始,一步步引導讀者了解Python語言,再逐漸掌握函數、遞歸、數據結構和面向對象設計等高階概念。本書第2版及其輔助代碼均已升級,支持Python 3。每個章節後面都有練習,可以幫助讀者加深對剛學的編程概念的理解。而且,本書的示例代碼均在GitHub倉庫中維護,讀者很容易下載和修改。
  • 小學英語閱讀——A Bundle of Sticks(一捆木條)
    The old man gave a bundle of ten sticks to each of his three sons. They broke the sticks into two in an instant.老人給了三個兒子每人一捆十根棍子。他們一下子把樹枝掰成了兩半。
  • Unity技術面試題漲姿勢(一)
    通過Resources模塊,調用它的load函數:可以直接load並返回某個類型的Object,前提是要把這個資源放在Resource命名的文件夾下,Unity不關有沒有場景引用,都會將其全部打入到安裝包中。