HandleBase.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using System;
  2. using System.Collections;
  3. namespace YooAsset
  4. {
  5. public abstract class HandleBase : IEnumerator, IDisposable
  6. {
  7. private readonly AssetInfo _assetInfo;
  8. internal ProviderOperation Provider { private set; get; }
  9. internal HandleBase(ProviderOperation provider)
  10. {
  11. Provider = provider;
  12. _assetInfo = provider.MainAssetInfo;
  13. }
  14. internal abstract void InvokeCallback();
  15. /// <summary>
  16. /// 释放资源句柄
  17. /// </summary>
  18. public void Release()
  19. {
  20. if (IsValidWithWarning == false)
  21. return;
  22. Provider.ReleaseHandle(this);
  23. Provider = null;
  24. }
  25. /// <summary>
  26. /// 释放资源句柄
  27. /// </summary>
  28. public void Dispose()
  29. {
  30. this.Release();
  31. }
  32. /// <summary>
  33. /// 获取资源信息
  34. /// </summary>
  35. public AssetInfo GetAssetInfo()
  36. {
  37. return _assetInfo;
  38. }
  39. /// <summary>
  40. /// 获取下载报告
  41. /// </summary>
  42. public DownloadStatus GetDownloadStatus()
  43. {
  44. if (IsValidWithWarning == false)
  45. return DownloadStatus.CreateDefaultStatus();
  46. return Provider.GetDownloadStatus();
  47. }
  48. /// <summary>
  49. /// 当前状态
  50. /// </summary>
  51. public EOperationStatus Status
  52. {
  53. get
  54. {
  55. if (IsValidWithWarning == false)
  56. return EOperationStatus.None;
  57. return Provider.Status;
  58. }
  59. }
  60. /// <summary>
  61. /// 最近的错误信息
  62. /// </summary>
  63. public string LastError
  64. {
  65. get
  66. {
  67. if (IsValidWithWarning == false)
  68. return string.Empty;
  69. return Provider.Error;
  70. }
  71. }
  72. /// <summary>
  73. /// 加载进度
  74. /// </summary>
  75. public float Progress
  76. {
  77. get
  78. {
  79. if (IsValidWithWarning == false)
  80. return 0;
  81. return Provider.Progress;
  82. }
  83. }
  84. /// <summary>
  85. /// 是否加载完毕
  86. /// </summary>
  87. public bool IsDone
  88. {
  89. get
  90. {
  91. if (IsValidWithWarning == false)
  92. return true;
  93. return Provider.IsDone;
  94. }
  95. }
  96. /// <summary>
  97. /// 句柄是否有效
  98. /// </summary>
  99. public bool IsValid
  100. {
  101. get
  102. {
  103. if (Provider != null && Provider.IsDestroyed == false)
  104. return true;
  105. else
  106. return false;
  107. }
  108. }
  109. /// <summary>
  110. /// 句柄是否有效
  111. /// </summary>
  112. internal bool IsValidWithWarning
  113. {
  114. get
  115. {
  116. if (Provider != null && Provider.IsDestroyed == false)
  117. {
  118. return true;
  119. }
  120. else
  121. {
  122. if (Provider == null)
  123. YooLogger.Warning($"Operation handle is released : {_assetInfo.AssetPath}");
  124. else if (Provider.IsDestroyed)
  125. YooLogger.Warning($"Provider is destroyed : {_assetInfo.AssetPath}");
  126. return false;
  127. }
  128. }
  129. }
  130. #region 异步操作相关
  131. /// <summary>
  132. /// 异步操作任务
  133. /// </summary>
  134. public System.Threading.Tasks.Task Task
  135. {
  136. get
  137. {
  138. if (IsValidWithWarning == false)
  139. return null;
  140. return Provider.Task;
  141. }
  142. }
  143. // 协程相关
  144. bool IEnumerator.MoveNext()
  145. {
  146. return !IsDone;
  147. }
  148. void IEnumerator.Reset()
  149. {
  150. }
  151. object IEnumerator.Current
  152. {
  153. get { return Provider; }
  154. }
  155. #endregion
  156. }
  157. }