跟我從零基礎學習Unity3D開發--資源打包篇(AssetBundle)
好久沒更新了,一直在加班敢專案進度。這裡和關注我的部落格的童鞋表示一下歉意!這裡有我錄的Unity3D從零開始的視訊教程大家可以關注一下:http://www.imooc.com/view/555 視訊會陸續的更新,需要講什麼也可以留言給我。
之前在專案中一直用的是別人以前的寫的打包程式碼,後來專案需要需要修改以前的程式碼把打包的程式碼過了一遍,今天把自己遇到的問題和打包思路在這路寫下來。
在untiy支援載入方面分為兩個種類:
第一類:Resources方式載入-------我們不用打包資源,放在專案中的Resources目錄下就能在程式碼中直接加載出來。
第二類:assetBundle方式載入-----需要我們打包資源,把每個資源打包成一個個Bundle,然後載入。
兩類資源載入方式在遊戲專案中都會用,Resources載入的資源一般是要求非常及時的,assetBundle載入相對要慢一些因為需要把assetBundle資源解壓出來。assetBundle也是方便專案中做熱更新(在遊戲對外發布的過程中,我們需要替換一些資源,通過熱更新的方式把資源更新出去供當前的客戶端下載替換)。Assetbundle是官方推薦使用的打包方式,AssetbundleUnity(Pro)提供的資源打包策略。
打包思路:
*高能:
- a、打包的資源一定要放在StreamingAssets目錄下因為在移動平臺下只能訪問這個目錄
- b、AssetBundle的儲存字尾名可以是assetbundle或者unity3d
- c、BuildAssetBundle要根據不同的平臺單獨打包,BuildTarget引數指定平臺,如果不指定,預設的webplayer
1、準備好我們需要打包的資源
2、載入需要打包的資源
3、獲取當前物件列表的所有依賴項
4、設定打包編譯選項
5、開始打包
重要函式解釋:
Selection.objects --------------------------------------------------- 這個方法是用於判斷在Asset目錄中返回選中了哪些資原始檔
AssetDatabase.GetAssetpath()-------------------------------------- 獲取的是工程檔案相對於Asset的路徑
AssetDatabase.LoadMainAssetAtPath()---------------------------- 載入指定路徑下的資源
EditorUtility.CollectDependencies()--------------------------------- 獲取當前物件列表的所有依賴項
BuildAssetBundleOptions ------------------------------------------- 打包編譯選項
BuildPipeline.BuildAssetBundle() ---------------------------------- 打包函式
Path.GetFileNameWithoutExtension() ----------------------------- 獲取路徑下的不要副檔名的檔名
Path.ChangeExtension() -------------------------------------------- 改變路徑的檔案字尾名
EditorUserBuildSettings.activeBuildTarget ----------------------- 判斷當前編譯平臺
下面列出打包例項程式碼!
例項:
1 using UnityEngine; 2 using System.Collections; 3 using UnityEditor; 4 using System.IO; 5 using System.Collections.Generic; 6 public class AssetBoundExport :EditorWindow { 7 8 [MenuItem("Window/資源打包")] 9 static void Init() 10 { 11 EditorWindow.GetWindow(typeof(AssetBoundExport)); 12 } 13 14 void OnGUI() 15 { 16 /* 17 *ui1.prefab 和ui2.prefab 是兩個預製件,裡面都包含loading.png這張圖 18 *這個方法是講依賴打包的 19 *通一個資源用在多個預製件中的時候我們就採用這種依賴打包更小 20 */ 21 if (GUILayout.Button("打包UI物件", GUILayout.Width(100))) 22 { 23 24 BuildPipeline.PushAssetDependencies(); 25 26 Object baseTexture = AssetDatabase.LoadMainAssetAtPath("Assets/Texture/loading.png"); 27 ExportBundle<Texture2D>(AssetDatabase.GetAssetPath(baseTexture)); 28 29 BuildPipeline.PushAssetDependencies(); 30 Object p1 = AssetDatabase.LoadMainAssetAtPath("Assets/Prefab/ui1.prefab"); 31 ExportBundle<GameObject>(AssetDatabase.GetAssetPath(p1)); 32 BuildPipeline.PopAssetDependencies(); 33 34 BuildPipeline.PushAssetDependencies(); 35 Object p2 = AssetDatabase.LoadMainAssetAtPath("Assets/Prefab/ui2.prefab"); 36 ExportBundle<GameObject>(AssetDatabase.GetAssetPath(p2)); 37 BuildPipeline.PopAssetDependencies(); 38 39 BuildPipeline.PopAssetDependencies(); 40 AssetDatabase.Refresh(); 41 } 42 43 } 44 /// <summary> 45 /// 這個方法是用於單獨給某類資源打包(這個方法例項是打圖片的) 46 /// 應用場景:在實際專案中我們每次不一定是要全部打包,更多的時候是隻需要打某一個資源 47 /// </summary> 48 [MenuItem("Assets/打包/Textrue")] 49 public static void PackageTextureAssetBundle() 50 { 51 Object[] _Object = Selection.objects; 52 for (int i = 0; i < _Object.Length; i++) 53 { 54 ExportBundle<Texture2D>(AssetDatabase.GetAssetPath(_Object[i])); 55 } 56 } 57 58 /// <summary> 59 /// 打包通用類 60 /// </summary> 61 /// <typeparam name="T"></typeparam> 62 /// <param name="path"></param> 63 private static void ExportBundle<T>(string path) where T:Object 64 { 65 T assetObject = AssetDatabase.LoadMainAssetAtPath(path) as T; 66 if (assetObject == null) 67 { 68 Debug.Log("can't load "+path); 69 return; 70 } 71 72 string _path = Application.dataPath + "/StreamingAssets/PC/" + Path.GetFileNameWithoutExtension(path); 73 _path = Path.ChangeExtension(_path, ".unity3d"); 74 75 List<Object> obejectList = new List<Object>(); 76 Object[] tempobject = new Object[1]; 77 tempobject[0] = assetObject; 78 Object[] kDepens = EditorUtility.CollectDependencies(tempobject); 79 for (int i = 0; i < kDepens.Length; i++) 80 { 81 obejectList.Add(kDepens[i]); 82 } 83 84 BuildAssetBundleOptions babo = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets 85 | BuildAssetBundleOptions.DeterministicAssetBundle; 86 bool istru= BuildPipeline.BuildAssetBundle(assetObject, obejectList.ToArray(),_path, babo, EditorUserBuildSettings.activeBuildTarget); 87 if (istru == true) 88 Debug.Log("打包成功"); 89 else 90 Debug.Log("打包失敗"); 91 } 92 }