HandleBase.cs 3.8 KB

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