DownloadWebEncryptAssetBundleOperation.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. using UnityEngine;
  2. using UnityEngine.Networking;
  3. namespace YooAsset
  4. {
  5. internal class DownloadWebEncryptAssetBundleOperation : DownloadAssetBundleOperation
  6. {
  7. private readonly bool _checkTimeout;
  8. private readonly IWebDecryptionServices _decryptionServices;
  9. private DownloadHandlerBuffer _downloadhandler;
  10. private ESteps _steps = ESteps.None;
  11. internal DownloadWebEncryptAssetBundleOperation(bool checkTimeout, IWebDecryptionServices decryptionServices, PackageBundle bundle, DownloadParam param) : base(bundle, param)
  12. {
  13. _checkTimeout = checkTimeout;
  14. _decryptionServices = decryptionServices;
  15. }
  16. internal override void InternalStart()
  17. {
  18. _steps = ESteps.CreateRequest;
  19. }
  20. internal override void InternalUpdate()
  21. {
  22. if (_steps == ESteps.None || _steps == ESteps.Done)
  23. return;
  24. // 创建下载器
  25. if (_steps == ESteps.CreateRequest)
  26. {
  27. // 获取请求地址
  28. _requestURL = GetRequestURL();
  29. // 重置变量
  30. ResetRequestFiled();
  31. // 创建下载器
  32. CreateWebRequest();
  33. _steps = ESteps.CheckRequest;
  34. }
  35. // 检测下载结果
  36. if (_steps == ESteps.CheckRequest)
  37. {
  38. DownloadProgress = _webRequest.downloadProgress;
  39. DownloadedBytes = (long)_webRequest.downloadedBytes;
  40. Progress = DownloadProgress;
  41. if (_webRequest.isDone == false)
  42. {
  43. if (_checkTimeout)
  44. CheckRequestTimeout();
  45. return;
  46. }
  47. // 检查网络错误
  48. if (CheckRequestResult())
  49. {
  50. if (_decryptionServices == null)
  51. {
  52. _steps = ESteps.Done;
  53. Status = EOperationStatus.Failed;
  54. Error = $"The {nameof(IWebDecryptionServices)} is null !";
  55. YooLogger.Error(Error);
  56. return;
  57. }
  58. var fileData = _downloadhandler.data;
  59. if (fileData == null || fileData.Length == 0)
  60. {
  61. _steps = ESteps.Done;
  62. Status = EOperationStatus.Failed;
  63. Error = $"The download handler data is null or empty !";
  64. YooLogger.Error(Error);
  65. return;
  66. }
  67. AssetBundle assetBundle = LoadEncryptedAssetBundle(fileData);
  68. if (assetBundle == null)
  69. {
  70. _steps = ESteps.Done;
  71. Status = EOperationStatus.Failed;
  72. Error = "Download handler asset bundle object is null !";
  73. }
  74. else
  75. {
  76. _steps = ESteps.Done;
  77. Result = assetBundle;
  78. Status = EOperationStatus.Succeed;
  79. }
  80. }
  81. else
  82. {
  83. _steps = ESteps.TryAgain;
  84. }
  85. // 注意:最终释放请求器
  86. DisposeWebRequest();
  87. }
  88. // 重新尝试下载
  89. if (_steps == ESteps.TryAgain)
  90. {
  91. if (FailedTryAgain <= 0)
  92. {
  93. Status = EOperationStatus.Failed;
  94. _steps = ESteps.Done;
  95. YooLogger.Error(Error);
  96. return;
  97. }
  98. _tryAgainTimer += Time.unscaledDeltaTime;
  99. if (_tryAgainTimer > 1f)
  100. {
  101. FailedTryAgain--;
  102. _steps = ESteps.CreateRequest;
  103. YooLogger.Warning(Error);
  104. }
  105. }
  106. }
  107. internal override void InternalAbort()
  108. {
  109. _steps = ESteps.Done;
  110. DisposeWebRequest();
  111. }
  112. private void CreateWebRequest()
  113. {
  114. _downloadhandler = new DownloadHandlerBuffer();
  115. _webRequest = DownloadSystemHelper.NewUnityWebRequestGet(_requestURL);
  116. _webRequest.downloadHandler = _downloadhandler;
  117. _webRequest.disposeDownloadHandlerOnDispose = true;
  118. _webRequest.SendWebRequest();
  119. }
  120. private void DisposeWebRequest()
  121. {
  122. if (_webRequest != null)
  123. {
  124. //注意:引擎底层会自动调用Abort方法
  125. _webRequest.Dispose();
  126. _webRequest = null;
  127. }
  128. }
  129. /// <summary>
  130. /// 加载加密资源文件
  131. /// </summary>
  132. private AssetBundle LoadEncryptedAssetBundle(byte[] fileData)
  133. {
  134. var fileInfo = new WebDecryptFileInfo();
  135. fileInfo.BundleName = Bundle.BundleName;
  136. fileInfo.FileLoadCRC = Bundle.UnityCRC;
  137. fileInfo.FileData = fileData;
  138. var decryptResult = _decryptionServices.LoadAssetBundle(fileInfo);
  139. return decryptResult.Result;
  140. }
  141. }
  142. }