ResourcesLoaderComponent.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System.Collections.Generic;
  2. namespace ET
  3. {
  4. [ObjectSystem]
  5. public class ResourcesLoaderComponentDestroySystem: DestroySystem<ResourcesLoaderComponent>
  6. {
  7. public override void Destroy(ResourcesLoaderComponent self)
  8. {
  9. async ETTask UnLoadAsync()
  10. {
  11. using (ListComponent<string> list = ListComponent<string>.Create())
  12. {
  13. list.AddRange(self.LoadedResource);
  14. self.LoadedResource = null;
  15. if (TimerComponent.Instance == null)
  16. {
  17. return;
  18. }
  19. // 延迟5秒卸载包,因为包卸载是引用计数,5秒之内假如重新有逻辑加载了这个包,那么可以避免一次卸载跟加载
  20. await TimerComponent.Instance.WaitAsync(5000);
  21. foreach (string abName in list)
  22. {
  23. CoroutineLock coroutineLock = null;
  24. try
  25. {
  26. coroutineLock =
  27. await CoroutineLockComponent.Instance.Wait(CoroutineLockType.ResourcesLoader, abName.GetHashCode(), 0);
  28. {
  29. if (ResourcesComponent.Instance == null)
  30. {
  31. return;
  32. }
  33. await ResourcesComponent.Instance.UnloadBundleAsync(abName);
  34. }
  35. }
  36. finally
  37. {
  38. coroutineLock?.Dispose();
  39. }
  40. }
  41. }
  42. }
  43. UnLoadAsync().Coroutine();
  44. }
  45. }
  46. public class ResourcesLoaderComponent: Entity, IAwake, IDestroy
  47. {
  48. public HashSet<string> LoadedResource = new HashSet<string>();
  49. public async ETTask LoadAsync(string ab)
  50. {
  51. CoroutineLock coroutineLock = null;
  52. try
  53. {
  54. coroutineLock = await CoroutineLockComponent.Instance.Wait(CoroutineLockType.ResourcesLoader, ab.GetHashCode(), 0);
  55. if (this.IsDisposed)
  56. {
  57. Log.Error($"resourceload already disposed {ab}");
  58. return;
  59. }
  60. if (this.LoadedResource.Contains(ab))
  61. {
  62. return;
  63. }
  64. LoadedResource.Add(ab);
  65. await ResourcesComponent.Instance.LoadBundleAsync(ab);
  66. }
  67. finally
  68. {
  69. coroutineLock?.Dispose();
  70. }
  71. }
  72. }
  73. }