在Unity Inspector中获取任何类型

时间:2014-12-28 01:16:13

标签: c# serialization unity3d

编辑:添加了更多细节。

我正在为我的游戏开发一个SaveManager系统。基本上它应该做的是什么;

1)通过Drag& Drop获取“ANY”用户创建的Serializable类到检查器。 (保存数据)。

2)使用BinaryFormatter或XMLSerializer将该类写入文件。

我希望能够在未来的游戏中使用它。所以应该保存数据类(类型)独立(如序列化器)。我会像资产一样使用它,导入SaveManager,将序列化类作为参数,然后让它完成其余的工作。但正如我所说,它应该能够使用任何用户创建的序列化类。

所以问题是,因为“序列化类”将由用户在“游戏项目”中编写(而不是在SaveManager项目中),并且我的SaveManager项目中没有“序列化”类类型,我不知道如何制作SaveManager,从检查员引用该类。

所以我想说我在游戏项目中创建了这个类(而不是在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

它将用户创建的类型转换为Object,我失去​​了我需要的类型。

我尝试使用System.Type,但Unity也没有显示它。

基本上我想做的是,将“任何”序列化类作为参考。像

public SerializedClass _SaveData;

或类似

public Script _SaveData;

该引用应该接受“任何”序列化类。获取它的类型,然后将其强制转换为该类型。

当我使用

public Object _SaveData

如果我使用_SaveData.GetType(),我得到“用户创建”的类型。 我有类型,在我手中,但我不能将对象转换为该类型。我不知道如何使用该类型进行铸造。

无论我做什么,它要么不会出现在检查员中,要么被转换为其他类型而我会丢失数据。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

你不能这样做,因为你无法在检查器中拖动[Serializable]类,它在项目管理方面没有代表性。此外,你只能拖动一个实例,而不是类本身。您可以序列化对MonoScript的引用,但这只是编辑器,我不确定它会对您有什么好处。

您可以尝试使用ScriptableObject,甚至在SaveManager项目中提供基本抽象类型,并要求您的游戏项目源于此。

但不管怎样,我不确定我究竟是怎么理解的:一旦你有了你的类型,你会用它做什么?你的游戏仍然需要设置实际数据,决定何时读取/写入数据等,所以你怎么能拖动'''''''''''希望经理能够自己解决问题吗?

我能看到的最好的是你的游戏设置数据,然后调用SaveManager.Save(myData)或.Load(myData),然后你的经理将该实例保存为二进制或XML或其他。

BTW我推荐使用JSON,那里有许多兼容良好的Unity兼容库。二进制文件风险太大(你改变了格式,你可以亲吻你的保存再见,或者享受版本之间转换的麻烦),而且XML太冗长了。