【问题标题】:How to save List with help of JSON?如何在 JSON 的帮助下保存列表?
【发布时间】:2021-01-30 16:12:42
【问题描述】:

大家!

尝试在 JSON 和 PlayerPrefs 组合的帮助下保存我的列表,但遇到了问题。它不会保存我的列表,也不会加载。它只给了我零元素的列表。

代码:

private List<Toggle> _listActiveToggles = new List<Toggle>();

public void Awake()
{
    Load();

    foreach (Toggle toggle in _listActiveToggles)
    {
        toggle.isOn = true;
    }
    
}

public void ChooseUsableBuffs(Toggle toggle)
{
    int level = PlayerPrefs.GetInt("HDD") / 10; 

    if (_listActiveToggles.Any(x => toggle))
    {
        _listActiveToggles.Remove(toggle);
        Debug.Log(_listActiveToggles.Count);
        return;
    }
    
    if (_listActiveToggles.Count >= level)
    {
        _listActiveToggles[0].isOn = false;
        _listActiveToggles.RemoveAt(0);
    }
    _listActiveToggles.Add(toggle);
    Save();
    Debug.Log(_listActiveToggles.Count);
}

public void Save()
{
    PlayerPrefs.SetString("Key" ,JsonUtility.ToJson(_listActiveToggles));
}

public void Load()
{
    _listActiveToggles = JsonUtility.FromJson<List<Toggle>>(PlayerPrefs.GetString("Key"));
}

尝试检查 JSON 包含的内容,结果只显示:{}

【问题讨论】:

    标签: c# unity3d game-development


    【解决方案1】:

    JsonUtility 不能直接序列化数组和列表类型。

    你宁愿需要一个像

    这样的包装类
    [Serializable]
    public class ToggleData
    {
        public List<Toggle> _listActiveToggles = new List<Toggle>();
    }
    
    public ToggleData data;
    

    现在你可以序列化哪个

    var json = JsonUtility.ToJson(Data);
    

    反序列化

    JsonUtility.FromJsonOverwrite(json, data);
    

    但是,在您的具体情况下,我想它无论如何都行不通。 UnityEngine.UI.ToggleMonoBehaviour 类型,你不能简单地从 JSON 中反序列化它们!

    您只能将它们的设置和加载设置存储到现有切换开关中。


    我想实际上将bool 的列表存储到 JSON 并遍历您的切换和列表并执行例如

    using System.Linq;
    
    ...
    
    [Serializable]
    public class ToggleData
    {
        public List<bool> ToggleStates = new List<book>();
    }
    
    public ToggleData data;
    
    [SerializeField] private List<Toggle> _listActiveToggles = new List<Toggle>();
    

    然后通过保存

    data.ToggleStates = _listActiveToggles.Select(t => t.isOn).ToList();
    var json = JsonUtility.ToJson(Data);
    

    并通过反序列化

    JsonUtility.FromJsonOverwrite(json, data); 
    for(var i = 0; i < Mathf.Min(data.ToggleStates.Count, _listActiveToggles.Count); i++)
    {
        _listActiveToggles[i].isOn = data.ToggleStates[i];
    }
    

    但是请注意,这意味着您应该通过 Inspector 在列表中引用您想要保存状态的所有切换,并且不能简单地在运行时删除或添加条目!

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 2015-09-18
      • 1970-01-01
      • 2011-01-26
      相关资源
      最近更新 更多