在網上查看了不少資料,想詳細搞清楚AssetBundle的原理。以實現符合項目需求的打包工具和加載邏輯php
AssetBundle是Unity用於動更的一種資源打包格式,若是某個資源須要動更的話,它必須被打包成AssetBundlecss
Unity5.x已經大幅度簡化了AssetBundl的打包過程,理論上只須要調用一個API便可以完成打包git
BuildPipeline.BuildAssetBundles(RES_OUTPUT_PATH, BuildAssetBundleOptions.DeterministicAssetBundle, BuildTarget.StandaloneOSXIntel);
但資源之間的依賴關係,避免資源重複打包的問題仍是要本身解決。Unity5.x提供了一個很好的東西,就是能夠給資源設置AssetBundleNamegithub
Unity5.x中會將設置AssetBundleName相同的資源打包到一塊兒,因此咱們的打包過程其實就是把須要打包到一塊兒的資源設置成相同的AssetBundleName,爲每一個資源設置AssetBundleName。最後調用打包API便可完成打包工具
我目前使用的打包規則是:ui
關鍵代碼以下:spa
/// <summary> /// 設置AssetBundleName /// </summary> /// <param name="fullpath">Fullpath.</param> public static void setAssetBundleName(string fullPath) { string[] files = System.IO.Directory.GetFiles (fullPath); if (files == null || files.Length == 0) { return; } Debug.Log ("Set AssetBundleName Start......"); string dirBundleName = fullPath.Substring (RES_SRC_PATH.Length); dirBundleName = dirBundleName.Replace ("/", "@") + ASSET_BUNDLE_SUFFIX; foreach (string file in files) { if (file.EndsWith (".meta")) { continue; } AssetImporter importer = AssetImporter.GetAtPath (file); if (importer != null) { string ext = System.IO.Path.GetExtension (file); string bundleName = dirBundleName; if (null != ext && (ext.Equals (".prefab")||ext.Equals(".unity"))) { // prefab單個文件打包 bundleName = file.Substring (RES_SRC_PATH.Length); bundleName = bundleName.Replace ("/", "@"); if (null != ext) { bundleName = bundleName.Replace (ext, ASSET_BUNDLE_SUFFIX); } else { bundleName += ASSET_BUNDLE_SUFFIX; } } bundleName = bundleName.ToLower (); Debug.LogFormat ("Set AssetName Succ, File:{0}, AssetName:{1}", file, bundleName); importer.assetBundleName = bundleName; EditorUtility.UnloadUnusedAssetsImmediate(); // 存儲bundleInfo AssetBuildBundleInfo info = new AssetBuildBundleInfo(); info.assetName = file; info.fileName = file; info.bundleName = bundleName; if (null != ext) { info.fileName = file.Substring (0, file.IndexOf (ext)); } fileMap.Add (file, info); List<AssetBuildBundleInfo> infoList = null; bundleMap.TryGetValue(info.bundleName, out infoList); if (null == infoList) { infoList = new List<AssetBuildBundleInfo> (); bundleMap.Add (info.bundleName, infoList); } infoList.Add (info); } else { Debug.LogFormat ("Set AssetName Fail, File:{0}, Msg:Importer is null", file); } } Debug.Log ("Set AssetBundleName End......"); }
打包好以後生成依賴關係的配置文件,配置文件格式以下:3d
<files> <file> <bundleName>prefabs@login.unity3d</bundleName> <fileName>Assets/Resources/Prefabs/Login</fileName> <assetName>Assets/Resources/Prefabs/Login.prefab</assetName> <deps> <dep>textures@common.unity3d</dep> <dep>textures@login.unity3d</dep> </deps> </file> <file> <bundleName>scenes@main.unity3d</bundleName> <fileName>Assets/Resources/Scenes/Main</fileName> <assetName>Assets/Resources/Scenes/Main.unity</assetName> </file> <file> <bundleName>textures@common.unity3d</bundleName> <fileName>Assets/Resources/Textures/Common/btn_blue</fileName> <assetName>Assets/Resources/Textures/Common/btn_blue.png</assetName> </file> <file> <bundleName>textures@common.unity3d</bundleName> <fileName>Assets/Resources/Textures/Common/btn_red</fileName> <assetName>Assets/Resources/Textures/Common/btn_red.png</assetName> </file> <file> <bundleName>textures@login.unity3d</bundleName> <fileName>Assets/Resources/Textures/Login/bg</fileName> <assetName>Assets/Resources/Textures/Login/bg.png</assetName> </file> <file> <bundleName>textures@login.unity3d</bundleName> <fileName>Assets/Resources/Textures/Login/text_input</fileName> <assetName>Assets/Resources/Textures/Login/text_input.png</assetName> </file> </files>
bundleName
打包的文件名fileName
包裏包含的文件名assetName
包裏的AssetNamedeps
依賴的其餘bundleName上述過程就完成了打包,具體能夠參考的github: https://github.com/aodota/TestUnitycode