FileGeneralRequest.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System.IO;
  2. using UnityEngine.Networking;
  3. namespace YooAsset
  4. {
  5. internal class FileGeneralRequest : IWebRequester
  6. {
  7. private UnityWebRequest _webRequest;
  8. public ERequestStatus Status { private set; get; } = ERequestStatus.None;
  9. public float DownloadProgress { private set; get; }
  10. public ulong DownloadedBytes { private set; get; }
  11. public string RequestNetError { private set; get; }
  12. public long RequestHttpCode { private set; get; }
  13. public FileGeneralRequest() { }
  14. public void Create(string requestURL, BundleInfo bundleInfo, params object[] args)
  15. {
  16. if (Status != ERequestStatus.None)
  17. throw new System.Exception("Should never get here !");
  18. string tempFilePath = bundleInfo.TempDataFilePath;
  19. // 删除临时文件
  20. if (File.Exists(tempFilePath))
  21. File.Delete(tempFilePath);
  22. // 创建下载器
  23. _webRequest = DownloadHelper.NewRequest(requestURL);
  24. DownloadHandlerFile handler = new DownloadHandlerFile(tempFilePath);
  25. handler.removeFileOnAbort = true;
  26. _webRequest.downloadHandler = handler;
  27. _webRequest.disposeDownloadHandlerOnDispose = true;
  28. _webRequest.SendWebRequest();
  29. Status = ERequestStatus.InProgress;
  30. }
  31. public void Update()
  32. {
  33. if (Status == ERequestStatus.None)
  34. return;
  35. if (IsDone())
  36. return;
  37. DownloadProgress = _webRequest.downloadProgress;
  38. DownloadedBytes = _webRequest.downloadedBytes;
  39. if (_webRequest.isDone == false)
  40. return;
  41. // 检查网络错误
  42. #if UNITY_2020_3_OR_NEWER
  43. RequestHttpCode = _webRequest.responseCode;
  44. if (_webRequest.result != UnityWebRequest.Result.Success)
  45. {
  46. RequestNetError = _webRequest.error;
  47. Status = ERequestStatus.Error;
  48. }
  49. else
  50. {
  51. Status = ERequestStatus.Success;
  52. }
  53. #else
  54. RequestHttpCode = _webRequest.responseCode;
  55. if (_webRequest.isNetworkError || _webRequest.isHttpError)
  56. {
  57. RequestNetError = _webRequest.error;
  58. Status = ERequestStatus.Error;
  59. }
  60. else
  61. {
  62. Status = ERequestStatus.Success;
  63. }
  64. #endif
  65. // 最终释放下载器
  66. DisposeWebRequest();
  67. }
  68. public void Abort()
  69. {
  70. DisposeWebRequest();
  71. if (IsDone() == false)
  72. {
  73. RequestNetError = "user abort";
  74. RequestHttpCode = 0;
  75. Status = ERequestStatus.Error;
  76. }
  77. }
  78. public bool IsDone()
  79. {
  80. if (Status == ERequestStatus.Success || Status == ERequestStatus.Error)
  81. return true;
  82. else
  83. return false;
  84. }
  85. public object GetRequestObject()
  86. {
  87. throw new System.NotImplementedException();
  88. }
  89. private void DisposeWebRequest()
  90. {
  91. if (_webRequest != null)
  92. {
  93. _webRequest.Dispose(); //注意:引擎底层会自动调用Abort方法
  94. _webRequest = null;
  95. }
  96. }
  97. }
  98. }