RawBundleFileLoader.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using System.IO;
  2. namespace YooAsset
  3. {
  4. internal class RawBundleFileLoader : BundleLoaderBase
  5. {
  6. private enum ESteps
  7. {
  8. None,
  9. Download,
  10. CheckDownload,
  11. Unpack,
  12. CheckUnpack,
  13. CheckFile,
  14. Done,
  15. }
  16. private ESteps _steps = ESteps.None;
  17. private DownloaderBase _unpacker;
  18. private DownloaderBase _downloader;
  19. public RawBundleFileLoader(AssetSystemImpl impl, BundleInfo bundleInfo) : base(impl, bundleInfo)
  20. {
  21. }
  22. /// <summary>
  23. /// 轮询更新
  24. /// </summary>
  25. public override void Update()
  26. {
  27. if (_steps == ESteps.Done)
  28. return;
  29. if (_steps == ESteps.None)
  30. {
  31. if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromRemote)
  32. {
  33. _steps = ESteps.Download;
  34. FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
  35. }
  36. else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromStreaming)
  37. {
  38. #if UNITY_ANDROID
  39. _steps = ESteps.Unpack;
  40. FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
  41. #else
  42. _steps = ESteps.CheckFile;
  43. FileLoadPath = MainBundleInfo.Bundle.StreamingFilePath;
  44. #endif
  45. }
  46. else if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
  47. {
  48. _steps = ESteps.CheckFile;
  49. FileLoadPath = MainBundleInfo.Bundle.CachedDataFilePath;
  50. }
  51. else
  52. {
  53. throw new System.NotImplementedException(MainBundleInfo.LoadMode.ToString());
  54. }
  55. }
  56. // 1. 下载远端文件
  57. if (_steps == ESteps.Download)
  58. {
  59. int failedTryAgain = Impl.DownloadFailedTryAgain;
  60. _downloader = DownloadSystem.BeginDownload(MainBundleInfo, failedTryAgain);
  61. _steps = ESteps.CheckDownload;
  62. }
  63. // 2. 检测下载结果
  64. if (_steps == ESteps.CheckDownload)
  65. {
  66. DownloadProgress = _downloader.DownloadProgress;
  67. DownloadedBytes = _downloader.DownloadedBytes;
  68. if (_downloader.IsDone() == false)
  69. return;
  70. if (_downloader.HasError())
  71. {
  72. _steps = ESteps.Done;
  73. Status = EStatus.Failed;
  74. LastError = _downloader.GetLastError();
  75. }
  76. else
  77. {
  78. _steps = ESteps.CheckFile;
  79. }
  80. }
  81. // 3. 解压内置文件
  82. if (_steps == ESteps.Unpack)
  83. {
  84. int failedTryAgain = Impl.DownloadFailedTryAgain;
  85. var bundleInfo = ManifestTools.ConvertToUnpackInfo(MainBundleInfo.Bundle);
  86. _unpacker = DownloadSystem.BeginDownload(bundleInfo, failedTryAgain);
  87. _steps = ESteps.CheckUnpack;
  88. }
  89. // 4. 检测解压结果
  90. if (_steps == ESteps.CheckUnpack)
  91. {
  92. DownloadProgress = _unpacker.DownloadProgress;
  93. DownloadedBytes = _unpacker.DownloadedBytes;
  94. if (_unpacker.IsDone() == false)
  95. return;
  96. if (_unpacker.HasError())
  97. {
  98. _steps = ESteps.Done;
  99. Status = EStatus.Failed;
  100. LastError = _unpacker.GetLastError();
  101. }
  102. else
  103. {
  104. _steps = ESteps.CheckFile;
  105. }
  106. }
  107. // 5. 检测结果
  108. if (_steps == ESteps.CheckFile)
  109. {
  110. // 设置下载进度
  111. DownloadProgress = 1f;
  112. DownloadedBytes = (ulong)MainBundleInfo.Bundle.FileSize;
  113. if (File.Exists(FileLoadPath))
  114. {
  115. _steps = ESteps.Done;
  116. Status = EStatus.Succeed;
  117. }
  118. else
  119. {
  120. _steps = ESteps.Done;
  121. Status = EStatus.Failed;
  122. LastError = $"Raw file not found : {FileLoadPath}";
  123. }
  124. }
  125. }
  126. /// <summary>
  127. /// 主线程等待异步操作完毕
  128. /// </summary>
  129. public override void WaitForAsyncComplete()
  130. {
  131. int frame = 1000;
  132. while (true)
  133. {
  134. // 文件解压
  135. if (_unpacker != null)
  136. {
  137. if (_unpacker.IsDone() == false)
  138. {
  139. _unpacker.WaitForAsyncComplete = true;
  140. _unpacker.Update();
  141. continue;
  142. }
  143. }
  144. // 保险机制
  145. // 注意:如果需要从远端下载资源,可能会触发保险机制!
  146. frame--;
  147. if (frame == 0)
  148. {
  149. if (IsDone() == false)
  150. {
  151. Status = EStatus.Failed;
  152. LastError = $"WaitForAsyncComplete failed ! Try load bundle : {MainBundleInfo.Bundle.BundleName} from remote with sync load method !";
  153. YooLogger.Error(LastError);
  154. }
  155. break;
  156. }
  157. // 驱动流程
  158. Update();
  159. // 完成后退出
  160. if (IsDone())
  161. break;
  162. }
  163. }
  164. }
  165. }