如何借助JSON保存列表?
How to save List with help of 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
不能直接序列化数组和列表类型。
你更需要一个像
这样的包装器class
[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];
}
但是请注意,这意味着您应该通过检查器在列表中引用所有要保存状态的切换,而不能简单地在运行时删除或添加条目!
各位!
试图在组合 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
不能直接序列化数组和列表类型。
你更需要一个像
这样的包装器class[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];
}
但是请注意,这意味着您应该通过检查器在列表中引用所有要保存状态的切换,而不能简单地在运行时删除或添加条目!