为了账号安全,请及时绑定邮箱和手机立即绑定

保存游戏状态的最佳方法是什么?

/ 猿问

保存游戏状态的最佳方法是什么?

慕雪6173905 2019-06-03 17:24:36

保存游戏状态的最佳方法是什么?

我发现最好的方式保存游戏数据在Unity3D游戏引擎。
首先,我使用BinaryFormatter.

但我听说这种方式有一些问题,不适合储蓄。
那么,保存游戏状态的最佳或推荐方法是什么?

在我的例子中,保存格式必须是字节数组。


查看完整描述

1 回答

?
守着星空守着你

但我听说这种方式有一些问题,不适合储蓄。

没错。在某些设备上,存在一些问题BinaryFormatter..当您更新或更改类时,情况会变得更糟。由于类不再匹配,您的旧设置可能会丢失。有时,由于这个原因,在读取保存的数据时会出现异常。

另外,在IOS上,您必须添加Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");否则你会有问题的BinaryFormatter.

保存的最好方法是用PlayerPrefsJson..你可以学会怎么做这里.

在我的例子中,保存格式必须是字节数组。

在本例中,您可以将其转换为json,然后转换json。stringbyte阵列。然后你可以用File.WriteAllBytesFile.ReadAllBytes若要保存和读取字节数组,请执行以下操作。

下面是一个可以用来保存数据的泛型类。几乎和.一样这,这个但它确实使用PlayerPrefs..它使用文件保存json数据。

DataSaver班级:

public class DataSaver{
    //Save Data
    public static void saveData<T>(T dataToSave, string dataFileName)
    {
        string tempPath = Path.Combine(Application.persistentDataPath, "data");
        tempPath = Path.Combine(tempPath, dataFileName + ".txt");

        //Convert To Json then to bytes
        string jsonData = JsonUtility.ToJson(dataToSave, true);
        byte[] jsonByte = Encoding.ASCII.GetBytes(jsonData);

        //Create Directory if it does not exist
        if (!Directory.Exists(Path.GetDirectoryName(tempPath)))
        {
            Directory.CreateDirectory(Path.GetDirectoryName(tempPath));
        }
        //Debug.Log(path);

        try
        {
            File.WriteAllBytes(tempPath, jsonByte);
            Debug.Log("Saved Data to: " + tempPath.Replace("/", "\\"));
        }
        catch (Exception e)
        {
            Debug.LogWarning("Failed To PlayerInfo Data to: " + tempPath.Replace("/", "\\"));
            Debug.LogWarning("Error: " + e.Message);
        }
    }

    //Load Data
    public static T loadData<T>(string dataFileName)
    {
        string tempPath = Path.Combine(Application.persistentDataPath, "data");
        tempPath = Path.Combine(tempPath, dataFileName + ".txt");

        //Exit if Directory or File does not exist
        if (!Directory.Exists(Path.GetDirectoryName(tempPath)))
        {
            Debug.LogWarning("Directory does not exist");
            return default(T);
        }

        if (!File.Exists(tempPath))
        {
            Debug.Log("File does not exist");
            return default(T);
        }

        //Load saved Json
        byte[] jsonByte = null;
        try
        {
            jsonByte = File.ReadAllBytes(tempPath);
            Debug.Log("Loaded Data from: " + tempPath.Replace("/", "\\"));
        }
        catch (Exception e)
        {
            Debug.LogWarning("Failed To Load Data from: " + tempPath.Replace("/", "\\"));
            Debug.LogWarning("Error: " + e.Message);
        }

        //Convert to json string
        string jsonData = Encoding.ASCII.GetString(jsonByte);

        //Convert to Object
        object resultValue = JsonUtility.FromJson<T>(jsonData);
        return (T)Convert.ChangeType(resultValue, typeof(T));
    }

    public static bool deleteData(string dataFileName)
    {
        bool success = false;

        //Load Data
        string tempPath = Path.Combine(Application.persistentDataPath, "data");
        tempPath = Path.Combine(tempPath, dataFileName + ".txt");

        //Exit if Directory or File does not exist
        if (!Directory.Exists(Path.GetDirectoryName(tempPath)))
        {
            Debug.LogWarning("Directory does not exist");
            return false;
        }

        if (!File.Exists(tempPath))
        {
            Debug.Log("File does not exist");
            return false;
        }

        try
        {
            File.Delete(tempPath);
            Debug.Log("Data deleted from: " + tempPath.Replace("/", "\\"));
            success = true;
        }
        catch (Exception e)
        {
            Debug.LogWarning("Failed To Delete Data: " + e.Message);
        }

        return success;
    }}

使用:

要保存的示例类:

[Serializable]public class PlayerInfo{
    public List<int> ID = new List<int>();
    public List<int> Amounts = new List<int>();
    public int life = 0;
    public float highScore = 0;}

保存数据:

PlayerInfo saveData = new PlayerInfo();saveData.life = 99;saveData.highScore = 40;
//Save data from PlayerInfo to a file named playersDataSaver.saveData(saveData, "players");

负载数据:

PlayerInfo loadedData = DataSaver.loadData<PlayerInfo>("players");if (loadedData == null){
    return;}//Display loaded DataDebug.Log("Life: " + loadedData.life);
    Debug.Log("High Score: " + loadedData.highScore);for (int i = 0; i < loadedData.ID.Count; i++){
    Debug.Log("ID: " + loadedData.ID[i]);}for (int i = 0; i < loadedData.Amounts.Count; i++){
    Debug.Log("Amounts: " + loadedData.Amounts[i]);}

删除数据:

DataSaver.deleteData("players");


查看完整回答
反对 回复 2019-06-03

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信