接入指南 API 工具 其他

Unity WebGL 资源缓存系统

一、系统概览

本资源缓存系统专为 AssetBundle 资源设计,支持自动缓存、加载和版本控制。 开发者无需关心资源来自网络或缓存,只需使用以下 Unity API 发起请求:

  • UnityWebRequest
  • UnityWebRequestAssetBundle
  • Addressables
  • WWW

二、运作原理

系统根据配置判断资源是否可缓存,并采用 LRU 策略管理本地存储。整体流程如下:


三、缓存配置说明

配置项说明
enabled是否启用缓存,默认为 true
cdn缓存的资源根路径(必填),例如:https://localhost:8080/StreamingAssets
bundlePathIdentifier缓存路径标识,多个路径用 ; 分隔,例如:WebGL/bundles,则请求 URL 在 {cdn}/WebGL/bundles 之下才判断缓存。默认为空(代表所有路径都判断缓存)
bundleHashLength资源文件名中的哈希长度,Unity 默认生成 32 位
excludeFileExtensions不参与缓存的文件后缀,多个后缀用 ; 分隔,默认值 .json;.hash
defaultReleaseSize超限时默认清理缓存大小(单位 MB),默认 30MB

示例配置

{
  "disableBundleCache": false,
  "gameCDNRoot": "https://localhost:8080/StreamingAssets",
  "bundlePathIdentifier": "StreamingAssets",
  "excludeFileExtensions": ".json;.hash",
  "bundleHashLength": 32,
  "defaultReleaseSize": 30
}

四、命名规则

符合以下格式的资源才可缓存:

  • hash:如 8d265a9dfd6cb7669cdb8b726f0afb1e
  • name_hash:如 font_8d265a9dfd6cb7669cdb8b726f0afb1e
  • name-hash:如 font-8d265a9dfd6cb7669cdb8b726f0afb1e

可添加后缀,例如 .bundle.ttf,不影响识别。


五、使用示例

示例场景

  • 请求资源:https://localhost:8080/StreamingAssets/asset1-8d26...afb1e
  • 缓存中已有旧版本:asset1-71b2...659f

1. UnityWebRequest

private IEnumerator LoadAssetBundle() {
    var uwr = UnityWebRequest.Get("https://localhost:8080/StreamingAssets/asset1-8d26...");
    yield return uwr.SendWebRequest();
    var bytes = uwr.downloadHandler.data;
    var assetBundle = AssetBundle.LoadFromMemory(bytes);
}

2. UnityWebRequestAssetBundle

private IEnumerator LoadAssetBundle() {
    var uwr = UnityWebRequestAssetBundle.Get("https://localhost:8080/StreamingAssets/asset1-8d26...");
    yield return uwr.SendWebRequest();
    var assetBundle = DownloadHandlerAssetBundle.GetContent(uwr);
}

3. Addressables

使用前需在联盟配置面板勾选 使用Addressable(?) 并填写 URL(?),否则将无法正常加载 catalog.hashcatalog.json

在 Addressables 配置中需要注意在 Advanced Options -> Bundle Naming Mode 中选择 Append Hash to Filename,构建的 Bundle 文件名才符合缓存策略,配置示意如下

Addressables Profiles Addressables Groups

private async void LoadAddressableAsset() {
    var handle = Addressables.LoadAssetAsync<GameObject>("asset1");
    await handle.Task;
    var prefab = handle.Result;
}

asset1 会被映射为带 hash 的实际资源名,使用 Addressables 不需显式拼接 URL。


六、缓存流程说明

  1. 请求 URL 匹配配置的 cdnbundlePathIdentifier
  2. 检测资源名是否符合命名规则,提取 namehash
  3. 若已有相同 name 的旧资源,则清理旧缓存(按 LRU 策略)
  4. 下载新资源,缓存本地,并将内容返回给 Unity 请求逻辑

条匹配 "" 的结果

    没有搜索到与 "" 相关的内容