AssetBundleLoaderBase.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace YooAsset
  6. {
  7. internal abstract class AssetBundleLoaderBase
  8. {
  9. public enum EStatus
  10. {
  11. None = 0,
  12. Succeed,
  13. Failed
  14. }
  15. /// <summary>
  16. /// 资源包文件信息
  17. /// </summary>
  18. public BundleInfo MainBundleInfo { private set; get; }
  19. /// <summary>
  20. /// 引用计数
  21. /// </summary>
  22. public int RefCount { private set; get; }
  23. /// <summary>
  24. /// 加载状态
  25. /// </summary>
  26. public EStatus Status { protected set; get; }
  27. /// <summary>
  28. /// 最近的错误信息
  29. /// </summary>
  30. public string LastError { protected set; get; }
  31. /// <summary>
  32. /// 是否已经销毁
  33. /// </summary>
  34. public bool IsDestroyed { private set; get; } = false;
  35. private readonly List<ProviderBase> _providers = new List<ProviderBase>(100);
  36. internal AssetBundle CacheBundle { set; get; }
  37. public AssetBundleLoaderBase(BundleInfo bundleInfo)
  38. {
  39. MainBundleInfo = bundleInfo;
  40. RefCount = 0;
  41. Status = EStatus.None;
  42. }
  43. /// <summary>
  44. /// 添加附属的资源提供者
  45. /// </summary>
  46. public void AddProvider(ProviderBase provider)
  47. {
  48. if (_providers.Contains(provider) == false)
  49. _providers.Add(provider);
  50. }
  51. /// <summary>
  52. /// 引用(引用计数递加)
  53. /// </summary>
  54. public void Reference()
  55. {
  56. RefCount++;
  57. }
  58. /// <summary>
  59. /// 释放(引用计数递减)
  60. /// </summary>
  61. public void Release()
  62. {
  63. RefCount--;
  64. }
  65. /// <summary>
  66. /// 轮询更新
  67. /// </summary>
  68. public abstract void Update();
  69. /// <summary>
  70. /// 销毁
  71. /// </summary>
  72. public void Destroy(bool forceDestroy)
  73. {
  74. IsDestroyed = true;
  75. // Check fatal
  76. if (forceDestroy == false)
  77. {
  78. if (RefCount > 0)
  79. throw new Exception($"Bundle file loader ref is not zero : {MainBundleInfo.Bundle.BundleName}");
  80. if (IsDone() == false)
  81. throw new Exception($"Bundle file loader is not done : {MainBundleInfo.Bundle.BundleName}");
  82. }
  83. if (CacheBundle != null)
  84. {
  85. CacheBundle.Unload(true);
  86. CacheBundle = null;
  87. }
  88. }
  89. /// <summary>
  90. /// 是否完毕(无论成功或失败)
  91. /// </summary>
  92. public bool IsDone()
  93. {
  94. return Status == EStatus.Succeed || Status == EStatus.Failed;
  95. }
  96. /// <summary>
  97. /// 是否可以销毁
  98. /// </summary>
  99. public bool CanDestroy()
  100. {
  101. if (IsDone() == false)
  102. return false;
  103. return RefCount <= 0;
  104. }
  105. /// <summary>
  106. /// 在满足条件的前提下,销毁所有资源提供者
  107. /// </summary>
  108. public void TryDestroyAllProviders()
  109. {
  110. if (IsDone() == false)
  111. return;
  112. // 条件1:必须等待所有Provider可以销毁
  113. foreach (var provider in _providers)
  114. {
  115. if (provider.CanDestroy() == false)
  116. return;
  117. }
  118. // 条件2:除了自己没有其它引用
  119. if (RefCount > _providers.Count)
  120. return;
  121. // 销毁所有Providers
  122. foreach (var provider in _providers)
  123. {
  124. provider.Destroy();
  125. }
  126. // 从列表里移除Providers
  127. AssetSystem.RemoveBundleProviders(_providers);
  128. _providers.Clear();
  129. }
  130. /// <summary>
  131. /// 主线程等待异步操作完毕
  132. /// </summary>
  133. public abstract void WaitForAsyncComplete();
  134. }
  135. }