【Unity记录】问题:WebGL保存文件到Application.persistentDataPath不生效

文章讲述了UnityWebGL游戏中Application.persistentDataPath保存数据不生效的问题原因,提出通过在Unity编辑器中嵌入JavaScript脚本来显式写入数据到IndexedDB,以及如何在C#代码中调用该脚本以确保数据持久化。同时提到了在打包时可能遇到的错误及解决方案。
摘要由CSDN通过智能技术生成

原文链接: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持续化数据保存问题!

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要实现在Unity中以JSON格式写入文件而不覆盖现有内容,您可以使用`StreamWriter`类的构造函数中的第二个参数来指定是否追加内容到文件中。下面是一个示例代码: ```csharp using UnityEngine; using System.IO; public class JsonFileWriter : MonoBehaviour { private string filePath; private void Start() { // 设置要写入的文件路径 filePath = Path.Combine(Application.persistentDataPath, "data.json"); // 创建一个示例的数据对象 DataObject data = new DataObject(); data.name = "John"; data.age = 25; // 将数据转换为JSON格式的字符串 string json = JsonUtility.ToJson(data); // 调用写入文件的方法 WriteToFile(json); } private void WriteToFile(string content) { // 使用StreamWriter打开文件,如果文件不存在则会创建新文件,追加内容到文件末尾 using (StreamWriter writer = new StreamWriter(filePath, true)) { // 写入内容到文件 writer.WriteLine(content); } Debug.Log("文件写入完成!"); } } // 示例数据类 [System.Serializable] public class DataObject { public string name; public int age; } ``` 在上述示例中,通过在`StreamWriter`的构造函数中传入第二个参数`true`,来指定追加内容到文件末尾。这样,每次调用`WriteToFile`方法时,将会将新的JSON字符串追加到文件中,而不会覆盖现有内容。 请注意,为了保证数据的完整性和可读性,建议在写入JSON字符串之前,先读取文件中已有的内容,并进行相应的处理和解析。在实际使用中,您可以根据需求进行适当的修改和扩展。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值