AssetBundle使用
撰写于 2019-07-03 修改于 2019-07-03 分类 Unity
AssetBundle工作流程
要开始使用AssetBundles,需要遵循以下步骤。
分配Assets给AssetBundles
把一个Asset分配给一个AssetBundle,需要使用一下步骤
- 从
project
面板中,选择你想要打进包的asset - 查看
inspector
面板中,当前选择的asset的属性 - 在
inspector
面板的底部,可以看到分配的AssetBundles和后缀的显示部分 - 左边的下拉列表中可以选择分配的AssetBundle,右边可选择AssetBundle的后缀名
- 点击左边的下拉列表,表示当前已经注册的AssetBundle名字,默认为None
- 点击
New...
可创建一个新的AssetBundle - 输入你想要设置的AssetBundle的名字。需要注意的是:AssetBundle的名称支持文件夹结构,这种结构取决于你输入的名称。如果想添加一个子文件夹,用
/
做分隔。例如:你输入environment/forest
,将会在environment
文件夹下创建一个名为forest
的AssetBundle - 一旦你选择或者创建了一个AssetBundle名字,你也可以用这种方法,从右边下拉列表来分配或创建一个后缀名。后缀名不是必须的。
生成AssetBundles
在Assets
文件夹下,创建一个文件夹,命名为Editor
,然后在Editor
文件夹下创建一个C#
文件,输入一下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16using UnityEditor;
using System.IO;
public class CreateAssetBundles
{
[ ]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles";
if(!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
}
}
这段代码将会在Assets
按钮菜单底部创建一个名为Build AssetBundles
的按钮,如果点击该按钮,就会执行与之关联的函数。当点击该按钮时,就会生成一个有进度条的对话框。这将会打包所有带有AssetBundle名字的assets,然后把他们放在通过assetBundleDirectory设置的文件夹中。
把AssetBundles上传至服务器
这一步对于每个开发者来说都是不同的,Unity并不会告诉你怎么做。如果你想把你的AssetBundles
上传至第三方服务器,do it!如果你就是单纯的在做本地开发,并打算把所有的AssetBundle放在磁盘上,skip it!
加载AssetBundles和Assets
如果你想从本地加载,你可能会使用到 AssetBundles.LoadFromFile
,例如:1
2
3
4
5
6
7
8
9
10
11public class LoadFromFileExample extends MonoBehaviour {
function Start() {
var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
if (myLoadedAssetBundle == null) {
Debug.Log("Failed to load AssetBundle!");
return;
}
var prefab = myLoadedAssetBundle.LoadAsset.<GameObject>("MyObject");
Instantiate(prefab);
}
}
LoadFromFile
需要一个本地的包路径。
如果你自己托管AssetBundles
,需要下载到你的游戏中,会用到 UnityWebRequest
的API,例如:1
2
3
4
5
6
7
8
9
10
11
12IEnumerator InstantiateObject()
{
string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;
UnityEngine.__Networking__.UnityWebRequest request = UnityEngine.__Networking__.UnityWebRequest.GetAssetBundle(uri, 0);
yield return request.Send();
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
GameObject cube = bundle.LoadAsset<GameObject>("Cube");
GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");
Instantiate(cube);
Instantiate(sprite);
}
GetAssetBundle(string, int)
需要传入AssetBundle
的uri和要下载的包的版本。在上面的例子中,我们仍然指向一个本地文件,但字符串uri可以指向你托管的任何AssetBundles的URL。UnityWebRequest
包含一个特殊的类来处理AssetBundles
:DownloadHandlerAssetBundle
,这个类可以从请求中获取AssetBundle
。
无论使用哪种方法,现在都可以访问AssetBundle对象。你需要使用AssetBundle中的 LoadAsset<T>(string)
方法,这个方法需要传入类型T
,这个类型就是你想要加载的asset的类型,还需要传入asset在包中的名字。这个方法返回任何你想从 AssetBundle
中加载的对象。你可以像使用Unity中内置对象一样使用该加载的对象。例如,如果你想在场景中创建一个GameObject,你只需要调用Instantiate(gameObjectFromAssetBundle)
。