public static void BuildAssetBuindles(BuildTarget buildTargetGroup, int version) { List <AssetBundleBuild> buildsList = new List <AssetBundleBuild>(); foreach (var keyValue in m_abbuildDic) { buildsList.Add(keyValue.Value.GetBundleBuild()); } BuildAssetBundleOptions m_options = BuildAssetBundleOptions.DeterministicAssetBundle | BuildAssetBundleOptions.ChunkBasedCompression; var assetBundleManifest = BuildPipeline.BuildAssetBundles(PreOutPath(buildTargetGroup), buildsList.ToArray(), m_options, buildTargetGroup); ABDesc structs = new ABDesc(); AddResrouceToAbDataStruct(assetBundleManifest, structs); m_currentCache.newVersion = m_curVersion; //1存储ResourceManager的描述文件, SaveABDataFile(structs, buildTargetGroup); //2将相应的ab拷贝到对应的文件夹中 CopyABToUpdateForlder(buildTargetGroup); m_currentCache.assetList.Clear(); foreach (var keyvalue in m_dependsDic) { m_currentCache.assetList.Add(keyvalue.Value.ToCacheData()); } ABAssetDataUtil.SaveAssetCache(buildTargetGroup, m_currentCache); }
static void SaveABDataFile(ABDesc abData, BuildTarget buildTargetGroup) { string outPath = PreOutPath(buildTargetGroup); string fileName = "ABDatabase"; if (m_currentCache.firstVersion != m_curVersion) { fileName = m_curVersion + "_ABDatabase"; } outPath += "/" + m_curVersion; Directory.CreateDirectory(outPath); string path = outPath + "/" + fileName + ".abMap"; string json = JsonMapper.ToJson(abData); var bytes = System.Text.Encoding.UTF8.GetBytes(json); if (File.Exists(path)) { File.Delete(path); } using (Stream file = File.Create(path)) { file.Write(bytes, 0, bytes.Length); file.Close(); } if (m_currentCache.firstVersion == m_currentCache.newVersion) { var newPath = Application.streamingAssetsPath + "/AssetBundles/" + fileName + ".abMap"; if (File.Exists(newPath)) { File.Delete(newPath); } using (Stream file = File.Create(newPath)) { file.Write(bytes, 0, bytes.Length); file.Close(); } } }
private static void AddResrouceToAbDataStruct(AssetBundleManifest manifest, ABDesc structs) { foreach (var build in m_abbuildDic) { if (build.Value.bundleId.version >= m_curVersion) { foreach (string fileName in build.Value.fileList) { if (fileName.EndsWith("unity")) { ABSceneDesc sceneData = new ABSceneDesc(); sceneData.m_sceneName = fileName; sceneData.m_bundleName = build.Value.BundleName; sceneData.m_ressVersion = build.Value.bundleId.version; structs.m_scenes.Add(sceneData); } else if (fileName.EndsWith(".prefab") || fileName.EndsWith("shader") || fileName.EndsWith("cginc") || fileName.EndsWith("ttf") || fileName.EndsWith("shadervariants") || fileName.EndsWith("png")) { ABFileDesc sceneData = new ABFileDesc(); sceneData.m_gbName = fileName; sceneData.m_bundleName = build.Value.BundleName; sceneData.m_ressVersion = build.Value.bundleId.version; structs.m_files.Add(sceneData); } } } } var data = manifest.GetAllAssetBundles(); for (int i = 0; i < data.Length; i++) { ABDependencies ad = new ABDependencies(); var abs = manifest.GetAllDependencies(data[i]); ad.m_abName = data[i]; if (ad.m_abName == EnumAB.shaders_ab.ToString()) { if (m_isUpdateShader) { ad.m_ressVersion = m_curVersion; } else { ad.m_ressVersion = m_currentCache.firstVersion; } } else { var spliteStrList = ad.m_abName.Split('_'); if (spliteStrList.Length >= 2) { int tversion = 0; if (int.TryParse(spliteStrList[0], out tversion)) { ad.m_ressVersion = tversion; } else { ad.m_ressVersion = m_currentCache.firstVersion; } } else { ad.m_ressVersion = m_currentCache.firstVersion; } } for (int j = 0; j < abs.Length; j++) { ad.m_dependenciesAb.Add(abs[j]); } structs.m_abDepends.Add(ad); } }