using System; using System.Collections; namespace YooAsset { public abstract class OperationHandleBase : IEnumerator { private readonly AssetInfo _assetInfo; internal ProviderBase Provider { private set; get; } internal OperationHandleBase(ProviderBase provider) { Provider = provider; _assetInfo = provider.MainAssetInfo; } internal abstract void InvokeCallback(); /// /// 获取资源信息 /// public AssetInfo GetAssetInfo() { return _assetInfo; } /// /// 获取下载报告 /// public DownloadReport GetDownloadReport() { if (IsValidWithWarning == false) { return DownloadReport.CreateDefaultReport(); } return Provider.GetDownloadReport(); } /// /// 当前状态 /// public EOperationStatus Status { get { if (IsValidWithWarning == false) return EOperationStatus.None; if (Provider.Status == ProviderBase.EStatus.Failed) return EOperationStatus.Failed; else if (Provider.Status == ProviderBase.EStatus.Succeed) return EOperationStatus.Succeed; else return EOperationStatus.None; } } /// /// 最近的错误信息 /// public string LastError { get { if (IsValidWithWarning == false) return string.Empty; return Provider.LastError; } } /// /// 加载进度 /// public float Progress { get { if (IsValidWithWarning == false) return 0; return Provider.Progress; } } /// /// 是否加载完毕 /// public bool IsDone { get { if (IsValidWithWarning == false) return false; 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; } } } /// /// 释放句柄 /// internal void ReleaseInternal() { if (IsValidWithWarning == false) return; Provider.ReleaseHandle(this); Provider = null; } #region 异步操作相关 /// /// 异步操作任务 /// public System.Threading.Tasks.Task Task { get { return Provider.Task; } } // 协程相关 bool IEnumerator.MoveNext() { return !IsDone; } void IEnumerator.Reset() { } object IEnumerator.Current { get { return Provider; } } #endregion } }