From a36a7cc6d22be1ff246e3c1e7007bcea04e1ab57 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=BD=95=E5=86=A0=E5=B3=B0?= <33317070@qq.com>
Date: Thu, 21 May 2026 17:30:59 +0800
Subject: [PATCH] feat : kuaishou file system support
---
.../Mini Game/Runtime/KuaiShouFileSystem.meta | 8 +++
.../KuaiShouFileSystem/KuaiShouFileSystem.cs | 34 ++++++++++++
.../KuaiShouFileSystem.cs.meta | 11 ++++
.../KuaiShouFileSystem/KuaiShouPlatform.cs | 31 +++++++++++
.../KuaiShouPlatform.cs.meta | 11 ++++
.../Runtime/KuaiShouFileSystem/README.md | 55 +++++++++++++++++++
.../Runtime/KuaiShouFileSystem/README.md.meta | 7 +++
7 files changed, 157 insertions(+)
create mode 100644 Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem.meta
create mode 100644 Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs
create mode 100644 Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs.meta
create mode 100644 Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouPlatform.cs
create mode 100644 Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouPlatform.cs.meta
create mode 100644 Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/README.md
create mode 100644 Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/README.md.meta
diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem.meta b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem.meta
new file mode 100644
index 00000000..ce40302a
--- /dev/null
+++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cb01efe8cc1750a49878ca2be225ba0c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs
new file mode 100644
index 00000000..aefcbfa8
--- /dev/null
+++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs
@@ -0,0 +1,34 @@
+#if UNITY_WEBGL && KUAISHOUMINIGAME
+using YooAsset;
+
+public static class KuaiShouFileSystemCreater
+{
+ public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService)
+ {
+ string fileSystemClass = $"{nameof(KuaiShouFileSystem)},YooAsset.MiniGame";
+ var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot);
+ fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService);
+ return fileSystemParams;
+ }
+ public static FileSystemParameters CreateFileSystemParameters(string packageRoot, IRemoteService remoteService, IBundleDecryptor decryptor)
+ {
+ string fileSystemClass = $"{nameof(KuaiShouFileSystem)},YooAsset.MiniGame";
+ var fileSystemParams = new FileSystemParameters(fileSystemClass, packageRoot);
+ fileSystemParams.AddParameter(EFileSystemParameter.RemoteService, remoteService);
+ fileSystemParams.AddParameter(EFileSystemParameter.AssetbundleDecryptor, decryptor);
+ return fileSystemParams;
+ }
+}
+
+///
+/// 快手小游戏文件系统
+///
+internal class KuaiShouFileSystem : WebGameFileSystem
+{
+ ///
+ protected override IWebGamePlatform CreatePlatform(string packageRoot)
+ {
+ return new KuaiShouPlatform();
+ }
+}
+#endif
diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs.meta b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs.meta
new file mode 100644
index 00000000..44da4f3a
--- /dev/null
+++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouFileSystem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7d27b37f59044ec690f3c407aa125c4a
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouPlatform.cs b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouPlatform.cs
new file mode 100644
index 00000000..b38f6970
--- /dev/null
+++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouPlatform.cs
@@ -0,0 +1,31 @@
+#if UNITY_WEBGL && KUAISHOUMINIGAME
+using UnityEngine;
+using UnityEngine.Networking;
+using YooAsset;
+using KSWASM;
+
+///
+/// 快手小游戏平台实现
+///
+internal class KuaiShouPlatform : IWebGamePlatform
+{
+ ///
+ public UnityWebRequest CreateAssetBundleRequest(string url)
+ {
+ return KSAssetBundle.GetAssetBundle(url);
+ }
+
+ ///
+ public AssetBundle ExtractAssetBundle(UnityWebRequest request)
+ {
+ var downloadHandler = (DownloadHandlerKSAssetBundle)request.downloadHandler;
+ return downloadHandler.assetBundle;
+ }
+
+ ///
+ public void UnloadAssetBundle(AssetBundle assetBundle, bool unloadAll)
+ {
+ assetBundle.KSUnload(unloadAll);
+ }
+}
+#endif
diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouPlatform.cs.meta b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouPlatform.cs.meta
new file mode 100644
index 00000000..a32083cf
--- /dev/null
+++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/KuaiShouPlatform.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 50f0ee9a7d764190a8419e11437074bd
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/README.md b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/README.md
new file mode 100644
index 00000000..f7b161be
--- /dev/null
+++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/README.md
@@ -0,0 +1,55 @@
+# 快手小游戏文件系统
+
+该示例用于在 YooAsset 的 WebGL 运行模式下接入快手小游戏。
+
+参考文档:[快手 Unity/团结 WebGL 小游戏适配方案](https://open.kuaishou.com/miniGameDocs/gameDev/Unity/Basic/Introduction.html)
+
+## 环境要求
+
+先安装快手小游戏 Unity/团结 WebGL 适配 SDK,并将项目切换到 WebGL 构建目标。
+
+在 WebGL Player 的 Scripting Define Symbols 中启用以下宏:
+
+- `KUAISHOUMINIGAME`
+
+该宏是 YooAsset 快手小游戏示例约定的编译开关,用于和其它小游戏平台适配代码保持一致。
+
+如果启用宏后编译提示找不到 `KSWASM`、`KSAssetBundle` 或 `DownloadHandlerKSAssetBundle`,请确认快手 SDK 已导入,并将快手 SDK 的程序集引用添加到 `YooAsset.MiniGame.asmdef`。
+
+## 初始化 YooAsset
+
+在快手小游戏构建中初始化 `WebPlayModeOptions` 时,使用 `KuaiShouFileSystemCreater` 创建文件系统参数。
+
+```csharp
+#if UNITY_WEBGL && KUAISHOUMINIGAME && !UNITY_EDITOR
+var createParameters = new WebPlayModeOptions();
+
+string defaultHostServer = GetHostServerURL();
+string fallbackHostServer = GetHostServerURL();
+string packageRoot = "/__GAME_FILE_CACHE";
+IRemoteService remoteService = new RemoteService(defaultHostServer, fallbackHostServer);
+
+createParameters.WebServerFileSystemParameters =
+ KuaiShouFileSystemCreater.CreateFileSystemParameters(packageRoot, remoteService);
+
+var initializationOperation = package.InitializePackageAsync(createParameters);
+#endif
+```
+
+对当前文件系统来说,`packageRoot` 只需要是一个非空值。快手小游戏底层会对远程 AssetBundle 请求做平台适配,业务侧仍然按照远程异步加载流程使用 YooAsset。
+
+## 资源包命名
+
+快手小游戏构建推荐让资源包文件名携带 hash。YooAsset 推荐只使用 `HashName` 文件命名风格。
+
+`HashName` 会生成纯 hash 文件名,例如:
+
+```text
+8d265a9dfd6cb7669cdb8b726f0afb1e.bundle
+```
+
+该命名方式更适合小游戏平台的缓存和更新识别,也能避免暴露原始 Bundle 名称。快手小游戏构建不建议使用 `BundleName` 或 `BundleName_HashName`。
+
+## 注意事项
+
+加密 AssetBundle 仍然会走 YooAsset 常规的 Web 下载和解密流程。非加密 AssetBundle 会使用快手平台适配器,并通过 `KSAssetBundle.GetAssetBundle` 发起请求。
diff --git a/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/README.md.meta b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/README.md.meta
new file mode 100644
index 00000000..427d3459
--- /dev/null
+++ b/Assets/YooAsset/Samples~/Mini Game/Runtime/KuaiShouFileSystem/README.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 2d2cb0b979f440d28b12c81794662e88
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant: