微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 JSON 的帮助下保存列表?

如何解决如何在 JSON 的帮助下保存列表?

大家!

尝试在 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 包含的内容,但仅显示{}

解决方法

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.Toggle 属于 MonoBehaviour 类型,您不能简单地从 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];
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。