第一次见AssetBundles的应用场景是在公司的一个项目中,由于加入时,这个项目已经大致完成,所以后期并没有做关于这方面的事情。不过幸好Unity有相当健全的官方文档,所以花了一些时间了解了AssetBundles的应用场景以及具体应用,下面先介绍一下AssetBundle的应用场景。
1)这是一个打包的过程,首先想到的场景是一些网络游戏需要热更新时,可以将资源打包成AssetBundles,然后本地下载此包,实现资源的动态更新。其次,可以将场景中所需资源在本地打包,然后用代码控制着加载资源,由于打包后所占空间极小,所以这种情况也比较常见。
2)虽官方文档已经介绍得相当清楚,但记录下来,以便以后需要时可以随时查阅也是极好的,首先说一下如何将资源打包。
1>几乎所有的资源都可以打包,Prefab、纹理图、音效、视频等。点击资源,最Inspector的最下方有个AssetBundle的选项,点击之后,创建一个新的AssetBundle名。这样,这个资源就是这个名字下面的资源了,在以后加载的时候,需要时刻注意这个路径问题。
2>下面列出创建AssetBundles的脚本。
using UnityEditor;
using System;
public class pack {
[MenuItem("Assets/Build AssetBundles")]
static void BuildAssetBundles()
{
//这里是填得路径,父路径为该项目的路径,即Assets的父路径
BuildPipeline.BuildAssetBundles("AssetBundles");
}
}
注:此文件夹倒不必必须叫AssetBundles,只是官方这样叫,且这样比较明了。
3>创建了AssetBundles之后,就可以在脚本中动态地加载资源并进行使用了,下面贴出加载AssetBundles的代码。
public void Start()
{
//由于AssetBundles文件夹和Assets文件夹同级,所以去掉/Assets路径,并添加上/AssetBundles路径
BundleURL = "file:///" + Application.dataPath.Replace("/Assets", "") + "/AssetBundles";
}
IEnumerator LoadAssetBundle()
{
while (!Caching.ready)
yield return null;
//.. /image是AssetBundles文件夹下AssetBundle的名称,里面装着资源
using(WWW www = WWW.LoadFromCacheOrDownload(BundleURL + "/image",version))
{
yield return null;
if (www.error != null)
throw new Exception("WWW download had an error," + www.error);
AssetBundle bundle = www.assetBundle;
if(AssetName == "")
{
Debug.Log(bundle.mainAsset);
}
else
{
Debug.Log(bundle);
Debug.Log(bundle.LoadAsset(AssetName));
bundle.Unload(false);
}
}
}
注:Unity版本不同,所用的API也不同。
此外,我的Unity版本是5.3.4。