Сохранение списка ScriptableObject в json - PullRequest
0 голосов
/ 18 февраля 2020

Сценарий My Item

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName ="Newitems",menuName ="Inventory/Items")]
[Serializable]
public class Item : ScriptableObject
{

  new public string name = "New items";  
  //public Sprite Icon = null;      dealt with this later        
  public bool isDefaulet = false;
  ...} 

А вот мой сценарий инвентаризации:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
[Serializable]
public class Inventory : MonoBehaviour
{
   [SerializeField]
public List<Item> items = new List<Item>();
 void Save()
    {
        string json = JsonUtility.ToJson(items);
        Debug.Log(json);
        File.WriteAllText(Application.dataPath + "/saveFile.json", json);
    }
    public void Load()
    {
        string json = File.ReadAllText(Application.dataPath + "/saveFile.json");
        List<Item> List = JsonUtility.FromJson<List<Item>>(json);
        Debug.Log(List);
    }
...
 }

Хорошо, я попробую со спрайтом позже, но при сохранении консоль вернет {} Я понятия не имею, пожалуйста, помогите.

1 Ответ

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

Первым делом, чтобы сохранить ваш сценарий в json, это добавить атрибут класса Serializable для каждого сценария, который вы хотите сериализовать в json.

Но здесь я думаю, что будет сложно сериализовать Значок поля. В json вы действительно можете сохранить только число или строку, и есть ссылка.

Способ сериализации Sprite (или любой ссылки) заключается в сериализации имени или идентификатора объекта. Если вы посмотрите, как единство сериализует сцену, это именно так, как это делается. И затем, когда вы читаете свой json, вы заменяете этот идентификатор своим активом.

В этом может помочь некоторая библиотека json, может помочь NewtonSoft Json. Net, особенно в отношении специальной сериализации для справки, которую я опишу.

Попробуйте сначала без Sprite и добавьте сложности после;)

EDIT

Чтобы быть более точным, я думаю, что лучший способ сделать то, что вы пытаетесь, - это не сериализовать объект ScriptableObject, а вместо этого удерживать класс в скрипте.

class MyScriptable : ScriptableObject
{
    private MySerializableClass data;
}

[Serializable]
class MySerializableClass 
{
    private string name;
    private float data1;
    private float data2;
}

Затем сериализуйте MySerializableClass и используйте имя или поле некоторого идентификатора, чтобы связать каждый экземпляр сценариев с хорошим MySerializableClass:)

...