如何从可序列化类的变量中存储和获取值?

时间:2018-12-30 12:53:00

标签: unity3d

我需要将值存储到可序列化的类中,而不是将其用于JsonCharacterSaver类的保存功能


首先,我只是使用unity和c#,我的基础是Web开发人员(可能会有所帮助)。


然后从将本教程应用于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 :(得分:0)

好吧,您必须以某种方式在两个组件之间建立引用

我会在 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

巨大的优势是,您可以在这里保存您的价值,并且还具有相应的行为,例如仅在一个脚本上加载和存储所有内容。您还可以设置不同的数据并通过引用不同的ScriptableObject实例(资产)等来更改MonoBehaviours。在您的情况下,例如

[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);
        }
    }
}

现在,通过右键单击ProjectsView(资产)并在菜单中找到Example-> CharacterDataAsset并在{ {1}}组件。

和仅在 JsonCharacterSaver 中使用

addGold