原文链接:https://blog.csdn.net/mkr67n/article/details/127348730
参考链接:https://www.jianshu.com/p/bbe50a720c6c
本文内容
解决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/目录下创建一个后缀为Save.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中。
以上方案webgl打包会报错,
在需要使用js脚本的C#代码块中添加以下引用:
#if UNITY_WEBGL && !UNITY_EDITOR
using System.Runtime.InteropServices;
#endif
打包解决webgl持续化数据保存问题!