Добрый день и прошу простить, но... Что я, черт возьми, делаю не так?
Пытаюсь реализовать простой проектик с разными вариантами сохранениям (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)
Вы все делаете верно с сохранением в 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]
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Нужно для проекта выбрать наиболее удобные и красивые api/библиотеки карт, которые можно всунуть на форму (WPF/winforms) C#рассматривали 2gis, но получается,...
В своем приложении функцию хочу вынести как расширение, для этого прочитал и попробовал MEF, но нет примеров нормальных по использованию этой...