PatchUpdater.cs 6.6 KB

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