什么是在 Unity3D 制作的游戏中保存游戏进度的最佳实践,以及适用于 Android 和 iOS 的不同版本

Posted

技术标签:

【中文标题】什么是在 Unity3D 制作的游戏中保存游戏进度的最佳实践,以及适用于 Android 和 iOS 的不同版本【英文标题】:What is best Practice to save Game Progress in a Game made in Unity3D along different Versions for Android and iOS 【发布时间】:2020-07-25 00:10:42 【问题描述】:

为简单的 2D 游戏保存游戏进度的最佳做法是什么?对于“进度”,我的意思是非常简单的值,例如“收集项目的数量”(int)、“highscore”(int)、“amount of currency”(float)和“avatar unlocked”(bool)。没有世界地图状态或任何大的东西要保存。我使用了 playerprefs ,但这是为偏好而设计的,许多专家应该避免使用。这就是我现在想改变它的原因。

我阅读了这个帖子:*** Question,但我无法确定适合我的情况的最佳解决方案,因为没有对建议的方法进行比较。

我的要求很简单:

适用于 iosandroid 发布新版本应用时不会被删除 易于在脚本中使用,因为我们在很多地方都引用了变量

有什么建议吗?

【问题讨论】:

【参考方案1】:

就个人而言,我喜欢直接写入文件。它适用于所有平台,不会在应用更新时删除,并且您可以完全控制访问数据的方式。 轻松添加、删除、编辑内容,轻松处理多种保存状态。

你可以用一个简单的类来做到这一点,比如这个:

public static class FileUtils

    public static void WriteToFile(string fileName, string json)
    
        var path = GetFilePath(fileName);
        var stream = new FileStream(path, FileMode.Create);

        using (var writer = new StreamWriter(stream))
            writer.Write(json);
    

    public static string ReadFromFile(string fileName)
    
        var path = GetFilePath(fileName);
        if (File.Exists(path))
        
            using (var reader = new StreamReader(path))
                return reader.ReadToEnd();
        

        Debug.LogWarning($"fileName not found.");
        return null;
    

    public static string GetFilePath(string fileName)
    
        return Path.Combine(Application.persistentDataPath, fileName);
    

然后,你只需要一个可序列化的类或结构来保存,这里我使用 JSON:

    [Serializable]
    public class UserData
    
        public string userName;
        public string profilePictureRef;

        public UserData(string userName, string profilePictureRef)
        
            this.userName = userName;
            this.profilePictureRef = profilePictureRef;
        
    

    public void SaveUserData(UserData data)
    
        var jsonData = JsonUtility.ToJson(data);
        FileUtils.WriteToFile(_fileName, jsonData);
    

    public void LoadUserData()
    
        var jsonData = FileUtils.ReadFromFile(_fileName);
        _data = JsonUtility.FromJson<UserData>(jsonData);
    

您甚至可以从服务器获取一些 JSON 并将其保存在本地。 也许您会想要“模糊”内容,以便玩家无法手动编辑它们。

【讨论】:

谢谢!所以解决方案是结合 JSON 的二进制文件,对吗?如何“模糊”内容? 是的!请注意,您可以使用任何您想要的格式,只要您可以解析它(XML、CSV、...),但在 Unity 中解析 JSON 非常容易。对于加密部分(“模糊”),由您决定。请注意,拥有强大且防弹的东西真的很复杂。在大多数情况下,如果玩家想在单人游戏中作弊以在 9999 处获得假高分,那是没有用的?不是最糟糕的麻烦。如果确实需要,可以使用 AES、XOR 加密等加密,甚至是一些自制方法。问题是用于解密的密钥将存储在您编译的程序集中......

以上是关于什么是在 Unity3D 制作的游戏中保存游戏进度的最佳实践,以及适用于 Android 和 iOS 的不同版本的主要内容,如果未能解决你的问题,请参考以下文章

Unity3d中制作Loading场景进度条所遇到的问题 LoadLevelAsync,AsyncOperation

如何使用unity3D制作游戏

[Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

unity场景制作方式?

Python 或 Pygame 可以创建单独的文件以保存游戏进度吗?

Unity将来时:IL2CPP是什么?