AssetBundle Workflow

翻译原址:https://docs.unity3d.com/2017...html

AssetBundle 工做流程

开始使用AssetBundles(之后我简称他AB),遵循如下步骤,更多关于更多工做流的细节信息均可以在本节的其余页面找到。编辑器

把资源赋值给AB

把资源赋值给AB遵循如下步骤(如下步骤简称打标记)函数

1.在Project View中选择你想要赋值给AB的资源
2.在Inspector中检查选中的对象
3.在Inspector的最低端,你能够看见一部分是赋值AB,另外一个是变体(不知道该咋翻译这个单词,你们能够理解为一个文件的后缀名)
4.左边这个下拉菜单是给AB赋值的,而右边的则是给变体(真的这个翻译的好别扭,真想叫它后缀名)赋值的。
5.点击左边的下拉菜单,你看到的是None,这意味着当前AB注册的名字
6.若是尚未被建立,你会看到一个列表如上图(翻译的时候我反正是没找着在哪儿,我这里附赠一张)ui

clipboard.png

7.点击 New去建立一个新的AB(严谨一点说这里应该是去建立一个菜单,待会儿用于打包能够选择性被标记)
8.输入你想要建立的AB名称。注意一下AB的名字是支持文件夹那样的写法“/”,这样就能够添加一个子文件夹,例如:environment/forest 这样就会建立一个bundle叫作forest的子文件夹在environment
9.只要你选择或者建立了一个AB名称,你就能够根据你所需在右边建立一个Variant(变种,我之后就叫后缀名吧)。后缀名不是像要求AB时那样,他是一个后缀固然更不用 “/”spa

想要阅读更多关于AB和附带的策略信息,参见文档 “Preparing Assets for AssetBundles”(https://docs.unity3d.com/2017... )翻译

构建AB

在Assets文件夹下建立一个文件夹叫作Editor(之因此接下来的代码要放在Editor文件夹下是由于咱们要对unity进行拓展只能放在这下面编辑器内容参见( https://docs.unity3d.com/2017... )),并在这个文件夹内放置一个脚本(新建)设计

using UnityEditor;

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.Standalone);
    }
}

这段脚本首先会建立一个菜单栏,在顶部的Assets菜单下就能够找到一个叫Build AssetBundles(代码中MenuItem就会就建立这样一个菜单)若是你点击它,就会执行被这个Tag(一个函数被一个东西(例如MenuItem)标记就有了其余的做用)所标记而定函数的代码,当你点击Build AssetBundles后一个对话框和进度条。这将会把你的标记了的资源和ab名称放到上面代码中的assetBundleDirectory,这样就打好了一个AB(资源包)3d

要想知道这段代码具体作了什么,请参见文档(我是很排斥这种设计的,为啥不如今就说,可是后来想一想人家毕竟是官方Document,不是教程也能够理解) “Building AssetBundles”( https://docs.unity3d.com/2017... )rest

把AB上传到外部存储

若是用户打算,从本地存储去加载,相信你会对AssetBundles.LoadFromFile这个Api感兴趣,用法以下:code

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 须要一个路径参数

若是你本身管理AB,并须要下载到你的游戏,你或许会对UnityWebRequest API感兴趣,例子以下:

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)须要一个AB包的URL(英文原版是uri)第二个参数是哪一种版本的ab你须要(由于每一个版本的资源会发生变化ab包的内容也不同)在这个例子中,咱们任然指向一个本地URL,固然你能够指向你存放ab的位置。

UnityWebRequest 有一个专门处理AB的 DownloadHandlerAssetBundle 能够从这里面获取请求

无论你用什么方法去获得AB包,如今你要从AB包里面获取object,须要使用LoadAsset<T>(string)能够从ab包中加载资源,他须要一个泛型T,指的是这个资源加载出来后是什么类型的资源(Sprite,Object...),参数是指的你的资源相对于你ab包的路径。你能够随意的使用返回,回来的东西,就像其余一切unity内置的object,例如你能够在场景中建立一个GameObject,你只须要调用Instantiate函数。

更多信息关于加载AB,参见Using AssetBundles Natively(https://docs.unity3d.com/2017...

相关文章
相关标签/搜索