using AlicizaX.Resource.Runtime; using AlicizaX; using AlicizaX.Framework.Runtime.Event.Generated; using Cysharp.Threading.Tasks; using UnityEngine; using YooAsset; namespace Unity.Startup.Procedure { internal sealed class ProcedureDownloadBundleState : StateBase { ResourceDownloaderOperation downloader; protected override void OnEnter() { CreateDownloader(); } protected override void OnExit() { downloader.CancelDownload(); downloader = null; } private void CreateDownloader() { downloader = ModuleSystem.GetModule().CreateResourceDownloader(); if (downloader.TotalDownloadCount == 0) { Log.Info("没有发现需要下载的资源"); SwitchState(UpdateProcedureState.ProcedurePatchDoneState); } else { // 发现新更新文件后,挂起流程系统 int totalDownloadCount = downloader.TotalDownloadCount; long totalDownloadBytes = downloader.TotalDownloadBytes; float sizeMb = totalDownloadBytes / 1048576f; sizeMb = Mathf.Clamp(sizeMb, 0.1f, float.MaxValue); string totalSizeMb = sizeMb.ToString("f1"); Log.Info($"一共发现了{downloader.TotalDownloadCount}个资源需要更新下载,总共需要下载文件大小为:{totalSizeMb}!"); DownloadFiles().Forget(); } } private async UniTask DownloadFiles() { // 注册下载回调 void DownloaderOnDownloadErrorCallback(DownloadErrorData data) { Log.Error($"PackagegName:{data.PackageName} FileName:{data.FileName} Error:{data.ErrorInfo}"); CreateDownloader(); } downloader.DownloadErrorCallback = DownloaderOnDownloadErrorCallback; downloader.DownloadUpdateCallback = OnDownloadProgressCallback; downloader.BeginDownload(); await downloader; // 检测下载结果 if (downloader.Status != EOperationStatus.Succeed) { Log.Error("资源更新失败!"); return; } SwitchState(UpdateProcedureState.ProcedurePatchDoneState); } private void OnDownloadProgressCallback(DownloadUpdateData data) { EventPublisher.Publish(AssetDownloadProgressUpdateEventArgs.Create(data.PackageName, data.TotalDownloadCount, data.CurrentDownloadCount, data.TotalDownloadBytes, data.CurrentDownloadBytes)); } } }