本文内容
- 解决Unity WebGL游戏保存数据到Application.persistentDataPath不生效的问题
问题简述
WebGL游戏保存到Application.persistentDataPath有时不生效。
问题成因
Unity的Application.persistentDataPath在WebGL游戏中会映射至/idbfs/[文件路径的md5哈希值](URL查询字符串前的字符计算md5哈希)
/idbfs是IndexedDB所处文件夹,用于客户端持久化存储文件。但是Unity对IndexedDB的写入并不是立即的,而是不可预知的(详见相关官方文档)。因此如果用户在保存后立刻刷新页面,这次保存往往不会持久化写入到硬盘中。
解决办法
我们需要在保存后显式写入数据到/idbfs中,这需要借助js脚本。
庆幸的是我们可以在Unity编辑器中嵌入js脚本!
注意:js脚本仅在WebGL构建中生效
- 首先在工程的
/Assets/Plugins/
目录下创建一个后缀为.jslib
的文件。 - 打开文件,加入如下JavaScript代码:
mergeInto(LibraryManager.library, {
//刷新数据到IndexedDB
SyncDB: function () {
FS.syncfs(false, function (err) {
if (err) console.log("syncfs error: " + err);
});
}
});
- 在需要使用js脚本的C#代码块中(此处则是负责保存的C#类),加入外部函数声明:
#if UNITY_WEBGL && !UNITY_EDITOR
[DllImport("__Internal")]
private static extern void SyncDB();
#endif
- 在负责保存的C#代码后面加入外部函数调用:
#if UNITY_WEBGL && !UNITY_EDITOR
//刷新数据到IndexedDB
SyncDB();
#endif
这样你的存档就会及时写入到IndexedDB中。