AssetBundle使用

撰写于 2019-07-03 修改于 2019-07-03 分类 Unity 标签 AssetBundle

AssetBundle工作流程

要开始使用AssetBundles,需要遵循以下步骤。

分配Assets给AssetBundles

把一个Asset分配给一个AssetBundle,需要使用一下步骤

  1. project 面板中,选择你想要打进包的asset
  2. 查看 inspector 面板中,当前选择的asset的属性
  3. inspector面板的底部,可以看到分配的AssetBundles和后缀的显示部分
  4. 左边的下拉列表中可以选择分配的AssetBundle,右边可选择AssetBundle的后缀名
  5. 点击左边的下拉列表,表示当前已经注册的AssetBundle名字,默认为None
  6. 点击New...可创建一个新的AssetBundle
  7. 输入你想要设置的AssetBundle的名字。需要注意的是:AssetBundle的名称支持文件夹结构,这种结构取决于你输入的名称。如果想添加一个子文件夹,用/做分隔。例如:你输入environment/forest,将会在environment文件夹下创建一个名为forest的AssetBundle
  8. 一旦你选择或者创建了一个AssetBundle名字,你也可以用这种方法,从右边下拉列表来分配或创建一个后缀名。后缀名不是必须的。

    生成AssetBundles

    Assets文件夹下,创建一个文件夹,命名为 Editor,然后在Editor文件夹下创建一个C#文件,输入一下代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    using UnityEditor;
    using System.IO;

    public class CreateAssetBundles
    {
    [MenuItem("Assets/Build AssetBundles")]
    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
11
public 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
12
IEnumerator 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)

Site by ZHJ using Hexo & Random

Hide