如何借助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];
}

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

相关内容

  • 没有找到相关文章

最新更新