1. 程式人生 > >詳解assetbundle打包

詳解assetbundle打包

· 建立AssetBundle 1.建立一個空的Prefab,命名Cube,然後建立一個Cube,將其拉到剛建立好的Prefab
2.新建一個指令碼ExportAssetBundles.cs(程式碼來自官方文件),儲存在Asset/Editor目錄下 1. 2. [MenuItem("Assets/Build AssetBundle From Selection")]   3. static void ExportResourceRGB2()   4. {   5.     // 開啟儲存面板,獲得使用者選擇的路徑   6.     string path = EditorUtility.SaveFilePanel("Save Resource", "", "New Resource", "assetbundle");  7.   
8.     if (path.Length != 0)   9.     {   10.         // 選擇的要儲存的物件   11.         Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);   12.         //打包   13.         BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets, BuildTarget.StandaloneWindows);   14.     }  
15. }   這時我們將看到Asset下面出現Build AssetBundle From SelectionBuild Scene
3.選中預設Cube,執行Build AssetBundle From Selection。這時會彈出一個儲存框,將其命名為cube.unity3d(這裡為了測試方便,放在c盤。實際專案中,我們是需要將他們放在web伺服器,供所有客戶端下載更新)
4.新建一個場景scene1.unity,上面放置幾個模型,然後儲存
5.選中該場景,在之前的ExportAssetBundles.cs指令碼中新增打包場景的函式,執行Assets->Build Scene
,儲存為scene1.unity3d(這裡為了測試方便,也放在c) 1. [MenuItem("Assets/Save Scene")]   2. static void ExportScene()   3. {   4.       // 開啟儲存面板,獲得使用者選擇的路徑   5.     string path = EditorUtility.SaveFilePanel("Save Resource", "", "New Resource", "unity3d");   6.    7.     if (path.Length != 0)   8.     {   9.         // 選擇的要儲存的物件   10.         Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);   11.         string[] scenes = {"Assets/scene1.unity"};   12.         //打包   13.         BuildPipeline.BuildPlayer(scenes,path,BuildTarget.StandaloneWindows,BuildOptions.BuildAdditionalStreamedScenes);   14.     }   15. }   注意事項
a.AssetBundle的儲存字尾名可以是assetbundle或者unity3d
b.BuildAssetBundle要根據不同的平臺單獨打包,BuildTarget引數指定平臺,如果不指定,預設的webplayer
· 載入AssetBundle 我們通過一個簡單的程式碼來演示如何載入assetbundle,包括載入普通asset和場景。 1. using System;   2. using UnityEngine;   3. using System.Collections;   4.    5. public class Load: MonoBehaviour   6. {   7.     private string BundleURL = "file:///C:/cube.assetbundle";   8.     private string SceneURL = "file:///C:/scene1.unity3d";  9.    10.     void Start()   11.     {   12.         //BundleURL = "file//"+Application.dataPath+"/cube.assetbundle";   13.         Debug.Log(BundleURL);   14.         StartCoroutine(DownloadAssetAndScene());   15.     }    17.     IEnumerator DownloadAssetAndScene()   18.     {   19.         //下載assetbundle,載入Cube   20.         using (WWW asset = new WWW(BundleURL))   21.         {   22.             yield return asset;   23.             AssetBundle bundle = asset.assetBundle;   24.             Instantiate(bundle.Load("Cube"));   25.             bundle.Unload(false);   26.             yield return new WaitForSeconds(5);   27.         }   28.         //下載場景,載入場景   29.         using (WWW scene = new WWW(SceneURL))   30.         {   31.             yield return scene;   32.             AssetBundle bundle = scene.assetBundle;   33.             Application.LoadLevel("scene1");   34.         }             36.     }   37. }   注意事項
a.LoadFromCacheOrDownload 可以指定版本,如果本地版本是新的,將不會從伺服器讀取
b.如果是多個資源打包在一起,我們要通過bundle.Load(),載入特定的資源
c.掛載在模型上的指令碼也可以一起打包,但是保證指令碼在原目錄也要存在,否則加載出來無法執行。
· AssetBundle依賴關係 如果一個公共物件被多個物件依賴,我們打包的時候,可以有兩種選取。一種是比較省事的,就是將這個公共物件打包到每個物件中。這樣會有很多弊端:記憶體被浪費了;加入公共物件改變了,每個依賴物件都得重新打包。AssetBundle提供了依賴關係打包。 我們在程式載入的時候必須保證先載入公共物件。否則,只能是在各個物件載入成功後,再通過程式手動新增進來,比較繁瑣。在實際專案中,由於是團隊開發,物件間的依賴關係通常會比較凌亂,最好在開發週期就定好相關的規範約束,方便管理。
· 總結 這一節的內容偏實際操作,官方文件和雨鬆的blog中已經有更加詳細介紹。如果大家還有不明白的地方,可以結合文件再實際操作一下。