using System; using System.Collections; using System.Collections.Generic; namespace YooAsset { /// /// 预取清单操作,用于提前加载指定版本的资源清单。 /// public sealed class PrefetchManifestOperation : AsyncOperationBase { private enum ESteps { None, CheckParams, CheckActiveManifest, LoadPackageManifest, Done, } private readonly FileSystemHost _host; private readonly PrefetchManifestOptions _options; private FSLoadPackageManifestOperation _loadPackageManifestOp; private PackageManifest _manifest; private ESteps _steps = ESteps.None; internal PrefetchManifestOperation(FileSystemHost host, PrefetchManifestOptions options) { _host = host; _options = options; } /// protected override void InternalStart() { _steps = ESteps.CheckParams; } /// protected override void InternalUpdate() { if (_steps == ESteps.None || _steps == ESteps.Done) return; if (_steps == ESteps.CheckParams) { if (string.IsNullOrEmpty(_options.PackageVersion)) { _steps = ESteps.Done; SetError("Package version is null or empty."); return; } _steps = ESteps.CheckActiveManifest; } if (_steps == ESteps.CheckActiveManifest) { // 检测当前激活的清单对象 if (_host.ActiveManifest != null) { if (_host.ActiveManifest.PackageVersion == _options.PackageVersion) { _manifest = _host.ActiveManifest; _steps = ESteps.Done; SetResult(); return; } } _steps = ESteps.LoadPackageManifest; } if (_steps == ESteps.LoadPackageManifest) { if (_loadPackageManifestOp == null) { var mainFileSystem = _host.GetMainFileSystem(); if (mainFileSystem == null) { _steps = ESteps.Done; SetError("Main file system is null."); return; } var options = new LoadPackageManifestOptions(_options.PackageVersion, _options.Timeout); _loadPackageManifestOp = mainFileSystem.LoadPackageManifestAsync(options.ConvertTo()); _loadPackageManifestOp.StartOperation(); AddChildOperation(_loadPackageManifestOp); } _loadPackageManifestOp.UpdateOperation(); if (_loadPackageManifestOp.IsDone == false) return; if (_loadPackageManifestOp.Status == EOperationStatus.Succeeded) { _manifest = _loadPackageManifestOp.Manifest; _steps = ESteps.Done; SetResult(); } else { _steps = ESteps.Done; SetError(_loadPackageManifestOp.Error); } } } /// /// 创建资源下载器,用于下载指定的资源标签列表关联的资源包文件。 /// /// 资源下载选项 /// 资源下载操作实例 public ResourceDownloaderOperation CreateResourceDownloader(ResourceDownloaderOptions options) { if (Status != EOperationStatus.Succeeded) { YooLogger.LogError($"{nameof(PrefetchManifestOperation)} did not succeed."); return ResourceDownloaderOperation.CreateEmptyDownloader(_host.PackageName); } return _host.CreateResourceDownloader(_manifest, options); } /// /// 创建资源下载器,用于下载指定的资源信息列表依赖的资源包文件。 /// /// 资源包下载选项 /// 资源下载操作实例 public ResourceDownloaderOperation CreateBundleDownloader(BundleDownloaderOptions options) { if (Status != EOperationStatus.Succeeded) { YooLogger.LogError($"{nameof(PrefetchManifestOperation)} did not succeed."); return ResourceDownloaderOperation.CreateEmptyDownloader(_host.PackageName); } return _host.CreateResourceDownloader(_manifest, options); } } }