diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Interface/IPlayMode.cs b/Assets/YooAsset/Runtime/ResourcePackage/Interface/IPlayMode.cs
index ca51c1e1..54548cdf 100644
--- a/Assets/YooAsset/Runtime/ResourcePackage/Interface/IPlayMode.cs
+++ b/Assets/YooAsset/Runtime/ResourcePackage/Interface/IPlayMode.cs
@@ -18,6 +18,11 @@ namespace YooAsset
///
UpdatePackageVersionOperation UpdatePackageVersionAsync(bool appendTimeTicks, int timeout);
+ ///
+ /// 向网络端请求预下载资源版本
+ ///
+ UpdatePrePackageVersionOperation UpdatePrePackageVersionAsync(bool appendTimeTicks, int timeout);
+
///
/// 向网络端请求并更新清单
///
diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/QueryRemotePrePackageVersionOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/QueryRemotePrePackageVersionOperation.cs
new file mode 100644
index 00000000..4bda4ad3
--- /dev/null
+++ b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/QueryRemotePrePackageVersionOperation.cs
@@ -0,0 +1,106 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+namespace YooAsset
+{
+ public class QueryRemotePrePackageVersionOperation : AsyncOperationBase
+ {
+ private enum ESteps
+ {
+ None,
+ DownloadPrePackageVersion,
+ Done,
+ }
+
+ private readonly IRemoteServices _remoteServices;
+ private readonly string _packageName;
+ private readonly bool _appendTimeTicks;
+ private readonly int _timeout;
+ private UnityWebDataRequester _downloader;
+ private ESteps _steps = ESteps.None;
+ private int _requestCount = 0;
+
+ ///
+ /// 汾
+ ///
+ public string PrePackageVersion { private set; get; }
+
+
+ public QueryRemotePrePackageVersionOperation(IRemoteServices remoteServices, string packageName, bool appendTimeTicks, int timeout)
+ {
+ _remoteServices = remoteServices;
+ _packageName = packageName;
+ _appendTimeTicks = appendTimeTicks;
+ _timeout = timeout;
+ }
+ internal override void InternalOnStart()
+ {
+ _requestCount = RequestHelper.GetRequestFailedCount(_packageName, nameof(QueryRemotePrePackageVersionOperation));
+ _steps = ESteps.DownloadPrePackageVersion;
+ }
+ internal override void InternalOnUpdate()
+ {
+ if (_steps == ESteps.None || _steps == ESteps.Done)
+ return;
+
+ if (_steps == ESteps.DownloadPrePackageVersion)
+ {
+ if (_downloader == null)
+ {
+ string fileName = YooAssetSettingsData.GetPrePackageVersionFileName(_packageName);
+ string webURL = GetPackageVersionRequestURL(fileName);
+ YooLogger.Log($"Beginning to request pre package version : {webURL}");
+ _downloader = new UnityWebDataRequester();
+ _downloader.SendRequest(webURL, _timeout);
+ }
+
+ Progress = _downloader.Progress();
+ _downloader.CheckTimeout();
+ if (_downloader.IsDone() == false)
+ return;
+
+ if (_downloader.HasError())
+ {
+ _steps = ESteps.Done;
+ Status = EOperationStatus.Failed;
+ Error = _downloader.GetError();
+ RequestHelper.RecordRequestFailed(_packageName, nameof(QueryRemotePrePackageVersionOperation));
+ }
+ else
+ {
+ PrePackageVersion = _downloader.GetText();
+ if (string.IsNullOrEmpty(PrePackageVersion))
+ {
+ _steps = ESteps.Done;
+ Status = EOperationStatus.Failed;
+ Error = $"Remote package version is empty : {_downloader.URL}";
+ }
+ else
+ {
+ _steps = ESteps.Done;
+ Status = EOperationStatus.Succeed;
+ }
+ }
+
+ _downloader.Dispose();
+ }
+ }
+
+ private string GetPackageVersionRequestURL(string fileName)
+ {
+ string url;
+
+ // ַ
+ if (_requestCount % 2 == 0)
+ url = _remoteServices.GetRemoteMainURL(fileName);
+ else
+ url = _remoteServices.GetRemoteFallbackURL(fileName);
+
+ // URLĩβʱ
+ if (_appendTimeTicks)
+ return $"{url}?{System.DateTime.UtcNow.Ticks}";
+ else
+ return url;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/QueryRemotePrePackageVersionOperation.cs.meta b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/QueryRemotePrePackageVersionOperation.cs.meta
new file mode 100644
index 00000000..022c091c
--- /dev/null
+++ b/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/QueryRemotePrePackageVersionOperation.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 35dd12fbef2e8d54ebf676a7e8c35d23
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operation/UpdatePrePackageVersionOperation.cs b/Assets/YooAsset/Runtime/ResourcePackage/Operation/UpdatePrePackageVersionOperation.cs
new file mode 100644
index 00000000..c188bd0c
--- /dev/null
+++ b/Assets/YooAsset/Runtime/ResourcePackage/Operation/UpdatePrePackageVersionOperation.cs
@@ -0,0 +1,161 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace YooAsset
+{
+ public abstract class UpdatePrePackageVersionOperation : AsyncOperationBase
+ {
+ ///
+ /// Ԥذ汾
+ ///
+ public string PrePackageVersion { protected set; get; }
+ }
+ ///
+ /// ༭ģģʽԶ˰Ԥذ汾
+ ///
+ internal sealed class EditorPlayModeUpdatePrePackageVersionOperation : UpdatePrePackageVersionOperation
+ {
+ internal override void InternalOnStart()
+ {
+ Status = EOperationStatus.Succeed;
+ }
+ internal override void InternalOnUpdate()
+ {
+ }
+ }
+
+ ///
+ /// ģʽԶ˰Ԥذ汾
+ ///
+ internal sealed class OfflinePlayModeUpdatePrePackageVersionOperation : UpdatePrePackageVersionOperation
+ {
+ internal override void InternalOnStart()
+ {
+ Status = EOperationStatus.Succeed;
+ }
+ internal override void InternalOnUpdate()
+ {
+ }
+ }
+
+ ///
+ /// ģʽԶ˰Ԥذ汾
+ ///
+ internal sealed class HostPlayModeUpdatePrePackageVersionOperation : UpdatePrePackageVersionOperation
+ {
+ private enum ESteps
+ {
+ None,
+ QueryRemotePrePackageVersion,
+ Done,
+ }
+
+ private readonly HostPlayModeImpl _impl;
+ private readonly bool _appendTimeTicks;
+ private readonly int _timeout;
+ private QueryRemotePrePackageVersionOperation _queryRemotePrePackageVersionOp;
+ private ESteps _steps = ESteps.None;
+
+ internal HostPlayModeUpdatePrePackageVersionOperation(HostPlayModeImpl impl, bool appendTimeTicks, int timeout)
+ {
+ _impl = impl;
+ _appendTimeTicks = appendTimeTicks;
+ _timeout = timeout;
+ }
+ internal override void InternalOnStart()
+ {
+ _steps = ESteps.QueryRemotePrePackageVersion;
+ }
+ internal override void InternalOnUpdate()
+ {
+ if (_steps == ESteps.None || _steps == ESteps.Done)
+ return;
+
+ if (_steps == ESteps.QueryRemotePrePackageVersion)
+ {
+ if (_queryRemotePrePackageVersionOp == null)
+ {
+ _queryRemotePrePackageVersionOp = new QueryRemotePrePackageVersionOperation(_impl.RemoteServices, _impl.PackageName, _appendTimeTicks, _timeout);
+ OperationSystem.StartOperation(_impl.PackageName, _queryRemotePrePackageVersionOp);
+ }
+
+ if (_queryRemotePrePackageVersionOp.IsDone == false)
+ return;
+
+ if (_queryRemotePrePackageVersionOp.Status == EOperationStatus.Succeed)
+ {
+ PrePackageVersion = _queryRemotePrePackageVersionOp.PrePackageVersion;
+ _steps = ESteps.Done;
+ Status = EOperationStatus.Succeed;
+ }
+ else
+ {
+ _steps = ESteps.Done;
+ Status = EOperationStatus.Failed;
+ Error = _queryRemotePrePackageVersionOp.Error;
+ }
+ }
+ }
+ }
+
+ ///
+ /// WebGLģʽԶ˰Ԥذ汾
+ ///
+ internal sealed class WebPlayModeUpdatePrePackageVersionOperation : UpdatePrePackageVersionOperation
+ {
+ private enum ESteps
+ {
+ None,
+ QueryRemotePackageVersion,
+ Done,
+ }
+
+ private readonly WebPlayModeImpl _impl;
+ private readonly bool _appendTimeTicks;
+ private readonly int _timeout;
+ private QueryRemotePrePackageVersionOperation _queryRemotePrePackageVersionOp;
+ private ESteps _steps = ESteps.None;
+
+ internal WebPlayModeUpdatePrePackageVersionOperation(WebPlayModeImpl impl, bool appendTimeTicks, int timeout)
+ {
+ _impl = impl;
+ _appendTimeTicks = appendTimeTicks;
+ _timeout = timeout;
+ }
+ internal override void InternalOnStart()
+ {
+ _steps = ESteps.QueryRemotePackageVersion;
+ }
+ internal override void InternalOnUpdate()
+ {
+ if (_steps == ESteps.None || _steps == ESteps.Done)
+ return;
+
+ if (_steps == ESteps.QueryRemotePackageVersion)
+ {
+ if (_queryRemotePrePackageVersionOp == null)
+ {
+ _queryRemotePrePackageVersionOp = new QueryRemotePrePackageVersionOperation(_impl.RemoteServices, _impl.PackageName, _appendTimeTicks, _timeout);
+ OperationSystem.StartOperation(_impl.PackageName, _queryRemotePrePackageVersionOp);
+ }
+
+ if (_queryRemotePrePackageVersionOp.IsDone == false)
+ return;
+
+ if (_queryRemotePrePackageVersionOp.Status == EOperationStatus.Succeed)
+ {
+ PrePackageVersion = _queryRemotePrePackageVersionOp.PrePackageVersion;
+ _steps = ESteps.Done;
+ Status = EOperationStatus.Succeed;
+ }
+ else
+ {
+ _steps = ESteps.Done;
+ Status = EOperationStatus.Failed;
+ Error = _queryRemotePrePackageVersionOp.Error;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/ResourcePackage/Operation/UpdatePrePackageVersionOperation.cs.meta b/Assets/YooAsset/Runtime/ResourcePackage/Operation/UpdatePrePackageVersionOperation.cs.meta
new file mode 100644
index 00000000..29130167
--- /dev/null
+++ b/Assets/YooAsset/Runtime/ResourcePackage/Operation/UpdatePrePackageVersionOperation.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d00ac4f9770af3a41a25dbdd53d0beaa
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs
index 159842e3..0b26162f 100644
--- a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs
+++ b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/EditorSimulateModeImpl.cs
@@ -54,6 +54,12 @@ namespace YooAsset
OperationSystem.StartOperation(PackageName, operation);
return operation;
}
+ UpdatePrePackageVersionOperation IPlayMode.UpdatePrePackageVersionAsync(bool appendTimeTicks, int timeout)
+ {
+ var operation = new EditorPlayModeUpdatePrePackageVersionOperation();
+ OperationSystem.StartOperation(PackageName, operation);
+ return operation;
+ }
UpdatePackageManifestOperation IPlayMode.UpdatePackageManifestAsync(string packageVersion, bool autoSaveVersion, int timeout)
{
var operation = new EditorPlayModeUpdatePackageManifestOperation();
diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/HostPlayModeImpl.cs b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/HostPlayModeImpl.cs
index 601f61ec..27467be1 100644
--- a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/HostPlayModeImpl.cs
+++ b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/HostPlayModeImpl.cs
@@ -112,6 +112,12 @@ namespace YooAsset
OperationSystem.StartOperation(PackageName, operation);
return operation;
}
+ UpdatePrePackageVersionOperation IPlayMode.UpdatePrePackageVersionAsync(bool appendTimeTicks, int timeout)
+ {
+ var operation = new HostPlayModeUpdatePrePackageVersionOperation(this, appendTimeTicks, timeout);
+ OperationSystem.StartOperation(PackageName, operation);
+ return operation;
+ }
UpdatePackageManifestOperation IPlayMode.UpdatePackageManifestAsync(string packageVersion, bool autoSaveVersion, int timeout)
{
var operation = new HostPlayModeUpdatePackageManifestOperation(this, packageVersion, autoSaveVersion, timeout);
diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/OfflinePlayModeImpl.cs b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/OfflinePlayModeImpl.cs
index c6d7cc92..aee55d4e 100644
--- a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/OfflinePlayModeImpl.cs
+++ b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/OfflinePlayModeImpl.cs
@@ -69,6 +69,12 @@ namespace YooAsset
OperationSystem.StartOperation(PackageName, operation);
return operation;
}
+ UpdatePrePackageVersionOperation IPlayMode.UpdatePrePackageVersionAsync(bool appendTimeTicks, int timeout)
+ {
+ var operation = new OfflinePlayModeUpdatePrePackageVersionOperation();
+ OperationSystem.StartOperation(PackageName, operation);
+ return operation;
+ }
UpdatePackageManifestOperation IPlayMode.UpdatePackageManifestAsync(string packageVersion, bool autoSaveVersion, int timeout)
{
var operation = new OfflinePlayModeUpdatePackageManifestOperation();
diff --git a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/WebPlayModeImpl.cs b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/WebPlayModeImpl.cs
index de073072..7ac3a3fd 100644
--- a/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/WebPlayModeImpl.cs
+++ b/Assets/YooAsset/Runtime/ResourcePackage/PlayMode/WebPlayModeImpl.cs
@@ -109,6 +109,12 @@ namespace YooAsset
OperationSystem.StartOperation(PackageName, operation);
return operation;
}
+ UpdatePrePackageVersionOperation IPlayMode.UpdatePrePackageVersionAsync(bool appendTimeTicks, int timeout)
+ {
+ var operation = new WebPlayModeUpdatePrePackageVersionOperation(this, appendTimeTicks, timeout);
+ OperationSystem.StartOperation(PackageName, operation);
+ return operation;
+ }
UpdatePackageManifestOperation IPlayMode.UpdatePackageManifestAsync(string packageVersion, bool autoSaveVersion, int timeout)
{
var operation = new WebPlayModeUpdatePackageManifestOperation(this, packageVersion, timeout);
diff --git a/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs b/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs
index 301591fa..9453d9da 100644
--- a/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs
+++ b/Assets/YooAsset/Runtime/ResourcePackage/ResourcePackage.cs
@@ -284,6 +284,16 @@ namespace YooAsset
return _playModeImpl.UpdatePackageVersionAsync(appendTimeTicks, timeout);
}
+ ///
+ /// 向网络端请求预下载资源版本
+ ///
+ /// 在URL末尾添加时间戳
+ /// 超时时间(默认值:3秒)
+ public UpdatePrePackageVersionOperation UpdatePrePackageVersionAsync(bool appendTimeTicks = true, int timeout = 3)
+ {
+ DebugCheckInitialize(false);
+ return _playModeImpl.UpdatePrePackageVersionAsync(appendTimeTicks, timeout);
+ }
///
/// 向网络端请求并更新清单
///
diff --git a/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs b/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs
index 9a897ee0..30f2300a 100644
--- a/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs
+++ b/Assets/YooAsset/Runtime/Settings/YooAssetSettingsData.cs
@@ -71,5 +71,13 @@ namespace YooAsset
{
return $"{Setting.ManifestFileName}_{packageName}.version";
}
+
+ ///
+ /// 获取包裹的预下载版本文件完整名称
+ ///
+ public static string GetPrePackageVersionFileName(string packageName)
+ {
+ return $"{Setting.ManifestFileName}_{packageName}.preversion";
+ }
}
}
\ No newline at end of file