我正在尝试在游戏中实现保存。我把变量的值保存在一个继承自ScriptableObject的类中
public class HealthAndDeathLocaStorage : ScriptableObject
{
[SerializeField]
private float health;
[SerializeField]
private bool death;
public float Health { get => health; set => health = value; }
public bool Death { get => death; set => death = value; }
}
我将此类的一个实例放在视图字典Dictionary<string, ScriptableObject>中。我使用库将此字典序列化为 Json Newtonsoft:
public void Save(object saveObject, string fileName)
{
string strJsonData = JsonConvert.SerializeObject(saveObject);
File.WriteAllText(_filePath + fileName, strJsonData);
}
反序列化后:
public Dictionary<string, ScriptableObject> Load(string fileName)
{
//Чтение из файла
string strJsonData = File.ReadAllText(_filePath + fileName);
return JsonConvert.DeserializeObject<Dictionary<string, ScriptableObject>>(strJsonData);
}
当我从字典中获取对象并尝试将其转换为 HealthAndDeathLocaStorage 类型时:
HealthAndDeathLocaStorage locaStorage = ScriptableObject.CreateInstance<HealthAndDeathLocaStorage>();
locaStorage = (HealthAndDeathLocaStorage) SaveLoadAllComponent.Get(this, "healthAndDeath");
我收到一个错误:Specified cast is not valid。这是一个需要解决的问题。
我读到,由于继承人缺少某些东西,可能会发生这种错误。在实现保存的这个选项之前,我使用了 JsonUtility 实用程序函数(但由于 JsonUtility 不序列化字典,我决定切换到 Newtonsoft 库)。使用 JsonUtility 时,我创建了一个中间类,在其中定义了引发异常的属性的空白,并且已经在继承人中重新定义了所有内容。
public class StoringLocalData : ScriptableObject
{
public virtual float Health
{
set { throw new ArgumentException("У данного объекта не сущетствует свойства Health"); }
get { throw new FieldAccessException("У данного объекта не сущетствует свойства Health"); }
}
public virtual bool tDeath
{
set { throw new ArgumentException("У данного объекта не сущетствует свойства Death"); }
get { throw new FieldAccessException("У данного объекта не сущетствует свойства Death"); }
}
}
但
- 这种方法在我看来是一根拐杖;
- 在此实现中,具有中间类的选项不起作用。
使用当前的序列化库,异常不会写入pig,当它们被序列化时,会引发这些异常并中断序列化。因此,我尝试制作这样的中间类:
public class LocalStorage : ScriptableObject
{
[SerializeField]
private float health;
[SerializeField]
private bool death;
public virtual float Health
{
set;
get;
}
public virtual bool Death
{
set;
get;
}
}
因此,HealthAndDeathLocaStorage 不再继承自 ScriptableObject,而是继承自 LocalStorage。但这并没有解决问题,错误Specified cast is not valid.并没有消失。
感谢 Blackmeser 的提示。
正如 RiotBr3aker 所指出的: HealthAndDeathLocaStorage 不需要从 ScriptableObject 继承(我们删除了相应的继承)。创建了一个类:
可序列化的字典应该相应地是
Dictionary<string, LocalStorage>我们把值放在LocalStorage实例中
带有商店的字典由我在问题中描述的
Save()and方法序列化和存储。Load()