ResourcePackage.cs 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182
  1. using System;
  2. using System.Diagnostics;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine.SceneManagement;
  6. namespace YooAsset
  7. {
  8. public class ResourcePackage
  9. {
  10. private bool _isInitialize = false;
  11. private string _initializeError = string.Empty;
  12. private EOperationStatus _initializeStatus = EOperationStatus.None;
  13. private EPlayMode _playMode;
  14. // 管理器
  15. private ResourceManager _resourceManager;
  16. private IBundleQuery _bundleQuery;
  17. private IPlayMode _playModeImpl;
  18. /// <summary>
  19. /// 包裹名
  20. /// </summary>
  21. public readonly string PackageName;
  22. /// <summary>
  23. /// 初始化状态
  24. /// </summary>
  25. public EOperationStatus InitializeStatus
  26. {
  27. get { return _initializeStatus; }
  28. }
  29. /// <summary>
  30. /// 包裹是否有效
  31. /// </summary>
  32. public bool PackageValid
  33. {
  34. get
  35. {
  36. if (_playModeImpl == null)
  37. return false;
  38. return _playModeImpl.ActiveManifest != null;
  39. }
  40. }
  41. internal ResourcePackage(string packageName)
  42. {
  43. PackageName = packageName;
  44. }
  45. /// <summary>
  46. /// 销毁资源包裹
  47. /// </summary>
  48. internal void DestroyPackage()
  49. {
  50. if (_isInitialize)
  51. {
  52. _isInitialize = false;
  53. _initializeError = string.Empty;
  54. _initializeStatus = EOperationStatus.None;
  55. // 销毁资源管理器
  56. if (_resourceManager != null)
  57. {
  58. _resourceManager.Destroy();
  59. _resourceManager = null;
  60. }
  61. // 销毁文件系统
  62. if (_playModeImpl != null)
  63. _playModeImpl.DestroyFileSystem();
  64. _bundleQuery = null;
  65. _playModeImpl = null;
  66. }
  67. }
  68. /// <summary>
  69. /// 异步初始化
  70. /// </summary>
  71. public InitializationOperation InitializeAsync(InitializeParameters parameters)
  72. {
  73. // 注意:联机平台因为网络原因可能会初始化失败!
  74. ResetInitializeAfterFailed();
  75. // 检测初始化参数合法性
  76. CheckInitializeParameters(parameters);
  77. // 销毁资源管理器
  78. if (_resourceManager != null)
  79. {
  80. _resourceManager.Destroy();
  81. _resourceManager = null;
  82. }
  83. // 创建资源管理器
  84. _resourceManager = new ResourceManager(PackageName);
  85. var playModeImpl = new PlayModeImpl(PackageName, _playMode);
  86. _bundleQuery = playModeImpl;
  87. _playModeImpl = playModeImpl;
  88. _resourceManager.Initialize(_bundleQuery);
  89. // 初始化资源系统
  90. InitializationOperation initializeOperation;
  91. if (_playMode == EPlayMode.EditorSimulateMode)
  92. {
  93. var initializeParameters = parameters as EditorSimulateModeParameters;
  94. initializeOperation = playModeImpl.InitializeAsync(initializeParameters.EditorFileSystemParameters);
  95. }
  96. else if (_playMode == EPlayMode.OfflinePlayMode)
  97. {
  98. var initializeParameters = parameters as OfflinePlayModeParameters;
  99. initializeOperation = playModeImpl.InitializeAsync(initializeParameters.BuildinFileSystemParameters);
  100. }
  101. else if (_playMode == EPlayMode.HostPlayMode)
  102. {
  103. var initializeParameters = parameters as HostPlayModeParameters;
  104. initializeOperation = playModeImpl.InitializeAsync(initializeParameters.BuildinFileSystemParameters, initializeParameters.CacheFileSystemParameters);
  105. }
  106. else if (_playMode == EPlayMode.WebPlayMode)
  107. {
  108. var initializeParameters = parameters as WebPlayModeParameters;
  109. initializeOperation = playModeImpl.InitializeAsync(initializeParameters.WebServerFileSystemParameters, initializeParameters.WebRemoteFileSystemParameters);
  110. }
  111. else if (_playMode == EPlayMode.CustomPlayMode)
  112. {
  113. var initializeParameters = parameters as CustomPlayModeParameters;
  114. initializeOperation = playModeImpl.InitializeAsync(initializeParameters.FileSystemParameterList);
  115. }
  116. else
  117. {
  118. throw new NotImplementedException();
  119. }
  120. // 监听初始化结果
  121. _isInitialize = true;
  122. OperationSystem.StartOperation(PackageName, initializeOperation);
  123. initializeOperation.Completed += InitializeOperation_Completed;
  124. return initializeOperation;
  125. }
  126. private void ResetInitializeAfterFailed()
  127. {
  128. if (_isInitialize && _initializeStatus == EOperationStatus.Failed)
  129. {
  130. _isInitialize = false;
  131. _initializeStatus = EOperationStatus.None;
  132. _initializeError = string.Empty;
  133. }
  134. }
  135. private void CheckInitializeParameters(InitializeParameters parameters)
  136. {
  137. if (_isInitialize)
  138. throw new Exception($"{nameof(ResourcePackage)} is initialized yet.");
  139. if (parameters == null)
  140. throw new Exception($"{nameof(ResourcePackage)} create parameters is null.");
  141. #if !UNITY_EDITOR
  142. if (parameters is EditorSimulateModeParameters)
  143. throw new Exception($"Editor simulate mode only support unity editor.");
  144. #endif
  145. // 鉴定运行模式
  146. if (parameters is EditorSimulateModeParameters)
  147. _playMode = EPlayMode.EditorSimulateMode;
  148. else if (parameters is OfflinePlayModeParameters)
  149. _playMode = EPlayMode.OfflinePlayMode;
  150. else if (parameters is HostPlayModeParameters)
  151. _playMode = EPlayMode.HostPlayMode;
  152. else if (parameters is WebPlayModeParameters)
  153. _playMode = EPlayMode.WebPlayMode;
  154. else if (parameters is CustomPlayModeParameters)
  155. _playMode = EPlayMode.CustomPlayMode;
  156. else
  157. throw new NotImplementedException();
  158. // 检测运行时平台
  159. if (_playMode != EPlayMode.EditorSimulateMode)
  160. {
  161. #if UNITY_WEBGL
  162. if (_playMode != EPlayMode.WebPlayMode)
  163. {
  164. throw new Exception($"{_playMode} can not support WebGL plateform !");
  165. }
  166. #else
  167. if (_playMode == EPlayMode.WebPlayMode)
  168. {
  169. throw new Exception($"{nameof(EPlayMode.WebPlayMode)} only support WebGL plateform !");
  170. }
  171. #endif
  172. }
  173. }
  174. private void InitializeOperation_Completed(AsyncOperationBase op)
  175. {
  176. _initializeStatus = op.Status;
  177. _initializeError = op.Error;
  178. if (_initializeStatus != EOperationStatus.Succeed)
  179. YooLogger.Error(_initializeError);
  180. }
  181. /// <summary>
  182. /// 异步销毁
  183. /// </summary>
  184. public DestroyOperation DestroyAsync()
  185. {
  186. var operation = new DestroyOperation(this);
  187. OperationSystem.StartOperation(null, operation);
  188. return operation;
  189. }
  190. /// <summary>
  191. /// 请求最新的资源版本
  192. /// </summary>
  193. /// <param name="appendTimeTicks">在URL末尾添加时间戳</param>
  194. /// <param name="timeout">超时时间(默认值:60秒)</param>
  195. public RequestPackageVersionOperation RequestPackageVersionAsync(bool appendTimeTicks = true, int timeout = 60)
  196. {
  197. DebugCheckInitialize(false);
  198. var operation = _playModeImpl.RequestPackageVersionAsync(appendTimeTicks, timeout);
  199. OperationSystem.StartOperation(PackageName, operation);
  200. return operation;
  201. }
  202. /// <summary>
  203. /// 更新并加载指定版本的资源清单
  204. /// </summary>
  205. /// <param name="packageVersion">包裹版本</param>
  206. /// <param name="timeout">超时时间(默认值:60秒)</param>
  207. public UpdatePackageManifestOperation UpdatePackageManifestAsync(string packageVersion, int timeout = 60)
  208. {
  209. DebugCheckInitialize(false);
  210. // 注意:强烈建议在更新之前保持加载器为空!
  211. if (_resourceManager.HasAnyLoader())
  212. {
  213. YooLogger.Warning($"Found loaded bundle before update manifest ! Recommended to call the {nameof(UnloadAllAssetsAsync)} method to release loaded bundle !");
  214. }
  215. var operation = _playModeImpl.UpdatePackageManifestAsync(packageVersion, timeout);
  216. OperationSystem.StartOperation(PackageName, operation);
  217. return operation;
  218. }
  219. /// <summary>
  220. /// 预下载指定版本的包裹资源
  221. /// </summary>
  222. /// <param name="packageVersion">包裹版本</param>
  223. /// <param name="timeout">超时时间(默认值:60秒)</param>
  224. public PreDownloadContentOperation PreDownloadContentAsync(string packageVersion, int timeout = 60)
  225. {
  226. DebugCheckInitialize(false);
  227. var operation = _playModeImpl.PreDownloadContentAsync(packageVersion, timeout);
  228. OperationSystem.StartOperation(PackageName, operation);
  229. return operation;
  230. }
  231. /// <summary>
  232. /// 清理缓存文件
  233. /// </summary>
  234. /// <param name="clearMode">清理方式</param>
  235. /// <param name="clearParam">执行参数</param>
  236. public ClearCacheFilesOperation ClearCacheFilesAsync(EFileClearMode clearMode, object clearParam = null)
  237. {
  238. DebugCheckInitialize(false);
  239. var operation = _playModeImpl.ClearCacheFilesAsync(clearMode.ToString(), clearParam);
  240. OperationSystem.StartOperation(PackageName, operation);
  241. return operation;
  242. }
  243. /// <summary>
  244. /// 清理缓存文件
  245. /// </summary>
  246. /// <param name="clearMode">清理方式</param>
  247. /// <param name="clearParam">执行参数</param>
  248. public ClearCacheFilesOperation ClearCacheFilesAsync(string clearMode, object clearParam = null)
  249. {
  250. DebugCheckInitialize(false);
  251. var operation = _playModeImpl.ClearCacheFilesAsync(clearMode, clearParam);
  252. OperationSystem.StartOperation(PackageName, operation);
  253. return operation;
  254. }
  255. #region 包裹信息
  256. /// <summary>
  257. /// 获取当前加载包裹的版本信息
  258. /// </summary>
  259. public string GetPackageVersion()
  260. {
  261. DebugCheckInitialize();
  262. return _playModeImpl.ActiveManifest.PackageVersion;
  263. }
  264. /// <summary>
  265. /// 获取当前加载包裹的备注信息
  266. /// </summary>
  267. public string GetPackageNote()
  268. {
  269. DebugCheckInitialize();
  270. return _playModeImpl.ActiveManifest.PackageNote;
  271. }
  272. /// <summary>
  273. /// 获取当前加载包裹的详细信息
  274. /// </summary>
  275. public PackageDetails GetPackageDetails()
  276. {
  277. DebugCheckInitialize();
  278. return _playModeImpl.ActiveManifest.GetPackageDetails();
  279. }
  280. #endregion
  281. #region 资源回收
  282. /// <summary>
  283. /// 强制回收所有资源
  284. /// </summary>
  285. public UnloadAllAssetsOperation UnloadAllAssetsAsync()
  286. {
  287. var options = new UnloadAllAssetsOptions();
  288. return UnloadAllAssetsAsync(options);
  289. }
  290. /// <summary>
  291. /// 强制回收所有资源
  292. /// </summary>
  293. /// <param name="options">卸载选项</param>
  294. public UnloadAllAssetsOperation UnloadAllAssetsAsync(UnloadAllAssetsOptions options)
  295. {
  296. DebugCheckInitialize();
  297. var operation = new UnloadAllAssetsOperation(_resourceManager, options);
  298. OperationSystem.StartOperation(PackageName, operation);
  299. return operation;
  300. }
  301. /// <summary>
  302. /// 回收不再使用的资源
  303. /// 说明:卸载引用计数为零的资源
  304. /// </summary>
  305. /// <param name="loopCount">循环迭代次数</param>
  306. public UnloadUnusedAssetsOperation UnloadUnusedAssetsAsync(int loopCount = 10)
  307. {
  308. DebugCheckInitialize();
  309. var operation = new UnloadUnusedAssetsOperation(_resourceManager, loopCount);
  310. OperationSystem.StartOperation(PackageName, operation);
  311. return operation;
  312. }
  313. /// <summary>
  314. /// 资源回收
  315. /// 说明:尝试卸载指定的资源
  316. /// </summary>
  317. public void TryUnloadUnusedAsset(string location)
  318. {
  319. DebugCheckInitialize();
  320. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null);
  321. _resourceManager.TryUnloadUnusedAsset(assetInfo);
  322. }
  323. /// <summary>
  324. /// 资源回收
  325. /// 说明:尝试卸载指定的资源
  326. /// </summary>
  327. public void TryUnloadUnusedAsset(AssetInfo assetInfo)
  328. {
  329. DebugCheckInitialize();
  330. _resourceManager.TryUnloadUnusedAsset(assetInfo);
  331. }
  332. #endregion
  333. #region 资源信息
  334. /// <summary>
  335. /// 是否需要从远端更新下载
  336. /// </summary>
  337. /// <param name="location">资源的定位地址</param>
  338. public bool IsNeedDownloadFromRemote(string location)
  339. {
  340. DebugCheckInitialize();
  341. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null);
  342. return IsNeedDownloadFromRemoteInternal(assetInfo);
  343. }
  344. /// <summary>
  345. /// 是否需要从远端更新下载
  346. /// </summary>
  347. /// <param name="location">资源的定位地址</param>
  348. public bool IsNeedDownloadFromRemote(AssetInfo assetInfo)
  349. {
  350. DebugCheckInitialize();
  351. return IsNeedDownloadFromRemoteInternal(assetInfo);
  352. }
  353. /// <summary>
  354. /// 获取所有的资源信息
  355. /// </summary>
  356. public AssetInfo[] GetAllAssetInfos()
  357. {
  358. DebugCheckInitialize();
  359. return _playModeImpl.ActiveManifest.GetAllAssetInfos();
  360. }
  361. /// <summary>
  362. /// 获取资源信息列表
  363. /// </summary>
  364. /// <param name="tag">资源标签</param>
  365. public AssetInfo[] GetAssetInfos(string tag)
  366. {
  367. DebugCheckInitialize();
  368. string[] tags = new string[] { tag };
  369. return _playModeImpl.ActiveManifest.GetAssetInfosByTags(tags);
  370. }
  371. /// <summary>
  372. /// 获取资源信息列表
  373. /// </summary>
  374. /// <param name="tags">资源标签列表</param>
  375. public AssetInfo[] GetAssetInfos(string[] tags)
  376. {
  377. DebugCheckInitialize();
  378. return _playModeImpl.ActiveManifest.GetAssetInfosByTags(tags);
  379. }
  380. /// <summary>
  381. /// 获取资源信息
  382. /// </summary>
  383. /// <param name="location">资源的定位地址</param>
  384. public AssetInfo GetAssetInfo(string location)
  385. {
  386. DebugCheckInitialize();
  387. return ConvertLocationToAssetInfo(location, null);
  388. }
  389. /// <summary>
  390. /// 获取资源信息
  391. /// </summary>
  392. /// <param name="location">资源的定位地址</param>
  393. /// <param name="type">资源类型</param>
  394. public AssetInfo GetAssetInfo(string location, System.Type type)
  395. {
  396. DebugCheckInitialize();
  397. return ConvertLocationToAssetInfo(location, type);
  398. }
  399. /// <summary>
  400. /// 获取资源信息
  401. /// </summary>
  402. /// <param name="assetGUID">资源GUID</param>
  403. public AssetInfo GetAssetInfoByGUID(string assetGUID)
  404. {
  405. DebugCheckInitialize();
  406. return ConvertAssetGUIDToAssetInfo(assetGUID, null);
  407. }
  408. /// <summary>
  409. /// 获取资源信息
  410. /// </summary>
  411. /// <param name="assetGUID">资源GUID</param>
  412. /// <param name="type">资源类型</param>
  413. public AssetInfo GetAssetInfoByGUID(string assetGUID, System.Type type)
  414. {
  415. DebugCheckInitialize();
  416. return ConvertAssetGUIDToAssetInfo(assetGUID, type);
  417. }
  418. /// <summary>
  419. /// 检查资源定位地址是否有效
  420. /// </summary>
  421. /// <param name="location">资源的定位地址</param>
  422. public bool CheckLocationValid(string location)
  423. {
  424. DebugCheckInitialize();
  425. string assetPath = _playModeImpl.ActiveManifest.TryMappingToAssetPath(location);
  426. return string.IsNullOrEmpty(assetPath) == false;
  427. }
  428. private bool IsNeedDownloadFromRemoteInternal(AssetInfo assetInfo)
  429. {
  430. if (assetInfo.IsInvalid)
  431. {
  432. YooLogger.Warning(assetInfo.Error);
  433. return false;
  434. }
  435. BundleInfo bundleInfo = _bundleQuery.GetMainBundleInfo(assetInfo);
  436. if (bundleInfo.IsNeedDownloadFromRemote())
  437. return true;
  438. BundleInfo[] depends = _bundleQuery.GetDependBundleInfos(assetInfo);
  439. foreach (var depend in depends)
  440. {
  441. if (depend.IsNeedDownloadFromRemote())
  442. return true;
  443. }
  444. return false;
  445. }
  446. #endregion
  447. #region 原生文件
  448. /// <summary>
  449. /// 同步加载原生文件
  450. /// </summary>
  451. /// <param name="assetInfo">资源信息</param>
  452. public RawFileHandle LoadRawFileSync(AssetInfo assetInfo)
  453. {
  454. DebugCheckInitialize();
  455. return LoadRawFileInternal(assetInfo, true, 0);
  456. }
  457. /// <summary>
  458. /// 同步加载原生文件
  459. /// </summary>
  460. /// <param name="location">资源的定位地址</param>
  461. public RawFileHandle LoadRawFileSync(string location)
  462. {
  463. DebugCheckInitialize();
  464. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null);
  465. return LoadRawFileInternal(assetInfo, true, 0);
  466. }
  467. /// <summary>
  468. /// 异步加载原生文件
  469. /// </summary>
  470. /// <param name="assetInfo">资源信息</param>
  471. /// <param name="priority">加载的优先级</param>
  472. public RawFileHandle LoadRawFileAsync(AssetInfo assetInfo, uint priority = 0)
  473. {
  474. DebugCheckInitialize();
  475. return LoadRawFileInternal(assetInfo, false, priority);
  476. }
  477. /// <summary>
  478. /// 异步加载原生文件
  479. /// </summary>
  480. /// <param name="location">资源的定位地址</param>
  481. /// <param name="priority">加载的优先级</param>
  482. public RawFileHandle LoadRawFileAsync(string location, uint priority = 0)
  483. {
  484. DebugCheckInitialize();
  485. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null);
  486. return LoadRawFileInternal(assetInfo, false, priority);
  487. }
  488. private RawFileHandle LoadRawFileInternal(AssetInfo assetInfo, bool waitForAsyncComplete, uint priority)
  489. {
  490. var handle = _resourceManager.LoadRawFileAsync(assetInfo, priority);
  491. if (waitForAsyncComplete)
  492. handle.WaitForAsyncComplete();
  493. return handle;
  494. }
  495. #endregion
  496. #region 场景加载
  497. /// <summary>
  498. /// 同步加载场景
  499. /// </summary>
  500. /// <param name="location">场景的定位地址</param>
  501. /// <param name="sceneMode">场景加载模式</param>
  502. /// <param name="physicsMode">场景物理模式</param>
  503. public SceneHandle LoadSceneSync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, LocalPhysicsMode physicsMode = LocalPhysicsMode.None)
  504. {
  505. DebugCheckInitialize();
  506. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null);
  507. return LoadSceneInternal(assetInfo, true, sceneMode, physicsMode, false, 0);
  508. }
  509. /// <summary>
  510. /// 同步加载场景
  511. /// </summary>
  512. /// <param name="assetInfo">场景的资源信息</param>
  513. /// <param name="sceneMode">场景加载模式</param>
  514. /// <param name="physicsMode">场景物理模式</param>
  515. public SceneHandle LoadSceneSync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, LocalPhysicsMode physicsMode = LocalPhysicsMode.None)
  516. {
  517. DebugCheckInitialize();
  518. return LoadSceneInternal(assetInfo, true, sceneMode, physicsMode, false, 0);
  519. }
  520. /// <summary>
  521. /// 异步加载场景
  522. /// </summary>
  523. /// <param name="location">场景的定位地址</param>
  524. /// <param name="sceneMode">场景加载模式</param>
  525. /// <param name="physicsMode">场景物理模式</param>
  526. /// <param name="suspendLoad">场景加载到90%自动挂起</param>
  527. /// <param name="priority">加载的优先级</param>
  528. public SceneHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, LocalPhysicsMode physicsMode = LocalPhysicsMode.None, bool suspendLoad = false, uint priority = 0)
  529. {
  530. DebugCheckInitialize();
  531. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null);
  532. return LoadSceneInternal(assetInfo, false, sceneMode, physicsMode, suspendLoad, priority);
  533. }
  534. /// <summary>
  535. /// 异步加载场景
  536. /// </summary>
  537. /// <param name="assetInfo">场景的资源信息</param>
  538. /// <param name="sceneMode">场景加载模式</param>
  539. /// <param name="physicsMode">场景物理模式</param>
  540. /// <param name="suspendLoad">场景加载到90%自动挂起</param>
  541. /// <param name="priority">加载的优先级</param>
  542. public SceneHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, LocalPhysicsMode physicsMode = LocalPhysicsMode.None, bool suspendLoad = false, uint priority = 0)
  543. {
  544. DebugCheckInitialize();
  545. return LoadSceneInternal(assetInfo, false, sceneMode, physicsMode, suspendLoad, priority);
  546. }
  547. private SceneHandle LoadSceneInternal(AssetInfo assetInfo, bool waitForAsyncComplete, LoadSceneMode sceneMode, LocalPhysicsMode physicsMode, bool suspendLoad, uint priority)
  548. {
  549. DebugCheckAssetLoadType(assetInfo.AssetType);
  550. assetInfo.LoadMethod = AssetInfo.ELoadMethod.LoadScene;
  551. var loadSceneParams = new LoadSceneParameters(sceneMode, physicsMode);
  552. var handle = _resourceManager.LoadSceneAsync(assetInfo, loadSceneParams, suspendLoad, priority);
  553. if (waitForAsyncComplete)
  554. handle.WaitForAsyncComplete();
  555. return handle;
  556. }
  557. #endregion
  558. #region 资源加载
  559. /// <summary>
  560. /// 同步加载资源对象
  561. /// </summary>
  562. /// <param name="assetInfo">资源信息</param>
  563. public AssetHandle LoadAssetSync(AssetInfo assetInfo)
  564. {
  565. DebugCheckInitialize();
  566. return LoadAssetInternal(assetInfo, true, 0);
  567. }
  568. /// <summary>
  569. /// 同步加载资源对象
  570. /// </summary>
  571. /// <typeparam name="TObject">资源类型</typeparam>
  572. /// <param name="location">资源的定位地址</param>
  573. public AssetHandle LoadAssetSync<TObject>(string location) where TObject : UnityEngine.Object
  574. {
  575. DebugCheckInitialize();
  576. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, typeof(TObject));
  577. return LoadAssetInternal(assetInfo, true, 0);
  578. }
  579. /// <summary>
  580. /// 同步加载资源对象
  581. /// </summary>
  582. /// <param name="location">资源的定位地址</param>
  583. /// <param name="type">资源类型</param>
  584. public AssetHandle LoadAssetSync(string location, System.Type type)
  585. {
  586. DebugCheckInitialize();
  587. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  588. return LoadAssetInternal(assetInfo, true, 0);
  589. }
  590. /// <summary>
  591. /// 同步加载资源对象
  592. /// </summary>
  593. /// <param name="location">资源的定位地址</param>
  594. public AssetHandle LoadAssetSync(string location)
  595. {
  596. DebugCheckInitialize();
  597. Type type = typeof(UnityEngine.Object);
  598. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  599. return LoadAssetInternal(assetInfo, true, 0);
  600. }
  601. /// <summary>
  602. /// 异步加载资源对象
  603. /// </summary>
  604. /// <param name="assetInfo">资源信息</param>
  605. /// <param name="priority">加载的优先级</param>
  606. public AssetHandle LoadAssetAsync(AssetInfo assetInfo, uint priority = 0)
  607. {
  608. DebugCheckInitialize();
  609. return LoadAssetInternal(assetInfo, false, priority);
  610. }
  611. /// <summary>
  612. /// 异步加载资源对象
  613. /// </summary>
  614. /// <typeparam name="TObject">资源类型</typeparam>
  615. /// <param name="location">资源的定位地址</param>
  616. /// <param name="priority">加载的优先级</param>
  617. public AssetHandle LoadAssetAsync<TObject>(string location, uint priority = 0) where TObject : UnityEngine.Object
  618. {
  619. DebugCheckInitialize();
  620. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, typeof(TObject));
  621. return LoadAssetInternal(assetInfo, false, priority);
  622. }
  623. /// <summary>
  624. /// 异步加载资源对象
  625. /// </summary>
  626. /// <param name="location">资源的定位地址</param>
  627. /// <param name="type">资源类型</param>
  628. /// <param name="priority">加载的优先级</param>
  629. public AssetHandle LoadAssetAsync(string location, System.Type type, uint priority = 0)
  630. {
  631. DebugCheckInitialize();
  632. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  633. return LoadAssetInternal(assetInfo, false, priority);
  634. }
  635. /// <summary>
  636. /// 异步加载资源对象
  637. /// </summary>
  638. /// <param name="location">资源的定位地址</param>
  639. /// <param name="priority">加载的优先级</param>
  640. public AssetHandle LoadAssetAsync(string location, uint priority = 0)
  641. {
  642. DebugCheckInitialize();
  643. Type type = typeof(UnityEngine.Object);
  644. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  645. return LoadAssetInternal(assetInfo, false, priority);
  646. }
  647. private AssetHandle LoadAssetInternal(AssetInfo assetInfo, bool waitForAsyncComplete, uint priority)
  648. {
  649. DebugCheckAssetLoadType(assetInfo.AssetType);
  650. assetInfo.LoadMethod = AssetInfo.ELoadMethod.LoadAsset;
  651. var handle = _resourceManager.LoadAssetAsync(assetInfo, priority);
  652. if (waitForAsyncComplete)
  653. handle.WaitForAsyncComplete();
  654. return handle;
  655. }
  656. #endregion
  657. #region 资源加载
  658. /// <summary>
  659. /// 同步加载子资源对象
  660. /// </summary>
  661. /// <param name="assetInfo">资源信息</param>
  662. public SubAssetsHandle LoadSubAssetsSync(AssetInfo assetInfo)
  663. {
  664. DebugCheckInitialize();
  665. return LoadSubAssetsInternal(assetInfo, true, 0);
  666. }
  667. /// <summary>
  668. /// 同步加载子资源对象
  669. /// </summary>
  670. /// <typeparam name="TObject">资源类型</typeparam>
  671. /// <param name="location">资源的定位地址</param>
  672. public SubAssetsHandle LoadSubAssetsSync<TObject>(string location) where TObject : UnityEngine.Object
  673. {
  674. DebugCheckInitialize();
  675. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, typeof(TObject));
  676. return LoadSubAssetsInternal(assetInfo, true, 0);
  677. }
  678. /// <summary>
  679. /// 同步加载子资源对象
  680. /// </summary>
  681. /// <param name="location">资源的定位地址</param>
  682. /// <param name="type">子对象类型</param>
  683. public SubAssetsHandle LoadSubAssetsSync(string location, System.Type type)
  684. {
  685. DebugCheckInitialize();
  686. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  687. return LoadSubAssetsInternal(assetInfo, true, 0);
  688. }
  689. /// <summary>
  690. /// 同步加载子资源对象
  691. /// </summary>
  692. /// <param name="location">资源的定位地址</param>
  693. public SubAssetsHandle LoadSubAssetsSync(string location)
  694. {
  695. DebugCheckInitialize();
  696. Type type = typeof(UnityEngine.Object);
  697. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  698. return LoadSubAssetsInternal(assetInfo, true, 0);
  699. }
  700. /// <summary>
  701. /// 异步加载子资源对象
  702. /// </summary>
  703. /// <param name="assetInfo">资源信息</param>
  704. /// <param name="priority">加载的优先级</param>
  705. public SubAssetsHandle LoadSubAssetsAsync(AssetInfo assetInfo, uint priority = 0)
  706. {
  707. DebugCheckInitialize();
  708. return LoadSubAssetsInternal(assetInfo, false, priority);
  709. }
  710. /// <summary>
  711. /// 异步加载子资源对象
  712. /// </summary>
  713. /// <typeparam name="TObject">资源类型</typeparam>
  714. /// <param name="location">资源的定位地址</param>
  715. /// <param name="priority">加载的优先级</param>
  716. public SubAssetsHandle LoadSubAssetsAsync<TObject>(string location, uint priority = 0) where TObject : UnityEngine.Object
  717. {
  718. DebugCheckInitialize();
  719. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, typeof(TObject));
  720. return LoadSubAssetsInternal(assetInfo, false, priority);
  721. }
  722. /// <summary>
  723. /// 异步加载子资源对象
  724. /// </summary>
  725. /// <param name="location">资源的定位地址</param>
  726. /// <param name="type">子对象类型</param>
  727. /// <param name="priority">加载的优先级</param>
  728. public SubAssetsHandle LoadSubAssetsAsync(string location, System.Type type, uint priority = 0)
  729. {
  730. DebugCheckInitialize();
  731. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  732. return LoadSubAssetsInternal(assetInfo, false, priority);
  733. }
  734. /// <summary>
  735. /// 异步加载子资源对象
  736. /// </summary>
  737. /// <param name="location">资源的定位地址</param>
  738. /// <param name="priority">加载的优先级</param>
  739. public SubAssetsHandle LoadSubAssetsAsync(string location, uint priority = 0)
  740. {
  741. DebugCheckInitialize();
  742. Type type = typeof(UnityEngine.Object);
  743. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  744. return LoadSubAssetsInternal(assetInfo, false, priority);
  745. }
  746. private SubAssetsHandle LoadSubAssetsInternal(AssetInfo assetInfo, bool waitForAsyncComplete, uint priority)
  747. {
  748. DebugCheckAssetLoadType(assetInfo.AssetType);
  749. assetInfo.LoadMethod = AssetInfo.ELoadMethod.LoadSubAssets;
  750. var handle = _resourceManager.LoadSubAssetsAsync(assetInfo, priority);
  751. if (waitForAsyncComplete)
  752. handle.WaitForAsyncComplete();
  753. return handle;
  754. }
  755. #endregion
  756. #region 资源加载
  757. /// <summary>
  758. /// 同步加载资源包内所有资源对象
  759. /// </summary>
  760. /// <param name="assetInfo">资源信息</param>
  761. public AllAssetsHandle LoadAllAssetsSync(AssetInfo assetInfo)
  762. {
  763. DebugCheckInitialize();
  764. return LoadAllAssetsInternal(assetInfo, true, 0);
  765. }
  766. /// <summary>
  767. /// 同步加载资源包内所有资源对象
  768. /// </summary>
  769. /// <typeparam name="TObject">资源类型</typeparam>
  770. /// <param name="location">资源的定位地址</param>
  771. public AllAssetsHandle LoadAllAssetsSync<TObject>(string location) where TObject : UnityEngine.Object
  772. {
  773. DebugCheckInitialize();
  774. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, typeof(TObject));
  775. return LoadAllAssetsInternal(assetInfo, true, 0);
  776. }
  777. /// <summary>
  778. /// 同步加载资源包内所有资源对象
  779. /// </summary>
  780. /// <param name="location">资源的定位地址</param>
  781. /// <param name="type">子对象类型</param>
  782. public AllAssetsHandle LoadAllAssetsSync(string location, System.Type type)
  783. {
  784. DebugCheckInitialize();
  785. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  786. return LoadAllAssetsInternal(assetInfo, true, 0);
  787. }
  788. /// <summary>
  789. /// 同步加载资源包内所有资源对象
  790. /// </summary>
  791. /// <param name="location">资源的定位地址</param>
  792. public AllAssetsHandle LoadAllAssetsSync(string location)
  793. {
  794. DebugCheckInitialize();
  795. Type type = typeof(UnityEngine.Object);
  796. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  797. return LoadAllAssetsInternal(assetInfo, true, 0);
  798. }
  799. /// <summary>
  800. /// 异步加载资源包内所有资源对象
  801. /// </summary>
  802. /// <param name="assetInfo">资源信息</param>
  803. /// <param name="priority">加载的优先级</param>
  804. public AllAssetsHandle LoadAllAssetsAsync(AssetInfo assetInfo, uint priority = 0)
  805. {
  806. DebugCheckInitialize();
  807. return LoadAllAssetsInternal(assetInfo, false, priority);
  808. }
  809. /// <summary>
  810. /// 异步加载资源包内所有资源对象
  811. /// </summary>
  812. /// <typeparam name="TObject">资源类型</typeparam>
  813. /// <param name="location">资源的定位地址</param>
  814. /// <param name="priority">加载的优先级</param>
  815. public AllAssetsHandle LoadAllAssetsAsync<TObject>(string location, uint priority = 0) where TObject : UnityEngine.Object
  816. {
  817. DebugCheckInitialize();
  818. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, typeof(TObject));
  819. return LoadAllAssetsInternal(assetInfo, false, priority);
  820. }
  821. /// <summary>
  822. /// 异步加载资源包内所有资源对象
  823. /// </summary>
  824. /// <param name="location">资源的定位地址</param>
  825. /// <param name="type">子对象类型</param>
  826. /// <param name="priority">加载的优先级</param>
  827. public AllAssetsHandle LoadAllAssetsAsync(string location, System.Type type, uint priority = 0)
  828. {
  829. DebugCheckInitialize();
  830. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  831. return LoadAllAssetsInternal(assetInfo, false, priority);
  832. }
  833. /// <summary>
  834. /// 异步加载资源包内所有资源对象
  835. /// </summary>
  836. /// <param name="location">资源的定位地址</param>
  837. /// <param name="priority">加载的优先级</param>
  838. public AllAssetsHandle LoadAllAssetsAsync(string location, uint priority = 0)
  839. {
  840. DebugCheckInitialize();
  841. Type type = typeof(UnityEngine.Object);
  842. AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type);
  843. return LoadAllAssetsInternal(assetInfo, false, priority);
  844. }
  845. private AllAssetsHandle LoadAllAssetsInternal(AssetInfo assetInfo, bool waitForAsyncComplete, uint priority)
  846. {
  847. DebugCheckAssetLoadType(assetInfo.AssetType);
  848. assetInfo.LoadMethod = AssetInfo.ELoadMethod.LoadAllAssets;
  849. var handle = _resourceManager.LoadAllAssetsAsync(assetInfo, priority);
  850. if (waitForAsyncComplete)
  851. handle.WaitForAsyncComplete();
  852. return handle;
  853. }
  854. #endregion
  855. #region 资源下载
  856. /// <summary>
  857. /// 创建资源下载器,用于下载当前资源版本所有的资源包文件
  858. /// </summary>
  859. /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
  860. /// <param name="failedTryAgain">下载失败的重试次数</param>
  861. /// <param name="timeout">超时时间</param>
  862. public ResourceDownloaderOperation CreateResourceDownloader(int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
  863. {
  864. DebugCheckInitialize();
  865. return _playModeImpl.CreateResourceDownloaderByAll(downloadingMaxNumber, failedTryAgain, timeout);
  866. }
  867. /// <summary>
  868. /// 创建资源下载器,用于下载指定的资源标签关联的资源包文件
  869. /// </summary>
  870. /// <param name="tag">资源标签</param>
  871. /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
  872. /// <param name="failedTryAgain">下载失败的重试次数</param>
  873. /// <param name="timeout">超时时间</param>
  874. public ResourceDownloaderOperation CreateResourceDownloader(string tag, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
  875. {
  876. DebugCheckInitialize();
  877. return _playModeImpl.CreateResourceDownloaderByTags(new string[] { tag }, downloadingMaxNumber, failedTryAgain, timeout);
  878. }
  879. /// <summary>
  880. /// 创建资源下载器,用于下载指定的资源标签列表关联的资源包文件
  881. /// </summary>
  882. /// <param name="tags">资源标签列表</param>
  883. /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
  884. /// <param name="failedTryAgain">下载失败的重试次数</param>
  885. /// <param name="timeout">超时时间</param>
  886. public ResourceDownloaderOperation CreateResourceDownloader(string[] tags, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
  887. {
  888. DebugCheckInitialize();
  889. return _playModeImpl.CreateResourceDownloaderByTags(tags, downloadingMaxNumber, failedTryAgain, timeout);
  890. }
  891. /// <summary>
  892. /// 创建资源下载器,用于下载指定的资源依赖的资源包文件
  893. /// </summary>
  894. /// <param name="location">资源的定位地址</param>
  895. /// <param name="recursiveDownload">下载资源对象所属资源包内所有资源对象依赖的资源包</param>
  896. /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
  897. /// <param name="failedTryAgain">下载失败的重试次数</param>
  898. /// <param name="timeout">超时时间</param>
  899. public ResourceDownloaderOperation CreateBundleDownloader(string location, bool recursiveDownload, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
  900. {
  901. DebugCheckInitialize();
  902. var assetInfo = ConvertLocationToAssetInfo(location, null);
  903. AssetInfo[] assetInfos = new AssetInfo[] { assetInfo };
  904. return _playModeImpl.CreateResourceDownloaderByPaths(assetInfos, recursiveDownload, downloadingMaxNumber, failedTryAgain, timeout);
  905. }
  906. public ResourceDownloaderOperation CreateBundleDownloader(string location, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
  907. {
  908. return CreateBundleDownloader(location, false, downloadingMaxNumber, failedTryAgain, timeout);
  909. }
  910. /// <summary>
  911. /// 创建资源下载器,用于下载指定的资源列表依赖的资源包文件
  912. /// </summary>
  913. /// <param name="locations">资源的定位地址列表</param>
  914. /// <param name="recursiveDownload">下载资源对象所属资源包内所有资源对象依赖的资源包</param>
  915. /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
  916. /// <param name="failedTryAgain">下载失败的重试次数</param>
  917. /// <param name="timeout">超时时间</param>
  918. public ResourceDownloaderOperation CreateBundleDownloader(string[] locations, bool recursiveDownload, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
  919. {
  920. DebugCheckInitialize();
  921. List<AssetInfo> assetInfos = new List<AssetInfo>(locations.Length);
  922. foreach (var location in locations)
  923. {
  924. var assetInfo = ConvertLocationToAssetInfo(location, null);
  925. assetInfos.Add(assetInfo);
  926. }
  927. return _playModeImpl.CreateResourceDownloaderByPaths(assetInfos.ToArray(), recursiveDownload, downloadingMaxNumber, failedTryAgain, timeout);
  928. }
  929. public ResourceDownloaderOperation CreateBundleDownloader(string[] locations, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
  930. {
  931. return CreateBundleDownloader(locations, false, downloadingMaxNumber, failedTryAgain, timeout);
  932. }
  933. /// <summary>
  934. /// 创建资源下载器,用于下载指定的资源依赖的资源包文件
  935. /// </summary>
  936. /// <param name="assetInfo">资源信息</param>
  937. /// <param name="recursiveDownload">下载资源对象所属资源包内所有资源对象依赖的资源包</param>
  938. /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
  939. /// <param name="failedTryAgain">下载失败的重试次数</param>
  940. /// <param name="timeout">超时时间</param>
  941. public ResourceDownloaderOperation CreateBundleDownloader(AssetInfo assetInfo, bool recursiveDownload, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
  942. {
  943. DebugCheckInitialize();
  944. AssetInfo[] assetInfos = new AssetInfo[] { assetInfo };
  945. return _playModeImpl.CreateResourceDownloaderByPaths(assetInfos, recursiveDownload, downloadingMaxNumber, failedTryAgain, timeout);
  946. }
  947. public ResourceDownloaderOperation CreateBundleDownloader(AssetInfo assetInfo, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
  948. {
  949. return CreateBundleDownloader(assetInfo, false, downloadingMaxNumber, failedTryAgain, timeout);
  950. }
  951. /// <summary>
  952. /// 创建资源下载器,用于下载指定的资源列表依赖的资源包文件
  953. /// </summary>
  954. /// <param name="assetInfos">资源信息列表</param>
  955. /// <param name="recursiveDownload">下载资源对象所属资源包内所有资源对象依赖的资源包</param>
  956. /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
  957. /// <param name="failedTryAgain">下载失败的重试次数</param>
  958. /// <param name="timeout">超时时间</param>
  959. public ResourceDownloaderOperation CreateBundleDownloader(AssetInfo[] assetInfos, bool recursiveDownload, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
  960. {
  961. DebugCheckInitialize();
  962. return _playModeImpl.CreateResourceDownloaderByPaths(assetInfos, recursiveDownload, downloadingMaxNumber, failedTryAgain, timeout);
  963. }
  964. public ResourceDownloaderOperation CreateBundleDownloader(AssetInfo[] assetInfos, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
  965. {
  966. return CreateBundleDownloader(assetInfos, false, downloadingMaxNumber, failedTryAgain, timeout);
  967. }
  968. #endregion
  969. #region 资源解压
  970. /// <summary>
  971. /// 创建内置资源解压器,用于解压当前资源版本所有的资源包文件
  972. /// </summary>
  973. /// <param name="unpackingMaxNumber">同时解压的最大文件数</param>
  974. /// <param name="failedTryAgain">解压失败的重试次数</param>
  975. public ResourceUnpackerOperation CreateResourceUnpacker(int unpackingMaxNumber, int failedTryAgain)
  976. {
  977. DebugCheckInitialize();
  978. return _playModeImpl.CreateResourceUnpackerByAll(unpackingMaxNumber, failedTryAgain, int.MaxValue);
  979. }
  980. /// <summary>
  981. /// 创建内置资源解压器,用于解压指定的资源标签关联的资源包文件
  982. /// </summary>
  983. /// <param name="tag">资源标签</param>
  984. /// <param name="unpackingMaxNumber">同时解压的最大文件数</param>
  985. /// <param name="failedTryAgain">解压失败的重试次数</param>
  986. public ResourceUnpackerOperation CreateResourceUnpacker(string tag, int unpackingMaxNumber, int failedTryAgain)
  987. {
  988. DebugCheckInitialize();
  989. return _playModeImpl.CreateResourceUnpackerByTags(new string[] { tag }, unpackingMaxNumber, failedTryAgain, int.MaxValue);
  990. }
  991. /// <summary>
  992. /// 创建内置资源解压器,用于解压指定的资源标签列表关联的资源包文件
  993. /// </summary>
  994. /// <param name="tags">资源标签列表</param>
  995. /// <param name="unpackingMaxNumber">同时解压的最大文件数</param>
  996. /// <param name="failedTryAgain">解压失败的重试次数</param>
  997. public ResourceUnpackerOperation CreateResourceUnpacker(string[] tags, int unpackingMaxNumber, int failedTryAgain)
  998. {
  999. DebugCheckInitialize();
  1000. return _playModeImpl.CreateResourceUnpackerByTags(tags, unpackingMaxNumber, failedTryAgain, int.MaxValue);
  1001. }
  1002. #endregion
  1003. #region 资源导入
  1004. /// <summary>
  1005. /// 创建资源导入器
  1006. /// 注意:资源文件名称必须和资源服务器部署的文件名称一致!
  1007. /// </summary>
  1008. /// <param name="filePaths">资源路径列表</param>
  1009. /// <param name="importerMaxNumber">同时导入的最大文件数</param>
  1010. /// <param name="failedTryAgain">导入失败的重试次数</param>
  1011. public ResourceImporterOperation CreateResourceImporter(string[] filePaths, int importerMaxNumber, int failedTryAgain)
  1012. {
  1013. DebugCheckInitialize();
  1014. return _playModeImpl.CreateResourceImporterByFilePaths(filePaths, importerMaxNumber, failedTryAgain, int.MaxValue);
  1015. }
  1016. #endregion
  1017. #region 内部方法
  1018. private AssetInfo ConvertLocationToAssetInfo(string location, System.Type assetType)
  1019. {
  1020. return _playModeImpl.ActiveManifest.ConvertLocationToAssetInfo(location, assetType);
  1021. }
  1022. private AssetInfo ConvertAssetGUIDToAssetInfo(string assetGUID, System.Type assetType)
  1023. {
  1024. return _playModeImpl.ActiveManifest.ConvertAssetGUIDToAssetInfo(assetGUID, assetType);
  1025. }
  1026. #endregion
  1027. #region 调试方法
  1028. [Conditional("DEBUG")]
  1029. private void DebugCheckInitialize(bool checkActiveManifest = true)
  1030. {
  1031. if (_initializeStatus == EOperationStatus.None)
  1032. throw new Exception("Package initialize not completed !");
  1033. else if (_initializeStatus == EOperationStatus.Failed)
  1034. throw new Exception($"Package initialize failed ! {_initializeError}");
  1035. if (checkActiveManifest)
  1036. {
  1037. if (_playModeImpl.ActiveManifest == null)
  1038. throw new Exception("Can not found active package manifest !");
  1039. }
  1040. }
  1041. [Conditional("DEBUG")]
  1042. private void DebugCheckAssetLoadType(System.Type type)
  1043. {
  1044. if (type == null)
  1045. return;
  1046. if (typeof(UnityEngine.Behaviour).IsAssignableFrom(type))
  1047. {
  1048. throw new Exception($"Load asset type is invalid : {type.FullName} !");
  1049. }
  1050. if (typeof(UnityEngine.Object).IsAssignableFrom(type) == false)
  1051. {
  1052. throw new Exception($"Load asset type is invalid : {type.FullName} !");
  1053. }
  1054. }
  1055. #endregion
  1056. #region 调试信息
  1057. internal DebugPackageData GetDebugPackageData()
  1058. {
  1059. DebugPackageData data = new DebugPackageData();
  1060. data.PackageName = PackageName;
  1061. data.ProviderInfos = _resourceManager.GetDebugProviderInfos();
  1062. data.BundleInfos = _resourceManager.GetDebugBundleInfos();
  1063. data.OperationInfos = OperationSystem.GetDebugOperationInfos(PackageName);
  1064. return data;
  1065. }
  1066. #endregion
  1067. }
  1068. }