Files
TuanTuan-Engine/Assets/GameFramework/Runtime/PatchLogic/MainOperation.cs
2025-11-03 12:03:21 +08:00

148 lines
6.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<bool>();
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<bool> 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}");
}
}