123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- namespace YooAsset
- {
- /// <summary>
- /// 向远端请求并更新清单
- /// </summary>
- public abstract class UpdatePackageManifestOperation : AsyncOperationBase
- {
- /// <summary>
- /// 保存当前清单的版本,用于下次启动时自动加载的版本。
- /// </summary>
- public virtual void SavePackageVersion() { }
- }
- /// <summary>
- /// 编辑器下模拟运行的更新清单操作
- /// </summary>
- internal sealed class EditorPlayModeUpdatePackageManifestOperation : UpdatePackageManifestOperation
- {
- public EditorPlayModeUpdatePackageManifestOperation()
- {
- }
- internal override void Start()
- {
- Status = EOperationStatus.Succeed;
- }
- internal override void Update()
- {
- }
- }
- /// <summary>
- /// 离线模式的更新清单操作
- /// </summary>
- internal sealed class OfflinePlayModeUpdatePackageManifestOperation : UpdatePackageManifestOperation
- {
- public OfflinePlayModeUpdatePackageManifestOperation()
- {
- }
- internal override void Start()
- {
- Status = EOperationStatus.Succeed;
- }
- internal override void Update()
- {
- }
- }
- /// <summary>
- /// 联机模式的更新清单操作
- /// 注意:优先加载沙盒里缓存的清单文件,如果缓存没找到就下载远端清单文件,并保存到本地。
- /// </summary>
- internal sealed class HostPlayModeUpdatePackageManifestOperation : UpdatePackageManifestOperation
- {
- private enum ESteps
- {
- None,
- CheckActiveManifest,
- TryLoadCacheManifest,
- DownloadManifest,
- LoadCacheManifest,
- CheckDeserializeManifest,
- Done,
- }
- private readonly HostPlayModeImpl _impl;
- private readonly string _packageName;
- private readonly string _packageVersion;
- private readonly bool _autoSaveVersion;
- private readonly int _timeout;
- private LoadCacheManifestOperation _tryLoadCacheManifestOp;
- private LoadCacheManifestOperation _loadCacheManifestOp;
- private DownloadManifestOperation _downloadManifestOp;
- private ESteps _steps = ESteps.None;
- internal HostPlayModeUpdatePackageManifestOperation(HostPlayModeImpl impl, string packageName, string packageVersion, bool autoSaveVersion, int timeout)
- {
- _impl = impl;
- _packageName = packageName;
- _packageVersion = packageVersion;
- _autoSaveVersion = autoSaveVersion;
- _timeout = timeout;
- }
- internal override void Start()
- {
- _steps = ESteps.CheckActiveManifest;
- }
- internal override void Update()
- {
- if (_steps == ESteps.None || _steps == ESteps.Done)
- return;
- if (_steps == ESteps.CheckActiveManifest)
- {
- // 检测当前激活的清单对象
- if (_impl.ActiveManifest != null && _impl.ActiveManifest.PackageVersion == _packageVersion)
- {
- _steps = ESteps.Done;
- Status = EOperationStatus.Succeed;
- }
- else
- {
- _steps = ESteps.TryLoadCacheManifest;
- }
- }
- if (_steps == ESteps.TryLoadCacheManifest)
- {
- if (_tryLoadCacheManifestOp == null)
- {
- _tryLoadCacheManifestOp = new LoadCacheManifestOperation(_packageName, _packageVersion);
- OperationSystem.StartOperation(_tryLoadCacheManifestOp);
- }
- if (_tryLoadCacheManifestOp.IsDone == false)
- return;
- if (_tryLoadCacheManifestOp.Status == EOperationStatus.Succeed)
- {
- _impl.ActiveManifest = _tryLoadCacheManifestOp.Manifest;
- if (_autoSaveVersion)
- SavePackageVersion();
- _steps = ESteps.Done;
- Status = EOperationStatus.Succeed;
- }
- else
- {
- _steps = ESteps.DownloadManifest;
- }
- }
- if (_steps == ESteps.DownloadManifest)
- {
- if (_downloadManifestOp == null)
- {
- _downloadManifestOp = new DownloadManifestOperation(_impl.RemoteServices, _packageName, _packageVersion, _timeout);
- OperationSystem.StartOperation(_downloadManifestOp);
- }
- if (_downloadManifestOp.IsDone == false)
- return;
- if (_downloadManifestOp.Status == EOperationStatus.Succeed)
- {
- _steps = ESteps.LoadCacheManifest;
- }
- else
- {
- _steps = ESteps.Done;
- Status = EOperationStatus.Failed;
- Error = _downloadManifestOp.Error;
- }
- }
- if (_steps == ESteps.LoadCacheManifest)
- {
- if (_loadCacheManifestOp == null)
- {
- _loadCacheManifestOp = new LoadCacheManifestOperation(_packageName, _packageVersion);
- OperationSystem.StartOperation(_loadCacheManifestOp);
- }
- if (_loadCacheManifestOp.IsDone == false)
- return;
- if (_loadCacheManifestOp.Status == EOperationStatus.Succeed)
- {
- _impl.ActiveManifest = _loadCacheManifestOp.Manifest;
- if (_autoSaveVersion)
- SavePackageVersion();
- _steps = ESteps.Done;
- Status = EOperationStatus.Succeed;
- }
- else
- {
- _steps = ESteps.Done;
- Status = EOperationStatus.Failed;
- Error = _loadCacheManifestOp.Error;
- }
- }
- }
- public override void SavePackageVersion()
- {
- _impl.FlushManifestVersionFile();
- }
- }
- }
|