在我的项目中,我将播放器信息保存到JSON文件中。我在保存之前加密信息但是如果玩家进入文件并且恰好删除了文件的一个字符,当游戏加载时,因为它依赖于该文件,游戏会冻结。我确实拥有它,以便在没有检测到文件的情况下创建新的播放器信息,但如果文件在那里而且它们搞乱了,有没有办法在游戏尝试加载之前检测并纠正它。我正在使用Unity内置的JSONUtility。
加载JSON文件时使用try / catch
try
{
JsonUtility.FromJSON(...)
}
catch (FileNotFoundException e)
{
Print("The file was not found: '{e}'");
}
catch (DirectoryNotFoundException e)
{
Print("The directory was not found: '{e}'");
}
catch (IOException e)
{
Print("The file could not be opened: '{e}'");
}
但是,这不应该那么重要。如果玩家试图弄乱游戏文件并且您担心程序崩溃,则不应该因为该玩家不应该编辑游戏文件。
我认为使用散列和try / catch检查将是更好的解决方案您可以尝试打开该文件,然后将其散列与您在上一个游戏会话中保存的散列进行比较:
private void LoadSave()
{
try
{
JsonUtility.FromJson("filename", ...);
string oldHash = PlayerPrefs.GetString("importantSaveFileHash");
string newHash = CalculateMd5("filename");
if (oldHash == null || oldHash == newHash)
{
//recalculate hash every time you change the save file
//you can also encrypt this hash for better security
PlayerPrefs.SetString("importantSaveFileHash", newHash);
//RESULT: Save file is cool!
}
else
{
//RESULT: Save file was modified!
}
}
catch (Exception e)
{
//RESULT: broken file
}
}
private static string CalculateMd5(string filename)
{
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
var hash = md5.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
}
顺便说一句,你可以使用PlayerPrefs来存储所有的游戏状态(我知道有时它对于拥有可见和可读的保存文件很重要) - 选择你需要的东西
UPD:在PlayerPrefs中存储游戏状态并不好 - 改用其他方式(阅读评论)