【问题标题】:Getting any type in Unity Inspector在 Unity Inspector 中获取任何类型
【发布时间】: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


【解决方案1】:

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

您应该尝试使用 ScriptableObject,或者甚至在您的 SaveManager 项目中提供一个基本抽象类型,并要求您的游戏项目从中派生。

但无论哪种方式,我都不确定我是否完全理解您想要如何进行:一旦您有了自己的类型,您将如何处理它?您的游戏仍然需要设置实际数据,决定何时读取/写入该数据等,所以您怎么能只是拖放并期望经理自己解决所有问题?

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

顺便说一句,我推荐 JSON,那里有很多很好的 Unity 兼容库。二进制太冒险了(你改变格式就可以告别你的存档,或者享受版本之间转换的麻烦),而且 XML 太冗长。

【讨论】:

    猜你喜欢
    • 2022-07-22
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    相关资源
    最近更新 更多