回覆列表
  • 1 # CoreCode

    建立AssetBundle1.建立一個空的Prefab,命名Cube,然後建立一個Cube,將其拉到剛建立好的Prefab2.新建一個指令碼ExportAssetBundles.cs(程式碼來自官方文件),儲存在Asset/Editor目錄下[csharp]viewplaincopyprint?//在Unity編輯器中新增選單[MenuItem("Assets/BuildAssetBundleFromSelection")]staticvoidExportResourceRGB2(){//開啟儲存面板,獲得使用者選擇的路徑stringpath=EditorUtility.SaveFilePanel("SaveResource","","NewResource","assetbundle");if(path.Length!=0){//選擇的要儲存的物件Object[]selection=Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);//打包BuildPipeline.BuildAssetBundle(Selection.activeObject,selection,path,BuildAssetBundleOptions.CollectDependencies|BuildAssetBundleOptions.CompleteAssets,BuildTarget.StandaloneWindows);}}這時我們將看到Asset下面出現BuildAssetBundleFromSelection和BuildScene3.選中預設Cube,執行BuildAssetBundleFromSelection。這時會彈出一個儲存框,將其命名為cube.unity3d(這裡為了測試方便,放在c盤。實際專案中,我們是需要將他們放在web伺服器,供所有客戶端下載更新)4.新建一個場景scene1.unity,上面放置幾個模型,然後儲存5.選中該場景,在之前的ExportAssetBundles.cs指令碼中新增打包場景的函式,執行Assets->BuildScene,儲存為scene1.unity3d(這裡為了測試方便,也放在c盤)[csharp]viewplaincopyprint?[MenuItem("Assets/SaveScene")]staticvoidExportScene(){//開啟儲存面板,獲得使用者選擇的路徑stringpath=EditorUtility.SaveFilePanel("SaveResource","","NewResource","unity3d");if(path.Length!=0){//選擇的要儲存的物件Object[]selection=Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);string[]scenes={"Assets/scene1.unity"};//打包BuildPipeline.BuildPlayer(scenes,path,BuildTarget.StandaloneWindows,BuildOptions.BuildAdditionalStreamedScenes);}}注意事項a.AssetBundle的儲存字尾名可以是assetbundle或者unity3db.BuildAssetBundle要根據不同的平臺單獨打包,BuildTarget引數指定平臺,如果不指定,預設的webplayer載入AssetBundle我們透過一個簡單的程式碼來演示如何載入assetbundle,包括載入普通asset和場景。[csharp]viewplaincopyprint?usingSystem;usingUnityEngine;usingSystem.Collections;publicclassLoad:MonoBehaviour{privatestringBundleURL="file:///C:/cube.assetbundle";privatestringSceneURL="file:///C:/scene1.unity3d";voidStart(){//BundleURL="file//"+Application.dataPath+"/cube.assetbundle";Debug.Log(BundleURL);StartCoroutine(DownloadAssetAndScene());}IEnumeratorDownloadAssetAndScene(){//下載assetbundle,載入Cubeusing(WWWasset=newWWW(BundleURL)){yieldreturnasset;AssetBundlebundle=asset.assetBundle;Instantiate(bundle.Load("Cube"));bundle.Unload(false);yieldreturnnewWaitForSeconds(5);}//下載場景,載入場景using(WWWscene=newWWW(SceneURL)){yieldreturnscene;AssetBundlebundle=scene.assetBundle;Application.LoadLevel("scene1");}}}注意事項a.LoadFromCacheOrDownload可以指定版本,如果本地版本是新的,將不會從伺服器讀取b.如果是多個資源打包在一起,我們要透過bundle.Load(),載入特定的資源c.掛載在模型上的指令碼也可以一起打包,但是保證指令碼在原目錄也要存在,否則加載出來無法執行。關於如何更新指令碼,我將放在以後的章節中闡述。AssetBundle依賴關係如果一個公共物件被多個物件依賴,我們打包的時候,可以有兩種選取。一種是比較省事的,就是將這個公共物件打包到每個物件中。這樣會有很多弊端:記憶體被浪費了;加入公共物件改變了,每個依賴物件都得重新打包。AssetBundle提供了依賴關係打包。我們透過一個簡單的例子來學習[csharp]viewplaincopyprint?//啟用交叉引用,用於所有跟隨的資源包檔案,直到我們呼叫PopAssetDependenciesBuildPipeline.PushAssetDependencies();varoptions=BuildAssetBundleOptions.CollectDependencies|BuildAssetBundleOptions.CompleteAssets;//所有後續資源將共享這一資源包中的內容,由你來確保共享的資源包是否在其他資源載入之前載入BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("assets/artwork/lerpzuv.tif"),null,"Shared.unity3d",options);//這個檔案將共享這些資源,但是後續的資源包將無法繼續共享它BuildPipeline.PushAssetDependencies();BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Artwork/Lerpz.fbx"),null,"Lerpz.unity3d",options);BuildPipeline.PopAssetDependencies();這個檔案將共享這些資源,但是後續的資源包將無法繼續共享它BuildPipeline.PushAssetDependencies();BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Artwork/explosiveguitex.prefab"),null,"explosive.unity3d",options);BuildPipeline.PopAssetDependencies();BuildPipeline.PopAssetDependencies();我們在程式載入的時候必須保證先載入公共物件。否則,只能是在各個物件載入成功後,再透過程式手動新增進來,比較繁瑣。在實際專案中,由於是團隊開發,物件間的依賴關係通常會比較凌亂,最好在開發週期就定好相關的規範約束,方便管理。

  • 中秋節和大豐收的關聯?
  • 紅樓夢:馮紫英的酒令裡所寫的姻緣物件是誰?隱含了怎樣的秘密?