【发布时间】:2014-12-28 01:16:12
【问题描述】:
编辑:添加了更多细节。
我正在为我的游戏开发一个 SaveManager 系统。基本上它应该做的是;
1) 通过拖放到检查器获取“ANY”用户创建的 Serializable 类。 (保存数据)。
2) 使用 BinaryFormatter 或 XMLSerializer 将该类写入文件。
我希望能够在我未来的游戏中使用它。所以它应该独立保存数据类(类型)(如序列化程序)。我会像使用资产一样使用它,导入 SaveManager,将序列化类作为参数,然后让它完成剩下的工作。但正如我所说,它应该能够使用任何用户创建的序列化类。
所以问题是,因为“序列化类”将由用户在“游戏项目”中编写(而不是在 SaveManager 项目中),而我的 SaveManager 项目中没有那种“序列化”类类型,我不知道如何制作SaveManager,从inspector中引用类。
假设我在游戏项目中创建了这个类(而不是在 SaveManager 项目中)
[System.Serializable]
public class SaveData
{
public string Name = "Name";
public int Number = 5;
}
现在,当我将 SaveManager 项目(资产)导入我的“游戏”项目时,我应该能够将脚本拖放到 SaveManager 检查器并让它完成剩下的工作。由于 BinaryFormatter 适用于每个 Serializable 类型,因此类型的名称实际上并不重要。我的意思是 BinaryFormatter 是无类型的,只要类型是可序列化的。我想使用该功能,并让 SaveManager 类型也免费。
所以将来如果我想使用“MyNewSaveData”序列化类,“在另一个游戏中”,我希望能够将它拖放到 SaveManager 检查器并让它完成剩下的工作。
现在问题是,如果我使用
public object _SaveData;
在 SaveManager 脚本中,统一检查器不显示它。
如果我使用
public Object _SaveData
它将用户创建的类型转换为一个对象,我失去了我需要的类型。
我尝试使用 System.Type,但 unity 也没有显示出来。
基本上我想做的是,获取“任何”序列化类作为参考。喜欢
public SerializedClass _SaveData;
或类似的东西
public Script _SaveData;
该引用应该接受“任何”序列化类。获取它的类型,然后将其强制转换为该类型。
当我使用时
public Object _SaveData
如果我使用 _SaveData.GetType(),我会得到“用户创建”的类型。 我手中有这种类型,但我不能将 Object 转换为那种类型。我不知道如何使用该类型进行投射。
无论我做什么,它要么不显示在检查器中,要么转换为另一种类型,我丢失了数据。
我该怎么办?
【问题讨论】:
-
旁注:我怀疑你问的是 Unity3d(游戏框架),而不是 Unity(依赖注入框架)——如果为真,请确保更新标签。
-
当你使用
public Object _SaveData然后你调用_SaveData.GetType()时输出是什么? -
@Ideae 我得到了我想要的类型。但我不知道如何使用它来投射。我试过了;类型类型 = _SaveData.GetType();在这里我得到了类型。但我该如何使用它?我不能使用 (type)_SaveData,没有这样的用法。 Convert.ChangeType(object, type) 也不起作用,因为我无法将 Unity Object 转换为 System object。所以我来了,我手里拿着类型,但没有办法使用它。
-
我只是尝试将它从对象显式转换为对象,并且它起作用了。
object o = _SaveData;只是将它装箱在对象中。您甚至不需要这样做,您应该能够将 Object 直接放入 XMLSerializer Serialize 方法中。事实上,类型根本不是必需的。您唯一需要的是在反序列化(加载游戏)之后重置原始 SaveData 对象所在的引用的方法。 -
之所以这样是因为XMLSerializer中的Deserialize方法总是会创建一个新的对象,如果只是将SaveManager里面的引用重置为Object,它不会更新原来的对象(从你把它拖进去的地方)。因此,您需要另一种方法来重置引用(可能是始终将其保持在同一个位置,或者持有对存储 SaveData 的对象的引用)。
标签: c# serialization unity3d