在移动浏览器上玩Unity webGl游戏时,如何保存游戏数据?

3

通过对音频和纹理数据进行大量优化,我的Unity WebGL游戏可以在移动Web浏览器上运行。在桌面环境下,保存游戏数据运作正常。但是当我在移动浏览器上玩同一款游戏时,似乎没有任何地方保存游戏数据。以下是我本地保存和加载数据的代码。

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;

public class DataAccess
{
    [DllImport ( "__Internal" )]
    private static extern void SyncFiles ( );

    [DllImport ( "__Internal" )]
    private static extern void WindowAlert ( string message );

    public static void Save ( Stats stats )
    {
        string dataPath = string.Format ( "{0}/Stats.dat", Application.persistentDataPath );
        BinaryFormatter binaryFormatter = new BinaryFormatter ( );
        FileStream fileStream;

        try
        {
            if ( File.Exists ( dataPath ) )
            {
                File.WriteAllText ( dataPath, string.Empty );
                fileStream = File.Open ( dataPath, FileMode.Open );
            }
            else
            {
                fileStream = File.Create ( dataPath );
            }

            binaryFormatter.Serialize ( fileStream, stats );
            fileStream.Close ( );

            if ( Application.platform == RuntimePlatform.WebGLPlayer )
            {
                SyncFiles ( );
            }
        }
        catch ( Exception e )
        {
            PlatformSafeMessage ( "Failed to Save: " + e.Message );
        }
    }

    public static Stats Load (Stats stats )
    {
        //Stats stats = null;
        string dataPath = string.Format ( "{0}/Stats.dat", Application.persistentDataPath );

        try
        {
            if ( File.Exists ( dataPath ) )
            {
                BinaryFormatter binaryFormatter = new BinaryFormatter ( );
                FileStream fileStream = File.Open ( dataPath, FileMode.Open );

                stats = ( Stats ) binaryFormatter.Deserialize ( fileStream );
                fileStream.Close ( );
            }
        }
        catch ( Exception e )
        {
            PlatformSafeMessage ( "Failed to Load: " + e.Message );
        }

        return stats;
    }

    private static void PlatformSafeMessage ( string message )
    {
        if ( Application.platform == RuntimePlatform.WebGLPlayer )
        {
            WindowAlert ( message );
        }
        else
        {
            Debug.Log ( message );
        }
    }
}

有人知道这个能做到吗?如果可以,怎么做?


当你说webGL vs. Desktop时,你是指它可以在独立构建中工作吗?在编辑器中?在桌面浏览器上的webGL?我还会附上你当前的保存代码以帮助澄清你正在做什么。 - TEEBQNE
1
还有,你的目标是什么?Unity WebGL不支持移动设备 - TEEBQNE
对于客户端,我使用了Babylon JS和Unity作为移动浏览器游戏的工具包框架:https://doc.babylonjs.com/extensions/Unity/Intro - i773
@TEEBQNE,WebGL游戏已经构建并上传到服务器。当我们在电脑上的Web浏览器中玩游戏时,它可以完美运行。数据也可以轻松地本地保存。但是,当在移动平台的Web浏览器上玩同样的游戏时,游戏可以运行,但是数据无法本地保存。我的问题是如何在移动浏览器上玩游戏时本地保存数据。 - emorphus
5个回答

5

告诉你的客户

需要注意Unity WebGL内容目前不支持移动设备。

以上内容来自Unity文档。他们所要求的是不可能的。对于极少数可以使用的设备,性能很可能会受到影响,并且大多数功能将无法正常工作。

关于如何在webGL上进行存储,如果您使用Application.PersistentDataPath实现通用的保存/加载解决方案,则数据将保存在位置/idbfs/<md5数据路径哈希值>。这将允许数据在多个会话中保持持久性。它或许可以在移动设备上使用,但我强烈建议您不要这样做。如果您想要制作移动游戏,请制作移动游戏。另一个选择是不使用Unity。


1
将WebGL游戏转换为应用程序会很有益,因为在移动浏览器上玩游戏速度较慢,用户可能会遇到输入延迟。

1
是的,但这正是客户想要的。游戏可以运行,但无法保存数据。 - emorphus
1
你可以使用本地存储。https://developer.mozilla.org/zh-CN/docs/Web/API/Window/localStorage - codenaem
1
请问您能详细说明如何在C#中实现此操作吗? - emorphus

0

你可以从C#中调用JavaScript函数,以便例如使用本地存储。 您必须将它们(脚本)添加到具有.jslib扩展名的“插件”文件夹中。 更多细节请参见:Unity文档。 我尚未在移动设备上测试过此功能,但我认为这应该没有问题。


非常感谢您的回答,尽管已经过去了11个月。由于这个问题,我们放弃了这个项目,但我一定会记住这个问题,为将来的项目做好准备。 - emorphus

0

放过自己吧,使用PlayFab可以避免痛苦。


1
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

0
面对类似的问题,我找到了一个奇怪的解决办法。如果你保存数据然后重新加载场景,进度就会被保存下来。但是如果你只保存进度而不重新加载场景,然后在浏览器中重新加载页面,那么进度就不会被保存。这一切都与在设备上本地保存进度有关。然而,如果你将进度保存到服务器上,那么就不会出现这种奇怪的行为。

因为这个问题,我放弃了在Unity上做这个项目。客户希望游戏只能在浏览器中运行。你使用的是哪个版本的Unity? - emorphus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接