c# - Unity 数据类型之争
问题描述
我目前正在 Unity 中开发一款游戏,我很难弄清楚如何管理不同的瓷砖类型。
由于有很多不同类型的图块(容器、提取器、研究设备等),我需要一种以易于扩展的方式保存、加载和访问这些数据的方法。
我的第一个想法是使用继承:例如,作为容器 tile 的所有组件都派生自一个名为 ContainerTile 的类,该类派生自 TileBehaviour。如果玩家破坏了容器瓦片,播放器脚本将检查目标块上是否有任何 TileBehaviour 组件,然后使用破坏函数。如果他想打开一个容器,脚本将使用检查目标块上是否有任何 ContainerTIle 组件并使用打开功能。
这样做的主要缺陷是保存数据不能以这种方式工作:当将所有 containerTile 数据保存为 TileBehaviour 数据时,它只保存属于 tileBehaviour 类的数据以及所有其他数据(例如容器中的哪些项目)丢失了。
有人能告诉我我该怎么做吗?
谢谢。
解决方案
正如@UnholySheep 在评论中所说,看起来您的代码正在乞求ScriptableObject
.
它们就像MonoBehaviour
,但它们没有附加到 GameObject (所以,没有变换和东西)。他们可以有检查员并接收一些消息,例如 OnDestroy...
继承对他们来说就像一种魅力。您还可以创建抽象派生类。此外,序列化是内置的。
例如,您定义一个SerializedObject
名为的抽象,然后定义其他子类,...Tile
ContainerTile
ExtractorTile
您可以使用自定义参数创建这些类的资产并在组件中引用它们,就像 Prefab 一样,但它们都是同一个对象。或者,您也可以在运行时实例化它们。
它们适用于管理人员(安全单例)、类固醇枚举、普通数据、通过场景/项目传输数据......
推荐阅读
- r - 列标题是值如何将其移动到行并分配新的列名?
- php - 在 Nova 中处理自动生成的 UUID
- unit-testing - 如何在测试服务层事务代码时将 jest.spyOn 与 NestJS 一起使用
- python - 无法获取页面python的html
- java - Open-liberty “无法验证服务器是否在 30 秒后启动。” 更改 logDirectory 后
- android - 为什么每次打开我的 Android 应用程序时都会显示我的通知?
- javascript - 用于了解单元格 google sheet 的编辑历史的脚本
- git - git push 不将本地更改提交到远程存储库
- c# - 过滤列表 B 中但不在 A 中的实体
- android - 使用 Url 启动器打开从应用程序到浏览器的外部链接后,有什么方法可以重新启动应用程序