using Cysharp.Threading.Tasks; using System; using UnityEngine; using YooAsset; public class MainOperation { PatchOperationData data; PatchOperation operation; bool autoDownload; public MainOperation(EPlayMode playMode, bool autoDownload = false) { data = new PatchOperationData(); data.packageName = "Main"; data.playMode = playMode; data.useBuildinFileSystem = false; data.downloadingMaxNum = 10; data.failedTryAgain = 3; data.downloadUpdate = OnDownloadUpdate; data.downloadFinish = OnDownloadFinish; data.downloadError = OnDownloadError; operation = new PatchOperation(data); this.autoDownload = autoDownload; } public async UniTask Execute() { PatchEvent.UpdateProgress(0f); InitializationOperation initializationOperation = await operation.InitializePackage(); //初始化失败 if (initializationOperation.Status != EOperationStatus.Succeed) { MessageBox.Show() .SetTitle(operation.data.packageName) .SetContent($"{initializationOperation.Error}") .AddButton("退出", (box) => { Application.Quit(); }); return; } PatchEvent.UpdateStatus($"初始化成功{operation.data.packageName}"); Debug.Log($"初始化成功{operation.data.packageName}"); var PackageVersionOperation = await operation.RequestPackageVersion(); if (PackageVersionOperation.Status != EOperationStatus.Succeed) { MessageBox.Show() .SetTitle(operation.data.packageName) .SetContent($"{PackageVersionOperation.Error}") .AddButton("退出", (box) => { Application.Quit(); }); return; } operation.packageVersion = PackageVersionOperation.PackageVersion; PatchEvent.UpdateStatus($"获取版本成功{operation.data.packageName}"); Debug.Log($"获取版本成功{operation.data.packageName}:{operation.packageVersion}"); var PackageManifestOperation = await operation.UpdatePackageManifest(); if (PackageManifestOperation.Status != EOperationStatus.Succeed) { MessageBox.Show() .SetTitle(operation.data.packageName) .SetContent($"{PackageManifestOperation.Error}") .AddButton("退出", (box) => { Application.Quit(); }); return; } var DownloaderOperation = operation.CreateDownloader(); if (DownloaderOperation.TotalDownloadCount == 0) { operation.SaveVersionToCache(); PatchEvent.UpdateStatus($"更新完成{operation.data.packageName}"); Debug.Log($"更新{operation.data.packageName}完成,版本号{operation.packageVersion}"); return; } else { if (autoDownload) { if (!await Download(DownloaderOperation)) return; } else { var completionSource = new UniTaskCompletionSource(); MessageBox.Show() .SetTitle(operation.data.packageName) .SetContent($"发现资源更新\n{operation.GetCachedPackageVersion()}=>{operation.packageVersion}: {DownloaderOperation.TotalDownloadBytes / 1024f / 1024f:F1}MB") .AddButton("下载", async (box) => { bool success = await Download(DownloaderOperation); completionSource.TrySetResult(success); }) .AddButton("跳过", (box) => { DownloaderOperation.CancelDownload(); completionSource.TrySetResult(true); }) .AddButton("退出", (box) => { completionSource.TrySetResult(false); Application.Quit(); }); bool shouldContinue = await completionSource.Task; if (!shouldContinue) return; } var ClearCacheFilesOperation = await operation.ClearCacheBundle(); if (ClearCacheFilesOperation.Status != EOperationStatus.Succeed) { MessageBox.Show() .SetTitle(operation.data.packageName) .SetContent($"{ClearCacheFilesOperation.Error}") .AddButton("退出", (box) => { Application.Quit(); }); return; } operation.SaveVersionToCache(); PatchEvent.UpdateStatus($"更新完成{operation.data.packageName}"); Debug.Log($"更新{operation.data.packageName}完成,版本号{operation.packageVersion}"); } } public async UniTask Download(DownloaderOperation downloaderOperation) { if (!await operation.DownloadPackageFiles()) { MessageBox.Show() .SetTitle(operation.data.packageName) .SetContent($"{downloaderOperation.Error}") .AddButton("退出", (box) => { Application.Quit(); }); return false; } return true; } private void OnDownloadUpdate(DownloadUpdateData downloadUpdateData) { float progress = (float)downloadUpdateData.CurrentDownloadBytes / downloadUpdateData.TotalDownloadBytes; string sizeText = $"{(downloadUpdateData.CurrentDownloadBytes / 1024f / 1024f):F1}MB / {(downloadUpdateData.TotalDownloadBytes / 1024f / 1024f):F1}MB"; PatchEvent.UpdateProgress(progress); PatchEvent.UpdateDownloadSize(sizeText); PatchEvent.UpdateStatus($"{data.packageName} 资源下载中..."); } private void OnDownloadFinish(DownloaderFinishData downloaderFinishData) { PatchEvent.UpdateStatus("下载完成"); } private void OnDownloadError(DownloadErrorData downloadErrorData) { PatchEvent.UpdateStatus($"下载失败:{downloadErrorData.FileName}\n{downloadErrorData.ErrorInfo}"); } }