AssetBundle

用处

1、AssetBundle是一个压缩包包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行时加载;
2、AssetBundle自身保存着相互的依赖关系;
3、压缩包可以使用LZMA和LZA压缩算法,减少包的大小,更快的进行网络传输;
4、把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小。

什么是AssetBundle

1、它是一个存在硬盘上的文件。可以称为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类;serialized file和resource files。(序列化文件和源文件)
serialized file:资源被打碎放在一个对象中,最后统一被写在一个单独的文件(只有一个)

resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载。
2、它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。

AssetBundle使用流程图

AssetBundle_第1张图片
Asset打包AssetBundle到Server

AssetBundle_第2张图片
Server下载AssetBundle解压成Asset

AssetBundle使用流程(简称AB)

1、指定资源AssetBundle属性(xxxxa/xxx) 这里xxxa会生成目录,名字xxx

给指定资源命名时不区分大小写
AssetBundle_第3张图片
捕获.PNG

2、构建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("cubewall");

        Instantiate(wallPrefabs);
    }
}

AssetBundle分组策略

1、按照实体分组
2、按照类型分组
3、按照使用分组 (同一时间内使用的所有资源打一个包,可以按照关卡分组)

依赖打包
AssetBundle_第4张图片
捕获.PNG

1,Build的路径(随意只要是在硬盘上都可以的)
2,BuildAssetBundleOptions
BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩的包更小,但是加载时间更长。使用之前需要整体解压。一旦被解压,这个包会使用LZ4重新压缩。使用资源的时候不需要整体解压。在下载的时候可以使用LZMA算法,一旦它被下载了之后,它会使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部。

注意使用LZ4压缩,可以获得可以跟不压缩想媲美的加载速度,而且比不压缩文件要小。
注意:官方文档中介绍-有依赖关系的包,必须先加载依赖包。但是实际测试是不分先后加载关系的。

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("cubewall");
        Instantiate(wallPrefabs);

    }

AssetBundle的卸载

卸载有两个方面
1、减少内存使用
2、有可能导致丢失
什么时候去卸载资源
AssetBundle.Unload(true)卸载所有资源,即使有资源被使用者(1、在关切换、场景切换2、资源没被用的时候 调用)
AssetBundle.Unload(false)卸载所有没有被使用的资源
个别资源怎么卸载1、通过Resources.unloadUnuseAssets 2、场景切换的时候

关于文件校验

CRC MD5 SHA1
相同点:
CRC、MD5、SHA1都是通过对数据进行计算,来生成一个校验值,该校验值用来校验数据的完整性。
不同点:

  1. 算法不同。CRC采用多项式除法,MD5和SHA1使用的是替换、轮转等方法;
  2. 校验值的长度不同。CRC校验位的长度跟其多项式有关系,一般为16位或32位;MD5是16个字节(128位);SHA1是20个字节(160位);
  3. 校验值的称呼不同。CRC一般叫做CRC值;MD5和SHA1一般叫做哈希值(Hash)或散列值;
  4. 安全性不同。这里的安全性是指检错的能力,即数据的错误能通过校验位检测出来。CRC的安全性跟多项式有很大关系,相对于MD5和SHA1要弱很多;MD5的安全性很高,不过大概在04年的时候被山东大学的王小云破解了;SHA1的安全性最高。
  5. 效率不同,CRC的计算效率很高;MD5和SHA1比较慢。
  6. 用途不同。CRC一般用作通信数据的校验;MD5和SHA1用于安全(Security)领域,比如文件校验、数字签名等。

官方AssetBundle Browser Tool

https://github.com/Unity-Technologies/AssetBundles-Browser

你可能感兴趣的:(AssetBundle)