用處
1赏半、AssetBundle是一個壓縮包包含模型、貼圖淆两、預(yù)制體断箫、聲音、甚至整個場景秋冰,可以在游戲運行時加載仲义;
2、AssetBundle自身保存著相互的依賴關(guān)系剑勾;
3埃撵、壓縮包可以使用LZMA和LZA壓縮算法,減少包的大小虽另,更快的進行網(wǎng)絡(luò)傳輸暂刘;
4、把一些可以下載內(nèi)容放在AssetBundle里面洲赵,可以減少安裝包的大小鸳惯。
什么是AssetBundle
1、它是一個存在硬盤上的文件叠萍≈シⅲ可以稱為壓縮包。這個壓縮包可以認為是一個文件夾苛谷,里面包含了多個文件辅鲸。這些文件可以分為兩類;serialized file和resource files腹殿。(序列化文件和源文件)
serialized file:資源被打碎放在一個對象中独悴,最后統(tǒng)一被寫在一個單獨的文件(只有一個)
resource files:某些二進制資源(圖片例书、聲音)被單獨保存,方便快速加載刻炒。
2决采、它是一個AssetBundle對象,我們可以通過代碼從一個特定的壓縮包加載出來的對象坟奥。這個對象包含了所有我們當初添加到這個壓縮包里面的內(nèi)容树瞭,我們可以通過這個對象加載出來使用。
AssetBundle使用流程圖
AssetBundle使用流程(簡稱AB)
1爱谁、指定資源AssetBundle屬性(xxxxa/xxx) 這里xxxa會生成目錄晒喷,名字xxx
2、構(gòu)建AssetBundle包```
using UnityEditor;
using System.IO;
public class CreateAssetBundles {
[MenuItem("Assets/Build AssetBundle")]
static void BuildAssetBundle()
{
string dir = "AssetBundle";
if (Directory.Exists(dir)==false)
{
Directory.CreateDirectory(dir);
}
BuildPipeline.BuildAssetBundles("AssetBundle", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}
}
3访敌、上傳AB包
4凉敲、加載AB包和包里面的資源
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LoadFromFileExample : MonoBehaviour {
// Use this for initialization
void Start () {
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundle/scene/cubewall.units3d");
GameObject wallPrefabs= ab.LoadAsset<GameObject>("cubewall");
Instantiate(wallPrefabs);
}
}
AssetBundle分組策略
1、按照實體分組
2寺旺、按照類型分組
3爷抓、按照使用分組 (同一時間內(nèi)使用的所有資源打一個包,可以按照關(guān)卡分組)
依賴打包
捕獲.PNG
1,Build的路徑(隨意只要是在硬盤上都可以的)
2,BuildAssetBundleOptions
BuildAssetBundleOptions.None:使用LZMA算法壓縮迅涮,壓縮的包更小废赞,但是加載時間更長徽龟。使用之前需要整體解壓叮姑。一旦被解壓,這個包會使用LZ4重新壓縮据悔。使用資源的時候不需要整體解壓传透。在下載的時候可以使用LZMA算法,一旦它被下載了之后极颓,它會使用LZ4算法保存到本地上朱盐。
BuildAssetBundleOptions.UncompressedAssetBundle:不壓縮,包大菠隆,加載快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4壓縮兵琳,壓縮率沒有LZMA高,但是我們可以加載指定資源而不用解壓全部骇径。
注意使用LZ4壓縮躯肌,可以獲得可以跟不壓縮想媲美的加載速度,而且比不壓縮文件要小破衔。
注意:官方文檔中介紹-有依賴關(guān)系的包清女,必須先加載依賴包。但是實際測試是不分先后加載關(guān)系的晰筛。
IEnumerator Start ()
{
string path = "AssetBundle/scene/cubewall.unity3d";
/*
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundle/scene/cubewall.unity3d");
AssetBundle ab1 = AssetBundle.LoadFromFile("AssetBundle/share.unity3d");
*/
//AssetBundle ab= AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
//第三種加載AB方式 WWW
while (Caching.ready == false)
{
yield return null;
}
//WWW www = WWW.LoadFromCacheOrDownload(@"file://D:\Unity3D Space\AssetBundleProject\AssetBundle\scene\cubewall.unity3d",1);
WWW www = WWW.LoadFromCacheOrDownload(@"http://D:\Unity3D Space\AssetBundleProject\AssetBundle\scene\cubewall.unity3d", 1);
yield return www;
if (string.IsNullOrEmpty(www.error)==false)
{
Debug.Log(www.error); yield break;
}
AssetBundle ab = www.assetBundle;
GameObject wallPrefabs= ab.LoadAsset<GameObject>("cubewall");
Instantiate(wallPrefabs);
}
AssetBundle的卸載
卸載有兩個方面
1嫡丙、減少內(nèi)存使用
2拴袭、有可能導致丟失
什么時候去卸載資源
AssetBundle.Unload(true)卸載所有資源,即使有資源被使用者(1曙博、在關(guān)切換拥刻、場景切換2、資源沒被用的時候 調(diào)用)
AssetBundle.Unload(false)卸載所有沒有被使用的資源
個別資源怎么卸載1父泳、通過Resources.unloadUnuseAssets 2泰佳、場景切換的時候
關(guān)于文件校驗
CRC MD5 SHA1
相同點:
CRC、MD5尘吗、SHA1都是通過對數(shù)據(jù)進行計算逝她,來生成一個校驗值,該校驗值用來校驗數(shù)據(jù)的完整性睬捶。
不同點:
- 算法不同黔宛。CRC采用多項式除法,MD5和SHA1使用的是替換擒贸、輪轉(zhuǎn)等方法臀晃;
- 校驗值的長度不同。CRC校驗位的長度跟其多項式有關(guān)系介劫,一般為16位或32位徽惋;MD5是16個字節(jié)(128位);SHA1是20個字節(jié)(160位)座韵;
- 校驗值的稱呼不同险绘。CRC一般叫做CRC值;MD5和SHA1一般叫做哈希值(Hash)或散列值誉碴;
- 安全性不同宦棺。這里的安全性是指檢錯的能力,即數(shù)據(jù)的錯誤能通過校驗位檢測出來黔帕。CRC的安全性跟多項式有很大關(guān)系代咸,相對于MD5和SHA1要弱很多;MD5的安全性很高成黄,不過大概在04年的時候被山東大學的王小云破解了呐芥;SHA1的安全性最高。
- 效率不同奋岁,CRC的計算效率很高思瘟;MD5和SHA1比較慢。
- 用途不同厦取。CRC一般用作通信數(shù)據(jù)的校驗潮太;MD5和SHA1用于安全(Security)領(lǐng)域,比如文件校驗、數(shù)字簽名等铡买。