/// <summary> /// 安卓解包过程 /// </summary> private IEnumerator StartAndroidUnPack(AssetBundleDownloadTaskModel taskModel, Action onComplete) { string resDicUrl = ABDataConfig.AppAssetBundleDirName; //安卓包资源路径 string targetDicUrl = ABDataConfig.localABFullName; //目标路径 string[] copyFile = new string[] { ABDataConfig.localCacheFileName, ABDataConfig.localDepFileName, }; //先拷贝cache.txt 与dep.file文件 taskModel.taskMessage = "解压配置文件"; yield return(CopyAssetBundle(resDicUrl, targetDicUrl, copyFile)); //解析dep文件 得到所有的ab 名字 var abNames = AssetBundleDepFileManager.ResolveDepFile(targetDicUrl + copyFile[1]); //添加mainfest文件 int count = abNames.Count; for (int i = 0; i < count; ++i) { abNames.Add(abNames[i] + ABDataConfig.assetBundleManifestFilePostfixName); } //在拷贝所有ab文件 taskModel.taskMessage = "解压ab文件"; yield return(CopyAssetBundle(resDicUrl, targetDicUrl, abNames)); DebugManager.Log("解包完成!"); taskModel.taskMessage = "解包完成"; yield return(0); onComplete(); }
/// <summary> /// 解包过程 参数1:任务model 参数2:回调 /// </summary> private void StartUnPack(AssetBundleDownloadTaskModel taskModel, Action onComplete) { taskModel.taskMessage = "检查安装包资源"; var localAbFullName = ABDataConfig.localABFullName; if (!Directory.Exists(localAbFullName)) { taskModel.taskMessage = "开始解包"; Directory.CreateDirectory(localAbFullName); DebugManager.Log(localAbFullName + "文件夹不存在,自动创建!开始解包!"); if (Application.platform == RuntimePlatform.Android) { //安卓环境下必须用www访问StreamingAssets文件夹下的文件 StartCoroutine(StartAndroidUnPack(taskModel, onComplete)); } else { Util.CopyDirectoryToOtherDir(ABDataConfig.AppAssetBundleDirName, localAbFullName); DebugManager.Log("解包完成!"); taskModel.taskMessage = "解包完成"; onComplete(); } } else { DebugManager.Log(localAbFullName + "文件夹存在!不需要解包!"); onComplete(); } }
/// <summary> /// 启动任务下载器 /// </summary> private void StarDownloadTaskManage(AssetBundleDownloadTaskModel task) { if (task == null || downloadTaskMangageState || task.downloadNOModels == null) { return; } if (task.downloadNOModels.Count == 0) { task.taskState = TaskState.TaskOk; task.taskMessage = "下载完成"; downloadSuccessTasks.Add(task); return; } try { task.taskState = TaskState.Tasking;//任务开启中 task.taskMessage = "开始下载资源"; StartCoroutine(DownloadTaskMangage(task)); } catch (Exception e) { task.taskMessage = "下载出错!"; DebugManager.LogError(task + "任务下载出错!" + e.Message); downloadErrorTasks.Enqueue(task); downloadTaskMangageState = false;//出错将下载状态设置为false } }
/// <summary> /// 开始更新ab 返回ab任务model /// </summary> public AssetBundleDownloadTaskModel StarUpdateAssetBundle() { AssetBundleDownloadTaskModel taskModel = new AssetBundleDownloadTaskModel(); //检测是否是第一次安装apk,是就先解包 StartUnPack(taskModel, () => { taskModel.taskMessage = "获取更新资源中"; //获取ab更新资源 AssetBundleCacheFileManager.Instance.GetUpdateDownLoadAssetBundles((waitDownloadAssetBundleList) => { if (waitDownloadAssetBundleList != null) { taskModel.downloadNOModels = waitDownloadAssetBundleList; } taskModel.taskMessage = "需要更新资源数:" + taskModel.downloadNOModels.Count; //将当前任务压入资源下载栈 downloadTasks.Enqueue(taskModel); }); }); return(taskModel); }
/// <summary> /// 任务下载器 /// </summary> private IEnumerator DownloadTaskMangage(AssetBundleDownloadTaskModel task) { downloadTaskMangageState = true;//状态位标志 string downLoadUrl = ABDataConfig.GetAssetBundleUrl + ABDataConfig.getAssetBundleApiName; DebugManager.Log("任务开始下载:" + task.ToString()); AssetBundleDownloadModel tempABModel = null;//中间变量 #region 遍历未下载列表资源,开启下载 for (int i = 0; i < task.downloadNOModels.Count; ++i) { tempABModel = task.downloadNOModels[i]; DownloadModel downModel = new DownloadModel(); //下载资源文件 task.taskMessage = "下载资源" + tempABModel.assetBundleFileName; downModel.postDatas = System.Text.Encoding.UTF8.GetBytes(tempABModel.assetBundleFileName); yield return(DownloadABFile(downLoadUrl, downModel)); tempABModel.assetBundleData = downModel.resultDatas; //下载资源mainfest文件 task.taskMessage = "下载资源" + tempABModel.assetBundleManifestFileName; downModel.postDatas = System.Text.Encoding.UTF8.GetBytes(tempABModel.assetBundleManifestFileName); yield return(DownloadABFile(downLoadUrl, downModel)); tempABModel.assetBundleManifestData = downModel.resultDatas; if (tempABModel != null && tempABModel.assetBundleManifestData != null && tempABModel.assetBundleData != null) { DebugManager.Log("资源:" + tempABModel.assetBundleName + "下载成功!准备写入本地文件!"); //TODO 写入文件 bool result = FileManager.CreateFile(ABDataConfig.localABFullName + tempABModel.assetBundleFileName, tempABModel.assetBundleData); if (result) { result = FileManager.CreateFile(ABDataConfig.localABFullName + tempABModel.assetBundleManifestFileName, tempABModel.assetBundleManifestData); } if (result) { task.downloadOKModels.Add(tempABModel);//添加到成功队列中 } else { DebugManager.Log("资源:" + tempABModel.assetBundleName + "下载成功,写入文件异常!"); task.downloadErrorModels.Add(tempABModel);//添加到失败队列中 } } else { DebugManager.Log("资源:" + tempABModel.assetBundleName + "下载异常!数据错误!"); task.downloadErrorModels.Add(tempABModel);//添加到失败队列中 } task.downloadNOModels.RemoveAt(i--);//移出未下载队列 tempABModel = null; } #endregion //判断任务是否成功或者失败 if (task.downloadErrorModels != null && task.downloadErrorModels.Count > 0) { DebugManager.LogWarning("任务:" + task.ToString() + "下载失败!"); task.taskState = TaskState.TaskError; task.taskMessage = task.downloadErrorModels.Count + "个资源下载失败!重新下载!"; downloadErrorTasks.Enqueue(task); } else { DebugManager.LogWarning("任务:" + task.ToString() + "下载成功!"); task.taskState = TaskState.TaskOk; task.taskMessage = "下载完成"; downloadSuccessTasks.Add(task); } //当前任务下载结束 downloadTaskMangageState = false; }