大家好!
试图在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,而不能在运行时简单地删除或添加条目!