Как сохранить и получить значение из переменной сериализуемого класса? - PullRequest
0 голосов
/ 30 декабря 2018

Мне нужно сохранить значение в моем сериализуемом классе, а затем использовать его в моей функции сохранения в классе JsonCharacterSaver


Сначала я просто использовал Unity и C #, мою базуэто веб-разработчик (каким-то образом это может помочь).


, тогда я получаю следующий код из результатов применения учебника к разделу JSON (https://unity3d.com/learn/tutorials/topics/scripting/introduction-saving-and-loading).


Я читал о сериализации и нескольких страницах соответствующих руководств на странице, предоставленной Unity, но не нашел пути или решения, которые были необходимы. Самая большая проблема - я не знаю, где я нене знаю, и я не знаю, что я должен узнать


nb. извините, если я делаю неправильно с моим форматом вопроса, это мой второй раз, насколько я помню


Ниже мой класс сохранения

using System.IO;
using UnityEngine;

public class JsonCharacterSaver : MonoBehaviour
{
    public CharacterData characterData;
    string dataPath;

    void Start ()
    {
       dataPath = Path.Combine(Application.persistentDataPath, "CharacterData.txt");
    }

    void Update ()
    {
        if(Input.GetKeyDown (KeyCode.S))
          SaveCharacter (characterData, dataPath);
    }

    static void SaveCharacter (CharacterData data, string path)
    {
        string jsonString = JsonUtility.ToJson (data);

        using (StreamWriter streamWriter = File.CreateText (path))
        {
            streamWriter.Write (jsonString);
        }
    }
}

Ниже моя функция addGold

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

public class addGold : MonoBehaviour
{
    public CharacterData characterData;

    public void addinggold()
    {
        this.characterData.golds += 20;
        Debug.Log(this.characterData.golds);
    }
}

Ниже приведен мой сериализуемый класс

using System;

[Serializable]
public class CharacterData
{
    public int golds;
}

1 Ответ

0 голосов
/ 02 января 2019

ну у вас как-то должна быть ссылка между двумя компонентами

Я бы сделал это в JsonCharacterSaver

using System.IO;
using UnityEngine;

public class JsonCharacterSaver : MonoBehaviour
{
    // Here you reference the addGold component in the inspector (drag&drop)
    public addGold addGoldReference;

    string dataPath;

    void Start ()
    {
       dataPath = Path.Combine(Application.persistentDataPath, "CharacterData.txt");
    }

    void Update ()
    {
      if(Input.GetKeyDown (KeyCode.S))
        // Now here use the data from the reference instead
        SaveCharacter (addGoldReference.characterData, dataPath);
    }

    static void SaveCharacter (CharacterData data, string path)
    {
        string jsonString = JsonUtility.ToJson (data);

        using (StreamWriter streamWriter = File.CreateText (path))
        {
            streamWriter.Write (jsonString);
        }
    }
}

И дополнительно для более сложныхнастройки, данные и т. д. вы должны взглянуть на ScritableObjects .

Огромным преимуществом является то, что вы можете сохранить свое значение здесь, а также вести себя соответствующим образом, например, загружая и сохраняя все только в одном скрипте.Вы также можете иметь разные настройки данных и изменять MonoBehaviours, ссылаясь на разные экземпляры ScriptableObject (активы) и т. Д. В вашем случае, например,

[CreateAssetMenu(fileName = "new CharacterData", menuName = "Example/CharacterDataSsset", order = 1)]
public class CharacterData
{
    public int golds;

    public void SaveToFile(string path)
    {
        string jsonString = JsonUtility.ToJson (this);

        using (StreamWriter streamWriter = File.CreateText (path))
        {
            streamWriter.Write (jsonString);
        }
    }
}

Теперь вы создаете новый ресурс CharacterData, щелкнув правой кнопкой мыши вProjectsView (Активы) и в меню найдите Example -> CharacterDataAsset и укажите его (инспектор) в компоненте addGold.

и в JsonCharacterSaver только do

void Update ()
{
  if(Input.GetKeyDown (KeyCode.S))
    // Now here use the data from the reference instead
    addGoldReference.characterData.SaveToFile(dataPath);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...