Пустое сохранение в JSON на Unity

154
10 марта 2019, 15:40

Добрый день и прошу простить, но... Что я, черт возьми, делаю не так?
Пытаюсь реализовать простой проектик с разными вариантами сохранениям (JSON, PlayerPrefs, JSON + PlayerPrefs), но с самого начало все идет не так как надо.
Почему файл JSON пуст? Если так и должно быть то не работает загрузка

SaveLoader

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class SaveLoad : MonoBehaviour
{
    private Model model;
    private string path; 
    void Start ()
    {
        path = Path.Combine(Application.dataPath, "Save.json");
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.F5))
            JSONsave();
        else if (Input.GetKeyDown(KeyCode.F6))
            JSONload();
    }
    private void JSONsave()
    {
        model = GetComponent<Model>();
        Debug.Log("HP saver object - " + model.HP);
        Debug.Log("Saver path - " + path);
        var JSON = JsonUtility.ToJson(model, true);
        Debug.Log("Saver string - " + JSON);
        File.WriteAllText(path, JSON);
    } 
    private void JSONload()
    {
        model = JsonUtility.FromJson<Model>(File.ReadAllText(path));
        Debug.Log("HP load - " + model.HP);
    }
}

Скрипт который должен сохраниться

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class Model : MonoBehaviour
{
    [SerializeField] public int HP { get; set; }
    void Start ()
    {
        HP = 3;
    }
}

ArgumentException: Cannot deserialize JSON to new instances of type 'Model.' UnityEngine.JsonUtility.FromJson (System.String json, System.Type type) (at C:/buildslave/unity/build/Modules/JSONSerialize/Public/JsonUtility.bindings.cs:48) UnityEngine.JsonUtility.FromJson[Model] (System.String json) (at C:/buildslave/unity/build/Modules/JSONSerialize/Public/JsonUtility.bindings.cs:33) SaveLoad.JSONload () (at Assets/Scripts/SaveLoad.cs:36) SaveLoad.Update () (at Assets/Scripts/SaveLoad.cs:21)

Answer 1

Вы все делаете верно с сохранением в json, но проблема кроется в том, что нельзя сериализовать свойства. Об этом указано в документации по SerializeField.

То есть, если вы сделаете так:

[Serializable]
public class Model : MonoBehaviour
{
[SerializeField] private int _hp;
public int HP 
{
     get { return _hp;} 
     set { _hp = value;} 
}
void Start ()
{
    HP = 3;
}

то, все должно работать нормально. Чтобы избежать подобных проблем в будущем - проверяйте сериализацию в инспекторе. То есть JsonUtility будет сериализовать класс точно также, как вы будете видеть его в окне Inspector. А если не хотите, чтобы сериализуемое приватное поле было видно в инспекторе, используйте атрибут [HideInInspector]

READ ALSO
какие карты использовать?

какие карты использовать?

Нужно для проекта выбрать наиболее удобные и красивые api/библиотеки карт, которые можно всунуть на форму (WPF/winforms) C#рассматривали 2gis, но получается,...

146
Изменение значений в базе данных

Изменение значений в базе данных

У меня есть формаНа ней есть два ComboBox-а

211
Как заставить работать связку MEF+WPF MVVM

Как заставить работать связку MEF+WPF MVVM

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

223