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

我找到了在Unity3D游戏引擎中保存游戏数据的最佳方法。

首先,我使用序列化对象BinaryFormatter

但是我听说这种方式存在一些问题,不适合保存。

那么,保存游戏状态的最佳或推荐方法是什么?

就我而言,保存格式必须为字节数组。

回答:

但是我听说这种方式存在一些问题,不适合保存。

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

另外,在iOS上,您必须添加,Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER",

"yes");否则会遇到问题BinaryFormatter

最好的保存方式是PlayerPrefsJson。您可以在此处了解如何进行操作。

就我而言,保存格式必须为字节数组

在这种情况下,您可以将其转换为json,然后将json转换stringbytearray。然后File.WriteAllBytes,您可以使用和File.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 players

DataSaver.saveData(saveData, "players");

加载数据:

PlayerInfo loadedData = DataSaver.loadData<PlayerInfo>("players");

if (loadedData == null)

{

return;

}

//Display loaded Data

Debug.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");

以上是 保存游戏状态的最佳方法是什么? 的全部内容, 来源链接: utcz.com/qa/397288.html

回到顶部