AssetBundle Workflow
翻譯原址:https://docs.unity3d.com/2017...
AssetBundle 工作流程
開始使用AssetBundles(以后我簡稱他AB),遵循以下步驟,更多關于更多工作流的細節信息都可以在本節的其他頁面找到。
把資源賦值給AB
把資源賦值給AB遵循以下步驟(以下步驟簡稱打標記)
1.在Project View中選擇你想要賦值給AB的資源
2.在Inspector中檢查選中的對象
3.在Inspector的最低端,你可以看見一部分是賦值AB,另一個是變體(不知道該咋翻譯這個單詞,大家可以理解為一個文件的后綴名)
4.左邊這個下拉菜單是給AB賦值的,而右邊的則是給變體(真的這個翻譯的好別扭,真想叫它后綴名)賦值的。
5.點擊左邊的下拉菜單,你看到的是None,這意味著當前AB注冊的名字
6.如果還沒有被創建,你會看到一個列表如上圖(翻譯的時候我反正是沒找著在哪兒,我這里附贈一張)
7.點擊 New去創建一個新的AB(嚴謹一點說這里應該是去創建一個菜單,待會兒用于打包可以選擇性被標記)
8.輸入你想要創建的AB名稱。注意一下AB的名字是支持文件夾那樣的寫法“/”,這樣就可以添加一個子文件夾,例如:environment/forest 這樣就會創建一個bundle叫做forest的子文件夾在environment
9.只要你選擇或者創建了一個AB名稱,你就可以根據你所需在右邊創建一個Variant(變種,我以后就叫后綴名吧)。后綴名不是像要求AB時那樣,他是一個后綴當然更不用 “/”
想要關于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(資源包)
要想知道這段代碼具體做了什么,請參見文檔(我是很排斥這種設計的,為啥不現在就說,但是后來想想人家畢竟是官方Document,不是教程也可以理解) “Building AssetBundles”( https://docs.unity3d.com/2017... )
把AB上傳到外部存儲
如果用戶打算,從本地存儲去加載,相信你會對AssetBundles.LoadFromFile這個Api感興趣,用法如下:
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...)
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的AssetBundle Workflow的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全球看电影最贵的是哪里?日本第三 均价最
- 下一篇: ab 的结果分析