WebDownloader.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using UnityEngine;
  6. namespace YooAsset
  7. {
  8. internal sealed class WebDownloader : DownloaderBase
  9. {
  10. private enum ESteps
  11. {
  12. None,
  13. PrepareDownload,
  14. CreateDownloader,
  15. CheckDownload,
  16. TryAgain,
  17. Done,
  18. }
  19. private ESteps _steps = ESteps.None;
  20. private bool _getAssetBundle = false;
  21. public WebDownloader(BundleInfo bundleInfo, System.Type requesterType, int failedTryAgain, int timeout) : base(bundleInfo, requesterType, failedTryAgain, timeout)
  22. {
  23. }
  24. public override void SendRequest(params object[] args)
  25. {
  26. if (_steps == ESteps.None)
  27. {
  28. if (args.Length > 0)
  29. {
  30. _getAssetBundle = (bool)args[0];
  31. }
  32. _steps = ESteps.PrepareDownload;
  33. }
  34. }
  35. public override void Update()
  36. {
  37. if (_steps == ESteps.None)
  38. return;
  39. if (IsDone())
  40. return;
  41. // 创建下载器
  42. if (_steps == ESteps.PrepareDownload)
  43. {
  44. // 获取请求地址
  45. _requestURL = GetRequestURL();
  46. // 重置变量
  47. DownloadProgress = 0f;
  48. DownloadedBytes = 0;
  49. // 重置变量
  50. _isAbort = false;
  51. _latestDownloadBytes = 0;
  52. _latestDownloadRealtime = Time.realtimeSinceStartup;
  53. // 重置计时器
  54. if (_tryAgainTimer > 0f)
  55. YooLogger.Warning($"Try again download : {_requestURL}");
  56. _tryAgainTimer = 0f;
  57. _steps = ESteps.CreateDownloader;
  58. }
  59. // 创建下载器
  60. if (_steps == ESteps.CreateDownloader)
  61. {
  62. _requester = (IWebRequester)Activator.CreateInstance(_requesterType);
  63. _requester.Create(_requestURL, _bundleInfo, _getAssetBundle);
  64. _steps = ESteps.CheckDownload;
  65. }
  66. // 检测下载结果
  67. if (_steps == ESteps.CheckDownload)
  68. {
  69. _requester.Update();
  70. DownloadedBytes = _requester.DownloadedBytes;
  71. DownloadProgress = _requester.DownloadProgress;
  72. if (_requester.IsDone() == false)
  73. {
  74. CheckTimeout();
  75. return;
  76. }
  77. _lastestNetError = _requester.RequestNetError;
  78. _lastestHttpCode = _requester.RequestHttpCode;
  79. if (_requester.Status != ERequestStatus.Success)
  80. {
  81. _steps = ESteps.TryAgain;
  82. }
  83. else
  84. {
  85. _status = EStatus.Succeed;
  86. _steps = ESteps.Done;
  87. }
  88. }
  89. // 重新尝试下载
  90. if (_steps == ESteps.TryAgain)
  91. {
  92. if (_failedTryAgain <= 0)
  93. {
  94. ReportError();
  95. _status = EStatus.Failed;
  96. _steps = ESteps.Done;
  97. return;
  98. }
  99. _tryAgainTimer += Time.unscaledDeltaTime;
  100. if (_tryAgainTimer > 1f)
  101. {
  102. _failedTryAgain--;
  103. _steps = ESteps.PrepareDownload;
  104. ReportWarning();
  105. YooLogger.Warning($"Try again download : {_requestURL}");
  106. }
  107. }
  108. }
  109. public override void Abort()
  110. {
  111. if (_requester != null)
  112. _requester.Abort();
  113. if (IsDone() == false)
  114. {
  115. _status = EStatus.Failed;
  116. _steps = ESteps.Done;
  117. _lastestNetError = "user abort";
  118. _lastestHttpCode = 0;
  119. }
  120. }
  121. public override AssetBundle GetAssetBundle()
  122. {
  123. return (AssetBundle)_requester.GetRequestObject();
  124. }
  125. }
  126. }