using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.Assertions; using YooAsset; namespace Stary.Evo { public class ResUpdateLocalState : AbstractFSMIState { public ResUpdateLocalState(IFsmSystem system) : base(system) { } public override async UniTask OnEnterAsync() { //初始化读取资源配置表 var package = YooAssets.GetPackage(AppConfig.PackageDomainName); //更新失败 Debug.Log($"UnityEvo:切换为加载本地缓存资源..."); string packageVersion = ""; if (package.PackageName.Equals("Main")) { var operation = package.RequestPackageVersionAsync(); await operation; if (operation.Status == EOperationStatus.Succeed) { //更新成功 packageVersion = operation.PackageVersion; Debug.Log($"Unity:【Main】Request package Version : {packageVersion}"); } else { //更新失败 Debug.LogError("Unity:【Main】" + operation.Error); } } else { // 获取上次成功记录的版本 packageVersion = PlayerPrefs.GetString($"{AppConfig.PackageDomainName}_GAME_VERSION", string.Empty); if (string.IsNullOrEmpty(packageVersion)) { Debug.Log($"UnityEvo:没有找到本地版本记录,需要更新资源!"); return; } } Debug.Log($"UnityEvo:获取资源版本 Version : 【{packageVersion}】"); Debug.Log($"UnityEvo:开始加载本地资源..."); // Assert.AreEqual(EOperationStatus.Succeed, requetVersionOp.Status); // 加载本地缓存的资源清单文件 var updateManifestOp = package.UpdatePackageManifestAsync(packageVersion); await updateManifestOp; if (updateManifestOp.Status == EOperationStatus.Succeed) { //更新成功 Debug.Log($"UnityEvo:更新本地资源清单 updateManifest : 【成功】"); } else { //更新失败 Debug.LogError($"UnityEvo:加载本地资源清单文件失败,需要更新资源!: 【{updateManifestOp.Error}】"); return; } Assert.AreEqual(EOperationStatus.Succeed, updateManifestOp.Status); //4.下载补丁包 await Download(); //加载热更配置文件 var loadHotfixSettingsOp = package.LoadAssetAsync("Config_DomainConfig"); await loadHotfixSettingsOp; DomainConfig domainConfig = null; if (loadHotfixSettingsOp.Status == EOperationStatus.Succeed) { //更新成功 Debug.Log($"UnityEvo:加载热更配置文件 DomainConfig : 【成功】"); domainConfig = loadHotfixSettingsOp.AssetObject as DomainConfig; } else { Debug.LogError($"UnityEvo:加载热更配置文件 DomainConfig : 【失败】"); } if (domainConfig == null) { Debug.LogError($"UnityEvo:【{package.PackageName}】加载DomainConfig为空,无法继续执行后续流程,请检查!!!"); } FsmSystem.SetCurState(nameof(HotFixState), domainConfig); } public override UniTask OnEnterAsync(T param) { return UniTask.CompletedTask; } public override UniTask OnEnterAsync(T1 param1, T2 param2) { return UniTask.CompletedTask; } public override void OnUpdate() { base.OnUpdate(); } public override UniTask OnExitAsync() { return UniTask.CompletedTask; } #region 下载热更资源 public async UniTask Download() { int downloadingMaxNum = 1; int failedTryAgain = 1; var package = YooAssets.GetPackage(AppConfig.PackageDomainName); var downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain); // 在正常开始游戏之前,还需要验证本地清单内容的完整性。 if (downloader.TotalDownloadCount > 0) { Debug.Log("UnityEvo:资源内容本地并不完整,需要更新资源!"); return; } } #endregion } }