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...

相關文章
相關標籤/搜索