Unity JSON: есть ли способ, если проигрыватель перейдет к файлу сохранения и испортит файл, способ обнаружить это? - PullRequest
0 голосов
/ 17 февраля 2019

В моем проекте информация о плеере сохраняется в файле JSON.Я шифрую информацию, прежде чем сохранить ее, но если игрок заходит в файл и удаляет один символ файла, когда загружается игра, потому что это зависит от этого файла, игра зависает.У меня действительно так, что новая информация об игроке создается, если файл не обнаружен, но если файл есть, и они связываются с ним, есть ли способ обнаружить это и исправить его, прежде чем игра попытается загрузить его.Я использую JSONUtility, встроенную в Unity.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я думаю, что лучше использовать и хеширование, и проверку 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 - используйте любой другой способ (см. комментарии)

0 голосов
/ 18 февраля 2019

Использование try / catch при загрузке файла JSON

        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}'");
    }

Однако это не должно быть так важно.Если игрок пытается возиться с игровыми файлами, и вас беспокоит сбой программы, вам не следует этого делать, потому что этот игрок не должен был редактировать игровые файлы.

...