假设我们现在有一个立方体的预制体需要打包进来怎么操作?
- 创建一个立方体,然后将它托进res文件夹,制作一个立方体预制体(prefab)
- 右下角的小窗口里面,我们可以设置这个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;