AssetBundle
Resources:表示U3D自動將資源打成一個AssetBundle包,所有放在Resources下的文件夾都會打成一個AssetBundle包,資源非常大,Resources文件夾在真機上最大只有2G的內存(專業版會增大內存)
AssetBundle包:其實可以看成一個壓縮包(有固定格式的),默認情況下使用LZMA壓縮方式壓縮的資源文件;和壓縮ZIP一樣的,只不過里面的格式變了
Unity3D引擎為我們提供了三種壓縮策略來處理AssetBundle的壓縮,即:
1、LZMA格式:
在默認情況下,打包生成的AssetBundle都會被壓縮。在U3D中,AssetBundle的標准壓縮格式便是LZMA(LZMA是一種序列化流文件),因此在默認情況下,打出的AssetBundle包處於LZMA格式的壓縮狀態,在使用AssetBundle前需要先解壓縮。使用LZMA格式壓縮的AssetBundle的包體積最小(高壓縮比),但是會相應的增加解壓縮的時間
2、LZ4格式:
Unity5.3之后的版本增加了LZ4格式壓縮,由於LZ4的壓縮比一般,因此經過壓縮后的AssetBundle包體的體積較大(該算法基於chunk)。
3、不壓縮
Resources和AssetBundle的區別:
1、Resources:有2G的限制,不支持動態更新(拿Android為例)
a、上線后,Resources里面的資源都在APK里面,只能讀不能寫
b、StreamingAssets和dataPath都是在Apk中,Apk為一個壓縮包,里面的東西只能讀不能寫,因此這個限制就決定了Resources不能支持熱更新
2、PersistPath(支持熱更):
a、只能手動打包
b、打包方式:
1、4.0以前,打包的依賴關系都必須手動
2、5.0以后,這種依賴關系全部自動
創建AssetBundle:AssetBundle可以將任何資源打包成assetbundle(如果是unity不能識別的文件,可以通過改變后綴進行打包)
1、在任何一個游戲物體的右下角有AssetBundle,第一個為包名,第二個為后綴(不能識別的物體不能修改,修改后綴變成能識別的物體)
更新流程:
1、代碼的更新:熱更新
2、資源的更新:AssetBundle更新
a、創建assetbundle
b、將assetbundle打成一個zip文件,放進streamingAssetPath里面
c、把需要更新的AssetBundle先上傳到Server,如果Server有更新(與服務器版本進行比對),把server的assetbundle包下載下來(zip文件),然后解壓到persistentPath里
d:加載:判斷PersistentPath里是否有這個資源,如果沒有就讀取StreamingAssetPath里面的,如果有,就直接讀取PersistentPath里的
1、LoadAsset:從資源包中加載指定的資源
2、LoadAllAsset:加載當前資源包中所以的資源
3、LoadAssetAsync:從資源包中異步加載資源
3、資源卸載:資源卸載部分使用的是Unload方法
Unload:
a、該方法會卸載運行時內存中包含在bundle中的所有資源。
b、當傳入的參數為true,則不僅僅內存中的AssetBundle對象包含的資源會被銷毀;根據這些資源實例化而來的游戲內的對象也會銷毀
c、當傳入的參數為false,則僅僅銷毀內存中的AssetBundle對象包含的資源
using System.Collections.Generic; using UnityEngine; using UnityEditor;//編輯器命名空間的引用 public class TestDemo { //MenuItem:附加屬性 //自定義工具:提高團隊的開發效率 [MenuItem("Itools/TestBuild")] public static void BuilderAssetBundle() { string outputPath = Application.streamingAssetsPath + "/Test"; //BuildPipeline.BuildAssetBundles():只需要提供一個輸出AssetBundle的地址即可, //引擎會自動根據資源的assetBundleName屬性批量打包,自動建立Bundle以及資源之間的依賴關系 BuildPipeline.BuildAssetBundles(outputPath, 0, EditorUserBuildSettings.activeBuildTarget); } }
BuildPipeline.BuildAssetBundles(): 1、第一個參數:AssetBundle輸出到哪一個文件夾 2、第二個參數:枚舉類型,可以選擇多個參數,多個參數之間可以用“|“隔開 a、CompleteAssets:保證資源的完備性,默認開啟 b、CollectDependencies:用於搜集資源的依賴項,默認開啟 和完整性有點相像,會把游戲物體所依賴的資源一起進行打包,防止有些被依賴的資源沒有被打進去 c、DeterministicAssetBundle:用於為資源維護固定ID,默認開啟 所以的資源都有固定的標記的,在資源的mate文件中的guid:64位組成的字符串,電腦里是隨機生成並且唯一,每一個文件的唯一標識 d、ForceRebuildAssetBundle:用於強制重打所有AssetBundle文件,5.3以后新增 資源更新了,重新打包,將以前的資源包丟棄 e、IgnoreTypeTreeChanges:用於判斷AssetBundle更新時,是否忽略TypeTree的變化,新增 打包時是否忽略父子關系 f、AppendHashToAssetBundleName:用於將Hash值添加在AssetBundle文件名之后,開啟這個選項可以直接通過文件名來判斷哪些Bundle的內容進行了更新 (4.X下普遍需要通過比較二進制等方法來判斷,但在某些情況下即使內容不變重新打包,Bundle的二進制也會變化),新增 在包名后綴名后面添加一個Hash表 g:ChunkBasedCompression:用於使用LZ4格式進行壓縮,5.3新增
BuildPipeline.BuildAssetBundles(outputPath, BuildAssetBundleOptions.AppendHashToAssetBundleName|BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget);
AssetBundle的適用平台與跨平台性
AssetBundle適用於多種平台,包括網頁應用、移動應用、桌面應用等,可以動態更新,但不同平台所使用的AssetBundle並不相同,在創建離線AssetBundle的時候需要通過參數來指定目標平台,相關關系如表所示:
IOS:在Mac版本的Standlone打包
Windows:打Android、PC、WebPlayer