using System; using System.Collections; namespace YooAsset { public abstract class HandleBase : IEnumerator, IDisposable { private readonly AssetInfo _assetInfo; internal ProviderOperation Provider { private set; get; } internal HandleBase(ProviderOperation provider) { Provider = provider; _assetInfo = provider.MainAssetInfo; } internal abstract void InvokeCallback(); /// /// 释放资源句柄 /// public void Release() { if (IsValidWithWarning == false) return; Provider.ReleaseHandle(this); Provider = null; } /// /// 释放资源句柄 /// public void Dispose() { this.Release(); } /// /// 获取资源信息 /// public AssetInfo GetAssetInfo() { return _assetInfo; } /// /// 获取下载报告 /// public DownloadStatus GetDownloadStatus() { if (IsValidWithWarning == false) return DownloadStatus.CreateDefaultStatus(); return Provider.GetDownloadStatus(); } /// /// 当前状态 /// public EOperationStatus Status { get { if (IsValidWithWarning == false) return EOperationStatus.None; return Provider.Status; } } /// /// 最近的错误信息 /// public string LastError { get { if (IsValidWithWarning == false) return string.Empty; return Provider.Error; } } /// /// 加载进度 /// public float Progress { get { if (IsValidWithWarning == false) return 0; return Provider.Progress; } } /// /// 是否加载完毕 /// public bool IsDone { get { if (IsValidWithWarning == false) return true; return Provider.IsDone; } } /// /// 句柄是否有效 /// public bool IsValid { get { if (Provider != null && Provider.IsDestroyed == false) return true; else return false; } } /// /// 句柄是否有效 /// internal bool IsValidWithWarning { get { if (Provider != null && Provider.IsDestroyed == false) { return true; } else { if (Provider == null) YooLogger.Warning($"Operation handle is released : {_assetInfo.AssetPath}"); else if (Provider.IsDestroyed) YooLogger.Warning($"Provider is destroyed : {_assetInfo.AssetPath}"); return false; } } } #region 异步操作相关 /// /// 异步操作任务 /// public System.Threading.Tasks.Task Task { get { if (IsValidWithWarning == false) return null; return Provider.Task; } } // 协程相关 bool IEnumerator.MoveNext() { return !IsDone; } void IEnumerator.Reset() { } object IEnumerator.Current { get { return Provider; } } #endregion } }