diff --git a/Assets/YooAsset/Runtime/PatchSystem/Operations/InitializationOperation.cs b/Assets/YooAsset/Runtime/PatchSystem/Operations/InitializationOperation.cs
index 58e4126..a26e0a3 100644
--- a/Assets/YooAsset/Runtime/PatchSystem/Operations/InitializationOperation.cs
+++ b/Assets/YooAsset/Runtime/PatchSystem/Operations/InitializationOperation.cs
@@ -190,6 +190,7 @@ namespace YooAsset
private enum ESteps
{
None,
+ CheckAppFootPrint,
TryLoadCacheManifest,
QueryAppPackageVersion,
CopyAppManifest,
@@ -222,13 +223,28 @@ namespace YooAsset
}
internal override void Start()
{
- _steps = ESteps.TryLoadCacheManifest;
+ _steps = ESteps.CheckAppFootPrint;
}
internal override void Update()
{
if (_steps == ESteps.None || _steps == ESteps.Done)
return;
+ if (_steps == ESteps.CheckAppFootPrint)
+ {
+ var appFootPrint = new AppFootPrint();
+ appFootPrint.Load();
+
+ // 如果水印发生变化,则说明覆盖安装后首次打开游戏
+ if (appFootPrint.IsDirty())
+ {
+ PersistentHelper.DeleteManifestFolder();
+ appFootPrint.Coverage();
+ YooLogger.Log("Delete manifest files when application foot print dirty !");
+ }
+ _steps = ESteps.TryLoadCacheManifest;
+ }
+
if (_steps == ESteps.TryLoadCacheManifest)
{
if (PersistentHelper.CheckCacheManifestFileExists(_packageName))
@@ -341,6 +357,57 @@ namespace YooAsset
}
+ ///
+ /// 应用程序水印
+ ///
+ internal class AppFootPrint
+ {
+ private string _footPrint;
+
+ ///
+ /// 读取应用程序水印
+ ///
+ public void Load()
+ {
+ string footPrintFilePath = PersistentHelper.GetAppFootPrintFilePath();
+ if (File.Exists(footPrintFilePath))
+ {
+ _footPrint = FileUtility.ReadAllText(footPrintFilePath);
+ }
+ else
+ {
+ Coverage();
+ }
+ }
+
+ ///
+ /// 检测水印是否发生变化
+ ///
+ public bool IsDirty()
+ {
+#if UNITY_EDITOR
+ return _footPrint != Application.version;
+#else
+ return _footPrint != Application.buildGUID;
+#endif
+ }
+
+ ///
+ /// 覆盖掉水印
+ ///
+ public void Coverage()
+ {
+#if UNITY_EDITOR
+ _footPrint = Application.version;
+#else
+ _footPrint = Application.buildGUID;
+#endif
+ string footPrintFilePath = PersistentHelper.GetAppFootPrintFilePath();
+ FileUtility.CreateFile(footPrintFilePath, _footPrint);
+ YooLogger.Log($"Save application foot print : {_footPrint}");
+ }
+ }
+
///
/// 内置补丁清单版本查询器
///
diff --git a/Assets/YooAsset/Runtime/Utility/YooHelper.cs b/Assets/YooAsset/Runtime/Utility/YooHelper.cs
index f7d7027..030f037 100644
--- a/Assets/YooAsset/Runtime/Utility/YooHelper.cs
+++ b/Assets/YooAsset/Runtime/Utility/YooHelper.cs
@@ -84,6 +84,8 @@ namespace YooAsset
internal static class PersistentHelper
{
private const string CacheFolderName = "CacheFiles";
+ private const string ManifestFolderName = "ManifestFiles";
+ private const string AppFootPrintFileName = "ApplicationFootPrint.bytes";
///
/// 删除沙盒总目录
@@ -105,6 +107,16 @@ namespace YooAsset
Directory.Delete(root, true);
}
+ ///
+ /// 删除沙盒内的清单文件夹
+ ///
+ public static void DeleteManifestFolder()
+ {
+ string root = PathHelper.MakePersistentLoadPath(ManifestFolderName);
+ if (Directory.Exists(root))
+ Directory.Delete(root, true);
+ }
+
///
/// 获取缓存文件夹路径
///
@@ -114,6 +126,14 @@ namespace YooAsset
return $"{root}/{packageName}";
}
+ ///
+ /// 获取应用程序的水印文件路径
+ ///
+ public static string GetAppFootPrintFilePath()
+ {
+ return PathHelper.MakePersistentLoadPath(AppFootPrintFileName);
+ }
+
#region 沙盒内清单相关
///
/// 获取沙盒内清单文件的路径
@@ -121,7 +141,7 @@ namespace YooAsset
public static string GetCacheManifestFilePath(string packageName)
{
string fileName = YooAssetSettingsData.GetPatchManifestFileNameWithoutVersion(packageName);
- return PathHelper.MakePersistentLoadPath(fileName);
+ return PathHelper.MakePersistentLoadPath($"{ManifestFolderName}/{fileName}");
}
///