什么是在 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,但我无法确定适合我的情况的最佳解决方案,因为没有对建议的方法进行比较。
我的要求很简单:
适用于 ios 和 android 发布新版本应用时不会被删除 易于在脚本中使用,因为我们在很多地方都引用了变量有什么建议吗?
【问题讨论】:
【参考方案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游戏开发之异步记载场景并实现进度条读取效果