AssetBundle第一篇

31 阅读4分钟

一:AssetBundle介绍

AssetBundle是将资源使用Unity提供的一种用于存储资源的压缩格式打包后的集合,它可以存储任何一种Unity可以识别的资源,如模型,纹理图,音频,场景等资源。也可以加载开发者自定义的二进制文件。他们的文件类型是.assetbundle/.unity3d,他们先前被设计好,很容易就下载到我们的游戏或者场景当中。

一般情况下AssetBundle的具体开发流程如下:

(1)创建Asset bundle,开发者在unity编辑器中通过脚本将所需要的资源打包成AssetBundle文件。

(2)上传服务器。开发者将打包好的AssetBundle文件上传至服务器中。使得游戏客户端能够获取当前的资源,进行游戏的更新。

(3)下载AssetBundle,首先将其下载到本地设备中,然后再通过AsstBudle的加载模块将资源加到游戏之中。

(4)加载,通过Unity提供的API可以加载资源里面包含的模型、纹理图、音频、动画、场景等来更新游戏客户端。

(5)卸载AssetBundle,卸载之后可以节省内存资源,并且要保证资源的正常更新。

二:AssetBundle Brower插件创建AssetBundle

AssetBundleBrower可将项目中的资源打成AB包,发布游戏后,项目将加载Streaming Assets中的AB包,加载所需资源。AB包支持热更新、资源优化。

**what **(是什么?)

AssetBundle简称AB包,是特定平台的资源压缩包,类似压缩文件,即为游戏资源打包的压缩文件。可以打成AB包的资源有:模型、贴图、预制体、音效、材质球等。

**why **(为什么用?)

    热更新:需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。
    
    Resources加载存在问题:对内存管理造成负担较大;打开应用时加载时间过长;Resources文件夹下的所有资源统一合并到一个序列化文件中,看作是统一打成一个超大的AB包,对资源优化有一定的限制。不建议大量使用Resources。
    AB包存储位置、压缩方式可自定义,且后期可以动态更新。
    AB包减小包体大小,可以将AB包放在服务器,启动时下载。
    
    Unity3d资源管理和热更新
    市场上流通的手游几乎都包含热更新功能,这已经是商业产品的标注配置,Unity高级或以上的岗位需要具备资源管理和设计资源更新解决方案的能力。
    在中大型手游产品中,集成热更新功能是为了绕过平台审核所需要的手续和大量的时间;玩家不需要重新下载安装包,渐少用户流失;方便游戏内容拓展或修改。
 

**how **(怎么用?)

独立包的加载较为简单,加载的过程是:加载AB包;从AB包读取预制体资源;场景中实例化预制体资源。

public class DemoLoadBundle : MonoBehaviour
{
    //包名
    public string bundleName = "tile_+000_+011";
    //资源名,即打包前的预制体名
    public string assetName = "tile_+000_+011";
    private void Start()
    {
        InstantiateBundle();
    }
    protected void InstantiateBundle() 
    {
        //加载包,需要传递的参数为:包名、包所在的路径
        AssetBundle asset = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, bundleName));
        //泛型读取对象
        var asset_gob = asset.LoadAsset<GameObject>(assetName);
        //Type指定类型加载
       // GameObject assetobj=asset.LoadAsset(assetName,typeof(GameObject)) as GameObject; 
        //实例化对象      
        Instantiate(asset_gob);
    }
}

依赖包是多个包依赖同样的资源,需要将多包依赖的资源单独打成一个包,此包称之为依赖包。在加载AB包前,需要先加载依赖包,否则会出现资源丢失的情况。以下是加载依赖包的相关代码,可以看出,仅仅是多了名为LoadDependencies的方法。

public class DemoLoadBundle : MonoBehaviour
{
    //包名
    public string bundleName = "tile_+000_+011";
    //资源名,即打包前的预制体名
    public string assetName = "tile_+000_+011";
    private void Start()
    {
        LoadDependencies();
        InstantiateBundle();
    }
    protected void InstantiateBundle() 
    {
        //加载包,需要传递的参数为:包名、包所在的路径
        AssetBundle asset = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, bundleName));
        //泛型读取对象
        var asset_gob = asset.LoadAsset<GameObject>(assetName);
        //Type指定类型加载
       // GameObject assetobj=asset.LoadAsset(assetName,typeof(GameObject)) as GameObject; 
        //实例化对象      
        Instantiate(asset_gob);
    }
    //加载依赖资源
    protected void LoadDependencies()
    {
        //AssetBundleManifest 记录所有资源的依赖
        AssetBundle assetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
        AssetBundleManifest _mainfest=assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
        string[] dependencies = _mainfest.GetAllDependencies(bundleName);
        //先加载依赖包
        foreach (string dependency in dependencies) 
        {
            var dependencyAsync = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, dependency));
        }
    }
}