Unity高级功能—AssetsBundle的打包与下载

假设我们现在有一个立方体的预制体需要打包进来怎么操作?

  1. 创建一个立方体,然后将它托进res文件夹,制作一个立方体预制体(prefab)
  2. 右下角的小窗口里面,我们可以设置这个prefab为一个AssetBundle,点击New,就可以给他设置自己的名字,

我给这个prefab归属到“cub_bundle”类里面

3、编写脚本,进行打包

我们创建一个Editor的文件夹,然后在里面创建一个脚本,我们起名字叫做:”exprot_assetbundle”,以及一个AssetBundle文件夹,这个文件夹是用来存放我们导出的资源的,导出的资源的路径需要我们自己去设置。

脚本的内容如下

using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;  
using UnityEditor;  
  
public class export_assetbundle : Editor  
{  
    // 在Unity上面的选项栏里面,添加一个Build选项,点击这个Build选项,我们就可以进行打包操作  
    [MenuItem("build/build_assetbundle")]  
  
    static void run() {  
        //调用函数来打包assetbundle  
        // 输出路径,自己创建,build之后,生成的文件就会在自己创建的输出路径中“Assets/AssetBundles”  
        //调用接口打包  
        // 第一个参数是我们指定的输出文件夹  
        // 第二个参数指的是打包的方式,一般选择就是None  
        // 第三个选项是准备打包的对应平台的选项  
        BuildPipeline.BuildAssetBundles("Assets/AssetBundles",BuildAssetBundleOptions.None,BuildTarget.StandaloneOSX);  
  
    }  
}  

添加完上面的脚本之后,我们返回Unity的界面,就会在Unity上面的栏目里面发现我们添加的选项按钮:

点击这个按钮,接着Unity就会为我们进行打包,然后将打包的文件设置在我们刚才第一个参数的设置的路径:

cub_bundle就是我们打包的文件,AssetBundles相当于一个说明文件,文件里面说明了我们这个包里面打包了什么东西。

此时我们打包就已经操作完成了。

补充:

如果我们想打包不同种类呢:

就将我们在预制体右下角设置的bundle类型变换一下,就可以了。

就像现在我在res文件夹里面添加一个胶囊体的预制体,然后将其命名为:Capsule_bundle

这样,打出来的就是会是两个,如下图:

 

下载

下载的方式有两种,nocache和cache;

nocache:只要下载就去服务器下载,不管本地有没有

cache:会带一个版本号,下载时候会对比这个版本号,如果版本号一直的话,就不会下载,不一致,就会重新下载。

案例实现:

nocache下载:

为了不使得主线程阻塞,使用协程进行下载,使用WWW类。

cache下载:

使用WWW类的LoadFromCacheorDown实现

public class GameScene : MonoBehaviour  
{  
    public string url;  
    // 版本号,自己控制  
    public int version;  
    // Start is called before the first frame update  
    void Start()  
    {  
        //this.StartCoroutine(this.nocache_load());  
        this.StartCoroutine(this.cache_load());  
    }  
  
    // 下载AssetBundle  
    // 分为两种:nocache,cache  
    // nocache:不会缓存,只要使用就会重新下载  
    // cache:就带一个版本号,下载的时候,只要发现版本号一致,就不会下载,版本号不一致的时候才会下载  
    IEnumerator nocache_load()  
    {  
        WWW w = new WWW(url);  
        yield return w;  
  
        //下载完成之后,执行的逻辑   
  
        if(w.error != "")  
        {  
            Debug.Log(w.error);  
        }  
        AssetBundle bundle = w.assetBundle;  
    }  
  
    IEnumerator cache_load()  
    {  
        WWW w = WWW.LoadFromCacheOrDownload(url,version);  
  
        yield return w;  
  
        if (w.error != "")  
        {  
            Debug.Log(w.error);  
        }  
        AssetBundle bundle = w.assetBundle;  
  
    }  
  
    // Update is called once per frame  
    void Update()  
    {  
          
    }  
}  

使用不缓存的方法,每运行一次都会从http服务器上面读取,我在自己本地搭建的http服务器,所以上面有读取的记录。

使用缓存的方法,只要我的文件不变,意味着我的版本号不变,此时只有第一次运行的时候,会从http服务器下载,之后运行就不会下载了。

但是当你更改了版本号的时候,就会重新从服务器下载一遍

 

使用cache下载的方法,内存里面会有下载的AssetBundle里的景象。

AssetBundle的加载使用

在我们打包的文件里面,有一个capsual_bundle.mainfest文件

这个文件里面就描述了我们这个assetbundle里面存放了哪些东西

打开之后,我们就会发现里面有一个路径的描述:

这个就是我们可以使用的资源的路径,

案例代码:

IEnumerator cache_load()  
    {  
        WWW w = WWW.LoadFromCacheOrDownload(url,version);  
  
        yield return w;  
  
        if (w.error != "")  
        {  
            Debug.Log(w.error);  
        }  
  
        AssetBundle bundle = w.assetBundle;  
  
        // 实例化一个对象  
        Object Prefab = bundle.LoadAsset("Assets/res/Capsule.prefab");  
        GameObject obj = (GameObject)Instantiate(Prefab);  
        obj.transform.parent = this.transform;  
  
        //卸载AssetBundle的镜像  
        // 传false的时候:只会卸载内存镜像的AssetBundle,但是由AssetBundle生成的Prefab变量是不会被卸载的  
        // 传true的时候:会卸载内存镜像,也会卸载由镜像生成的object变量  
        bundle.Unload(false);  
  
    }  

Tip:

1:AssetBundle.LoadAsset(路径); // 资源所在的路径名字

2: AssetBundle.LoadAllAsset()加载所有的资源

3:卸载

AssetBoundle.Unload(false);

AssetBoundle.Unload(true);

 true: 卸载内存镜像以及Asset的内存实例;

  false: 卸载内存镜像不卸载Asset内存实例;

4: 不能使用WWW对象去下载一个已经被加载进来的AssetBundle;

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章