OfflinePlayModeImpl.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. namespace YooAsset
  5. {
  6. internal class OfflinePlayModeImpl : IPlayMode, IBundleQuery
  7. {
  8. private PackageManifest _activeManifest;
  9. private ResourceAssist _assist;
  10. public readonly string PackageName;
  11. public DownloadManager Download
  12. {
  13. get { return _assist.Download; }
  14. }
  15. public PersistentManager Persistent
  16. {
  17. get { return _assist.Persistent; }
  18. }
  19. public CacheManager Cache
  20. {
  21. get { return _assist.Cache; }
  22. }
  23. public OfflinePlayModeImpl(string packageName)
  24. {
  25. PackageName = packageName;
  26. }
  27. /// <summary>
  28. /// 异步初始化
  29. /// </summary>
  30. public InitializationOperation InitializeAsync(ResourceAssist assist)
  31. {
  32. _assist = assist;
  33. var operation = new OfflinePlayModeInitializationOperation(this);
  34. OperationSystem.StartOperation(PackageName, operation);
  35. return operation;
  36. }
  37. // 查询相关
  38. private bool IsCachedPackageBundle(PackageBundle packageBundle)
  39. {
  40. return _assist.Cache.IsCached(packageBundle.CacheGUID);
  41. }
  42. #region IPlayMode接口
  43. public PackageManifest ActiveManifest
  44. {
  45. set
  46. {
  47. _activeManifest = value;
  48. }
  49. get
  50. {
  51. return _activeManifest;
  52. }
  53. }
  54. public void FlushManifestVersionFile()
  55. {
  56. }
  57. UpdatePackageVersionOperation IPlayMode.UpdatePackageVersionAsync(bool appendTimeTicks, int timeout)
  58. {
  59. var operation = new OfflinePlayModeUpdatePackageVersionOperation();
  60. OperationSystem.StartOperation(PackageName, operation);
  61. return operation;
  62. }
  63. UpdatePackageManifestOperation IPlayMode.UpdatePackageManifestAsync(string packageVersion, bool autoSaveVersion, int timeout)
  64. {
  65. var operation = new OfflinePlayModeUpdatePackageManifestOperation();
  66. OperationSystem.StartOperation(PackageName, operation);
  67. return operation;
  68. }
  69. PreDownloadContentOperation IPlayMode.PreDownloadContentAsync(string packageVersion, int timeout)
  70. {
  71. var operation = new OfflinePlayModePreDownloadContentOperation(this);
  72. OperationSystem.StartOperation(PackageName, operation);
  73. return operation;
  74. }
  75. ResourceDownloaderOperation IPlayMode.CreateResourceDownloaderByAll(int downloadingMaxNumber, int failedTryAgain, int timeout)
  76. {
  77. return ResourceDownloaderOperation.CreateEmptyDownloader(Download, PackageName, downloadingMaxNumber, failedTryAgain, timeout);
  78. }
  79. ResourceDownloaderOperation IPlayMode.CreateResourceDownloaderByTags(string[] tags, int downloadingMaxNumber, int failedTryAgain, int timeout)
  80. {
  81. return ResourceDownloaderOperation.CreateEmptyDownloader(Download, PackageName, downloadingMaxNumber, failedTryAgain, timeout);
  82. }
  83. ResourceDownloaderOperation IPlayMode.CreateResourceDownloaderByPaths(AssetInfo[] assetInfos, int downloadingMaxNumber, int failedTryAgain, int timeout)
  84. {
  85. return ResourceDownloaderOperation.CreateEmptyDownloader(Download, PackageName, downloadingMaxNumber, failedTryAgain, timeout);
  86. }
  87. ResourceUnpackerOperation IPlayMode.CreateResourceUnpackerByAll(int upackingMaxNumber, int failedTryAgain, int timeout)
  88. {
  89. List<BundleInfo> unpcakList = GetUnpackListByAll(_activeManifest);
  90. var operation = new ResourceUnpackerOperation(Download, PackageName, unpcakList, upackingMaxNumber, failedTryAgain, timeout);
  91. return operation;
  92. }
  93. private List<BundleInfo> GetUnpackListByAll(PackageManifest manifest)
  94. {
  95. List<PackageBundle> downloadList = new List<PackageBundle>(1000);
  96. foreach (var packageBundle in manifest.BundleList)
  97. {
  98. // 忽略缓存文件
  99. if (IsCachedPackageBundle(packageBundle))
  100. continue;
  101. downloadList.Add(packageBundle);
  102. }
  103. return BundleInfo.CreateUnpackInfos(_assist, downloadList);
  104. }
  105. ResourceUnpackerOperation IPlayMode.CreateResourceUnpackerByTags(string[] tags, int upackingMaxNumber, int failedTryAgain, int timeout)
  106. {
  107. List<BundleInfo> unpcakList = GetUnpackListByTags(_activeManifest, tags);
  108. var operation = new ResourceUnpackerOperation(Download, PackageName, unpcakList, upackingMaxNumber, failedTryAgain, timeout);
  109. return operation;
  110. }
  111. private List<BundleInfo> GetUnpackListByTags(PackageManifest manifest, string[] tags)
  112. {
  113. List<PackageBundle> downloadList = new List<PackageBundle>(1000);
  114. foreach (var packageBundle in manifest.BundleList)
  115. {
  116. // 忽略缓存文件
  117. if (IsCachedPackageBundle(packageBundle))
  118. continue;
  119. // 查询DLC资源
  120. if (packageBundle.HasTag(tags))
  121. {
  122. downloadList.Add(packageBundle);
  123. }
  124. }
  125. return BundleInfo.CreateUnpackInfos(_assist, downloadList);
  126. }
  127. ResourceImporterOperation IPlayMode.CreateResourceImporterByFilePaths(string[] filePaths, int importerMaxNumber, int failedTryAgain, int timeout)
  128. {
  129. List<BundleInfo> importerList = GetImporterListByFilePaths(_activeManifest, filePaths);
  130. var operation = new ResourceImporterOperation(Download, PackageName, importerList, importerMaxNumber, failedTryAgain, timeout);
  131. return operation;
  132. }
  133. private List<BundleInfo> GetImporterListByFilePaths(PackageManifest manifest, string[] filePaths)
  134. {
  135. List<BundleInfo> result = new List<BundleInfo>();
  136. foreach (var filePath in filePaths)
  137. {
  138. string fileName = System.IO.Path.GetFileName(filePath);
  139. if (manifest.TryGetPackageBundleByFileName(fileName, out PackageBundle packageBundle))
  140. {
  141. // 忽略缓存文件
  142. if (IsCachedPackageBundle(packageBundle))
  143. continue;
  144. var bundleInfo = BundleInfo.CreateImportInfo(_assist, packageBundle, filePath);
  145. result.Add(bundleInfo);
  146. }
  147. else
  148. {
  149. YooLogger.Warning($"Not found package bundle, importer file path : {filePath}");
  150. }
  151. }
  152. return result;
  153. }
  154. #endregion
  155. #region IBundleQuery接口
  156. private BundleInfo CreateBundleInfo(PackageBundle packageBundle)
  157. {
  158. if (packageBundle == null)
  159. throw new Exception("Should never get here !");
  160. // 查询沙盒资源
  161. if (IsCachedPackageBundle(packageBundle))
  162. {
  163. BundleInfo bundleInfo = new BundleInfo(_assist, packageBundle, BundleInfo.ELoadMode.LoadFromCache);
  164. return bundleInfo;
  165. }
  166. // 查询APP资源
  167. {
  168. BundleInfo bundleInfo = new BundleInfo(_assist, packageBundle, BundleInfo.ELoadMode.LoadFromStreaming);
  169. return bundleInfo;
  170. }
  171. }
  172. BundleInfo IBundleQuery.GetMainBundleInfo(AssetInfo assetInfo)
  173. {
  174. if (assetInfo.IsInvalid)
  175. throw new Exception("Should never get here !");
  176. // 注意:如果清单里未找到资源包会抛出异常!
  177. var packageBundle = _activeManifest.GetMainPackageBundle(assetInfo.AssetPath);
  178. return CreateBundleInfo(packageBundle);
  179. }
  180. BundleInfo[] IBundleQuery.GetDependBundleInfos(AssetInfo assetInfo)
  181. {
  182. if (assetInfo.IsInvalid)
  183. throw new Exception("Should never get here !");
  184. // 注意:如果清单里未找到资源包会抛出异常!
  185. var depends = _activeManifest.GetAllDependencies(assetInfo.AssetPath);
  186. List<BundleInfo> result = new List<BundleInfo>(depends.Length);
  187. foreach (var packageBundle in depends)
  188. {
  189. BundleInfo bundleInfo = CreateBundleInfo(packageBundle);
  190. result.Add(bundleInfo);
  191. }
  192. return result.ToArray();
  193. }
  194. string IBundleQuery.GetMainBundleName(AssetInfo assetInfo)
  195. {
  196. if (assetInfo.IsInvalid)
  197. throw new Exception("Should never get here !");
  198. // 注意:如果清单里未找到资源包会抛出异常!
  199. var packageBundle = _activeManifest.GetMainPackageBundle(assetInfo.AssetPath);
  200. return packageBundle.BundleName;
  201. }
  202. string[] IBundleQuery.GetDependBundleNames(AssetInfo assetInfo)
  203. {
  204. if (assetInfo.IsInvalid)
  205. throw new Exception("Should never get here !");
  206. // 注意:如果清单里未找到资源包会抛出异常!
  207. var depends = _activeManifest.GetAllDependencies(assetInfo.AssetPath);
  208. List<string> result = new List<string>(depends.Length);
  209. foreach (var packageBundle in depends)
  210. {
  211. result.Add(packageBundle.BundleName);
  212. }
  213. return result.ToArray();
  214. }
  215. bool IBundleQuery.ManifestValid()
  216. {
  217. return _activeManifest != null;
  218. }
  219. #endregion
  220. }
  221. }