PatchUpdater.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Cysharp.Threading.Tasks;
  5. using UnityEngine;
  6. using YooAsset;
  7. using ET;
  8. public static class PatchUpdater
  9. {
  10. private static bool _isRun = false;
  11. private static int _retryCnt = 0;
  12. /// <summary>
  13. /// 下载器
  14. /// </summary>
  15. public static PatchDownloaderOperation Downloader { set; get; }
  16. /// <summary>
  17. /// 资源版本
  18. /// </summary>
  19. public static int ResourceVersion { set; get; }
  20. private static readonly EventGroup _eventGroup = new EventGroup();
  21. public static Action<PatchEventMessageDefine.PatchStatesChange> OnStateUpdate;
  22. public static Action<PatchEventMessageDefine.DownloadProgressUpdate> OnDownLoadProgressUpdate;
  23. private static UniTaskCompletionSource s_UniTaskCompletionSource;
  24. public static void InitCallback(Action<PatchEventMessageDefine.PatchStatesChange> onStateUpdate,
  25. Action<PatchEventMessageDefine.DownloadProgressUpdate> onDownLoadProgressUpdate)
  26. {
  27. OnStateUpdate += onStateUpdate;
  28. OnDownLoadProgressUpdate += onDownLoadProgressUpdate;
  29. }
  30. /// <summary>
  31. /// 开启初始化流程
  32. /// </summary>
  33. public static void Run(UniTaskCompletionSource uniTaskCompletionSource)
  34. {
  35. s_UniTaskCompletionSource = uniTaskCompletionSource;
  36. if (_isRun == false)
  37. {
  38. _isRun = true;
  39. _eventGroup.AddListener<PatchEventMessageDefine.PatchStatesChange>(OnHandleEvent);
  40. _eventGroup.AddListener<PatchEventMessageDefine.FoundUpdateFiles>(OnHandleEvent);
  41. _eventGroup.AddListener<PatchEventMessageDefine.DownloadProgressUpdate>(OnHandleEvent);
  42. _eventGroup.AddListener<PatchEventMessageDefine.StaticVersionUpdateFailed>(OnHandleEvent);
  43. _eventGroup.AddListener<PatchEventMessageDefine.PatchManifestUpdateFailed>(OnHandleEvent);
  44. _eventGroup.AddListener<PatchEventMessageDefine.WebFileDownloadFailed>(OnHandleEvent);
  45. // 注意:按照先后顺序添加流程节点
  46. FsmManager.AddNode(new FsmPatchInit());
  47. FsmManager.AddNode(new FsmUpdateStaticVersion());
  48. FsmManager.AddNode(new FsmUpdateManifest());
  49. FsmManager.AddNode(new FsmCreateDownloader());
  50. FsmManager.AddNode(new FsmDownloadWebFiles());
  51. FsmManager.AddNode(new FsmPatchDone());
  52. FsmManager.Run(nameof(FsmPatchInit));
  53. }
  54. else
  55. {
  56. Debug.LogWarning("补丁更新已经正在进行中!");
  57. }
  58. }
  59. /// <summary>
  60. /// 处理请求操作
  61. /// </summary>
  62. private static void HandleOperation(EPatchOperation operation)
  63. {
  64. if (operation == EPatchOperation.BeginDownloadWebFiles)
  65. {
  66. FsmManager.Transition(nameof(FsmDownloadWebFiles));
  67. }
  68. else if (operation == EPatchOperation.TryUpdateStaticVersion)
  69. {
  70. FsmManager.Transition(nameof(FsmUpdateStaticVersion));
  71. }
  72. else if (operation == EPatchOperation.TryUpdatePatchManifest)
  73. {
  74. FsmManager.Transition(nameof(FsmUpdateManifest));
  75. }
  76. else if (operation == EPatchOperation.TryDownloadWebFiles)
  77. {
  78. FsmManager.Transition(nameof(FsmCreateDownloader));
  79. }
  80. else
  81. {
  82. throw new NotImplementedException($"{operation}");
  83. }
  84. }
  85. /// <summary>
  86. /// 接收事件
  87. /// </summary>
  88. private static void OnHandleEvent(IEventMessage msg)
  89. {
  90. if (msg is PatchEventMessageDefine.PatchStatesChange patchStatesChange)
  91. {
  92. if (patchStatesChange.CurrentStates == EPatchStates.UpdateStaticVersion)
  93. Log.Info("Update static version.");
  94. else if (patchStatesChange.CurrentStates == EPatchStates.UpdateManifest)
  95. Log.Info("Update patch manifest.");
  96. else if (patchStatesChange.CurrentStates == EPatchStates.CreateDownloader)
  97. Log.Info("Check download contents.");
  98. else if (patchStatesChange.CurrentStates == EPatchStates.DownloadWebFiles)
  99. Log.Info("Downloading patch files.");
  100. else if (patchStatesChange.CurrentStates == EPatchStates.PatchDone)
  101. {
  102. s_UniTaskCompletionSource?.TrySetResult();
  103. Log.Info("PatchDone. ");
  104. }
  105. else
  106. throw new NotImplementedException(patchStatesChange.CurrentStates.ToString());
  107. OnStateUpdate?.Invoke(patchStatesChange);
  108. }
  109. else if (msg is PatchEventMessageDefine.FoundUpdateFiles)
  110. {
  111. var message = msg as PatchEventMessageDefine.FoundUpdateFiles;
  112. float sizeMB = message.TotalSizeBytes / 1048576f;
  113. sizeMB = Mathf.Clamp(sizeMB, 0.1f, float.MaxValue);
  114. string totalSizeMB = sizeMB.ToString("f1");
  115. ET.Log.Info($"Found update patch files, Total count {message.TotalCount} Total szie {totalSizeMB}MB");
  116. PatchUpdater.HandleOperation(EPatchOperation.BeginDownloadWebFiles);
  117. }
  118. else if (msg is PatchEventMessageDefine.DownloadProgressUpdate downloadProgressUpdate)
  119. {
  120. OnDownLoadProgressUpdate?.Invoke(downloadProgressUpdate);
  121. }
  122. else if (msg is PatchEventMessageDefine.StaticVersionUpdateFailed)
  123. {
  124. ET.Log.Error($"Failed to update static version, please check the network status.");
  125. ErrorRetry(EPatchOperation.TryUpdateStaticVersion);
  126. }
  127. else if (msg is PatchEventMessageDefine.PatchManifestUpdateFailed)
  128. {
  129. ET.Log.Error($"Failed to update patch manifest, please check the network status.");
  130. ErrorRetry(EPatchOperation.TryUpdatePatchManifest);
  131. }
  132. else if (msg is PatchEventMessageDefine.WebFileDownloadFailed)
  133. {
  134. var message = msg as PatchEventMessageDefine.WebFileDownloadFailed;
  135. ET.Log.Error($"Failed to download file : {message.FileName}");
  136. ErrorRetry(EPatchOperation.TryDownloadWebFiles);
  137. }
  138. else
  139. {
  140. throw new System.NotImplementedException($"{msg.GetType()}");
  141. }
  142. }
  143. private static void ErrorRetry(EPatchOperation operation)
  144. {
  145. if (++_retryCnt >= 2)
  146. {
  147. Log.Warning($"Retry {_retryCnt} times, Abort.");
  148. s_UniTaskCompletionSource?.TrySetResult();
  149. }
  150. else
  151. {
  152. PatchUpdater.HandleOperation(operation);
  153. }
  154. }
  155. }