//根据manifest检查一遍依赖关系 private void CheckAndClearManifestFiles(BuildTarget target, bool isClear = false) { string ifsBuildDir = JW.Res.FileUtil.CombinePaths( _ifsBuildPath, GetPlatformStr(target)); // string mainAssetBundlePath = JW.Res.FileUtil.CombinePaths(ifsBuildDir, GetPlatformStr(target)); AssetBundle mainAssetBundle = AssetBundle.LoadFromFile(mainAssetBundlePath); if (mainAssetBundle == null) { Terminate("Get RootAssetBundle Failed"); return; } AssetBundleManifest mainAssetManifest = (AssetBundleManifest)mainAssetBundle.LoadAsset("AssetBundleManifest"); if (mainAssetManifest == null) { Terminate("Get RootAssetBundle Manifest Failed!"); return; } // string[] allAbs = mainAssetManifest.GetAllAssetBundles(); foreach (string ab in allAbs) { JW.Common.Log.LogD("Exist AssetBundle:" + ab); } // for (int i = 0; i < _packConfig.PackInfoAll.Count; i++) { ResPackInfo info = _packConfig.PackInfoAll[i]; if (info.GetPackType() == (byte)ResPackType.ResPackTypeBundle) { BundlePackInfo binfo = info as BundlePackInfo; //查找依賴 string[] des = mainAssetManifest.GetAllDependencies(info.Path); if (des != null && des.Length > 0) { binfo.DependencyNames = string.Join(",", des); JW.Common.Log.LogD("Add Dependency:" + binfo.DependencyNames + "-2->" + info.Path); } } } // mainAssetBundle.Unload(true); mainAssetManifest = null; // if (isClear) { string[] files = Directory.GetFiles(ifsBuildDir, "*.manifest", SearchOption.AllDirectories); for (int i = 0; i < files.Length; i++) { JW.Res.FileUtil.DeleteFile(files[i].Replace('\\', '/')); } //删除 Win Android IOS JW.Res.FileUtil.DeleteFile(mainAssetBundlePath); } }
/// 构建资源打包器 public void BuildResourcePacker(BuildTarget target, bool clearManifest, bool writeResCfg = true) { //当前配置的打包 if (_packConfig == null) { Terminate("You must call InitResourcePacker() before BuildResourcePacker()!"); return; } JW.Common.Log.LogD("-->开始打包: " + GetPlatformStr(target)); AssetDatabase.SaveAssets(); //IFS输出目录 string ifsBuildDir = JW.Res.FileUtil.CombinePaths( _ifsBuildPath, GetPlatformStr(target)); if (!JW.Res.FileUtil.IsDirectoryExist(ifsBuildDir)) { JW.Res.FileUtil.CreateDirectory(ifsBuildDir); } else { JW.Common.Log.LogD("-->清理目录: " + ifsBuildDir); JW.Res.FileUtil.ClearDirectory(ifsBuildDir); } //目标target ResPackHelper.BuildTarget = target; try { for (int i = 0; i < _packConfig.PackInfoAll.Count; i++) { ResPackInfo info = _packConfig.PackInfoAll[i]; BuildResource(info, ifsBuildDir, target); } } catch (Exception e) { Terminate(e.Message); } // if (_packConfig.IsGlobalBuild) { JW.Common.Log.LogD("-->全局模式打包-->"); AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); BuildAssetBundleOptions options = _packConfig.GOptions | BuildAssetBundleOptions.DisableWriteTypeTree; BuildPipeline.BuildAssetBundles(ifsBuildDir, options, target); } // JW.Common.Log.LogD("-->检查Manifest-->"); CheckAndClearManifestFiles(target, clearManifest); // if (writeResCfg) { JW.Common.Log.LogD("-->写入包配置信息文件-->"); _packConfig.Write(ifsBuildDir); } JW.Common.Log.LogD("Build Resource Done."); }
//构建资源包 void BuildResource(ResPackInfo ResInfo, string ifsBuildDir, BuildTarget target) { if (ResInfo.GetPackType() == (byte)ResPackType.ResPackTypeBundle) { BuildBundleResource(ResInfo as BundlePackInfo, ifsBuildDir, target); } else if (ResInfo.GetPackType() == (byte)ResPackType.ResPackTypeBinary) { BuildNormalResource(ResInfo as BinaryPackInfo, ifsBuildDir); } }
/// 游戏更新检查后后启动 public void StartAfterUpdate(Action <bool> allCompletedCallback) { _allCompletedCallback = allCompletedCallback; #if USE_PACK_RES if (ResService.GetInstance().PackConfig == null) { JW.Common.Log.LogE("Preloader.StartAfterUpdate : resource initialize failed"); return; } // _bundleFiles = BundleMediator.GetInstance().GetPreloadBundles(); _bundleLoading = false; string filename = "main_shaders.ab"; _shaderBundle = BundleService.GetInstance().GetBundle(filename); if (_shaderBundle == null) { JW.Common.Log.LogE("Preloader.StartAfterUpdate : failed to get shader bundle"); } ResPackInfo pi = ResService.GetInstance().PackConfig.GetPackInfo(filename); if (pi == null) { _shaderFilename = new JWArrayList <string>(0); } else { _shaderFilename = new JWArrayList <string>(pi.Resources.Count); for (int i = 0; i < pi.Resources.Count; i++) { _shaderFilename.Add(pi.Resources[i].Path); } } #else _bundleFiles = new JWObjList <string>(0); _shaderBundle = null; _shaderFilename = new JWArrayList <string>(0); #endif //真正的开始预加载协成 StartCoroutine(PreloadCoroutine()); }
public void Write(string buidlDir, string excludePackName = null) { List <ResPackInfo> allInfo = _config.PackInfo; List <ResPackInfo> baseInfo = new List <ResPackInfo>(); if (allInfo != null) { for (int i = 0; i < allInfo.Count; ++i) { ResPackInfo pack = allInfo[i]; pack.Path = JW.Res.FileUtil.CombinePaths( "", pack.Path); // if (pack.Path.Equals(excludePackName, StringComparison.OrdinalIgnoreCase)) { JW.Common.Log.LogD("-->写入包配置信息文件 移除-->" + excludePackName); continue; } else { baseInfo.Add(pack); } } } byte[] buffer = new byte[1024 * 1024]; int offset = 0; // count MemoryOperator.WriteShort((short)baseInfo.Count, buffer, ref offset); // resources for (int i = 0; i < baseInfo.Count; i++) { baseInfo[i].Write(buffer, ref offset); } JW.Res.FileUtil.WriteFile(JW.Res.FileUtil.CombinePaths(buidlDir, _outConfigName) , buffer, 0, offset); }
/// 只打包二进制 public void BuildBinaryPacker(BuildTarget target) { //当前配置的打包 if (_packConfig == null) { Terminate("You must call InitResourcePacker() before BuildResourcePacker()!"); return; } JW.Common.Log.LogD("-->开始打包二进制: " + GetPlatformStr(target)); //IFS输出目录 string ifsBuildDir = JW.Res.FileUtil.CombinePaths( _ifsBuildPath, GetPlatformStr(target)); if (!JW.Res.FileUtil.IsDirectoryExist(ifsBuildDir)) { JW.Res.FileUtil.CreateDirectory(ifsBuildDir); } //目标target ResPackHelper.BuildTarget = target; try { for (int i = 0; i < _packConfig.PackInfoAll.Count; i++) { ResPackInfo info = _packConfig.PackInfoAll[i]; if (info.GetPackType() == (byte)ResPackType.ResPackTypeBinary) { BuildResource(info, ifsBuildDir, target); } } } catch (Exception e) { Terminate(e.Message); } }
/// 输出子配置文件 用于运行时读取 public void WriteSubCfg(string buildDir, string[] resourcesPrefixs, string cfgFileName, bool excludeMode = false, string cleanLua = "") { List <ResPackInfo> allInfo = _config.PackInfo; List <ResPackInfo> baseInfo = new List <ResPackInfo>(); if (allInfo != null) { for (int i = 0; i < allInfo.Count; ++i) { ResPackInfo pack = allInfo[i]; pack.Path = JW.Res.FileUtil.CombinePaths( "", pack.Path); bool isIn = false; //非排他模式 if (excludeMode == false) { isIn = false; for (int j = 0; j < resourcesPrefixs.Length; j++) { if (pack.Path.StartsWith(resourcesPrefixs[j])) { isIn = true; break; } } } else { //排他模式 isIn = true; for (int j = 0; j < resourcesPrefixs.Length; j++) { if (pack.Path.StartsWith(resourcesPrefixs[j])) { isIn = false; break; } } } //Lua脚本包排除 if (!string.IsNullOrEmpty(cleanLua)) { if (pack.Path.Equals(cleanLua, StringComparison.OrdinalIgnoreCase)) { isIn = false; } } if (isIn) { baseInfo.Add(pack); } } } byte[] buffer = new byte[1024 * 1024]; int offset = 0; // count MemoryOperator.WriteShort((short)baseInfo.Count, buffer, ref offset); // resources for (int i = 0; i < baseInfo.Count; i++) { baseInfo[i].Write(buffer, ref offset); } //保存 JW.Res.FileUtil.WriteFile(JW.Res.FileUtil.CombinePaths(buildDir, cfgFileName) , buffer, 0, offset); }