【问题标题】:Unity data type strugglesUnity 数据类型之争
【发布时间】:2018-07-07 10:16:42
【问题描述】:

我目前正在使用 Unity 开发一款游戏,但我很难弄清楚如何管理不同的图块类型。

由于有很多不同类型的图块(容器、提取器、研究设备等),我需要一种以易于扩展的方式保存、加载和访问这些数据的方法。

我的第一个想法是使用继承:例如,作为容器 tile 的所有组件都派生自一个名为 ContainerTile 的类,该类派生自 TileBehaviour。如果玩家破坏了容器瓦片,播放器脚本将检查目标块上是否有任何 TileBehaviour 组件,然后使用破坏函数。如果他想打开一个容器,脚本将使用检查目标块上是否有任何ContainerTIle组件并使用打开功能。

这样做的主要缺陷是保存数据不能以这种方式工作:当将所有 containerTile 数据保存为 TileBehaviour 数据时,它只保存属于 tileBehaviour 类的数据,以及所有其他数据(比如哪些项目在容器)丢失了。

谁能告诉我我应该怎么做?

谢谢。

【问题讨论】:

  • 顺便说一句,我不想​​简单地遍历每一种类型的组件,然后像这样保存/加载数据。
  • 如果你想通过继承使用序列化,你需要使用ScriptableObject(并自己实现更多),例如:answers.unity.com/questions/245604/…

标签: c# unity3d


【解决方案1】:

正如@UnholySheep 在评论中所说,您的代码似乎在乞求ScriptableObject

它们就像MonoBehaviour,但它们不附加到游戏对象(所以,没有变换和东西)。他们可以有检查员并接收一些消息,例如 OnDestroy...

继承对他们来说就像一种魅力。您还可以创建抽象派生类。此外,序列化是内置的。

例如,您定义了一个名为 Tile 的抽象 SerializedObject,然后是其他子类 ContainerTileExtractorTile...

您可以使用自定义参数创建这些类的资产并在组件中引用它们,就像 Prefab 一样,但它们都是同一个对象。或者,您也可以在运行时实例化它们。

它们适用于管理人员(安全单例)、类固醇枚举、纯数据、通过场景/项目传输数据...

我强烈推荐你 this video 了解如何使用它们,当然还有 Unity 自己的教程,比如 thisthis

【讨论】:

  • 我停止了这个项目的开发,但我已经在另一个项目中使用了这个概念,而且效果很好!谢谢大哥!
猜你喜欢
  • 1970-01-01
  • 2019-05-14
  • 2016-10-31
  • 1970-01-01
  • 2015-03-03
  • 2013-11-17
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
相关资源
最近更新 更多