[翻译]game,data and Entitas
原文地址
许多人问,我们如何让设计师在我们(开发人员)使用Entitas时设计关卡?
对不起,但为了回答这个问题,我必须用到哲学。Entitas背后的主要思想是分离状态和行为。状态基本上是数据表示,所以我想使用这两个术语互换。
我们在游戏中有什么样的数据?
我们可以将数据分为三类。
- 配置。这是开发者/设计者定义的“固定”数据。
- 玩家状态。表示玩家通过多个先前会话的进展。
- 运行时数据。运行时数据是当前会话中正在玩的游戏的结果。
当我们开始一个游戏(或一个关卡),我们采取配置和玩家状态把它变成运行时数据,而不是将被游戏逻辑(模拟)转换。
Entitas将运行时数据表示为实体,将游戏逻辑表示为系统链。
如果我们想让设计师能够在游戏中尝试不同的东西,我们必须定义表达式的配置。
我们如何定义它们?
这完全取决于你的设计师喜欢什么样的工具。
我知道的大多数设计师都喜欢电子表格。然而我也只做模拟游戏。在其他游戏中,你需要更多的空间定义关卡,你需要更好的工具。事实上,Unity Editor本身就是这样一个通过为我们提供创建预制件的可能性的工具。如果我们考虑它,Unity预制和Unity场景只是配置文件。当我们打游戏时,Unity会将此配置转换为运行时数据,并且单行为将开始对此运行时数据进行操作。当我们打游戏时,Unity会将此配置转换为运行时数据,并且mono behaviours将开始对此运行时数据进行操作。
通过使用Entitas,我们创建平行运行时数据。主要是因为我们想将可视数据与逻辑数据分离。然而,我们想要在这两个状态表示之间有链接。为了能够实现这一点,我们可以创建具有GameObject字段的组件。以及具有Entity公共字段的单一行为。
为了链接实体与游戏对象,我们有两个选择:
- 如果游戏对象是已经加载的场景的一部分,我们可以创建或查找到我们希望它链接的实体,而不是查询场景中的游戏对象,并通过添加具有GameObject字段的组件来连接它们
它。 - 一个更干净的方式(在我看来)是当我们有一个实体代表在游戏中的东西,我们必须添加一个游戏对象到场景中,以显示它。在这种情况下,我们只需要从一个预制实例化一个游戏对象,并连接游戏对象与实体。
我想指出一件事。
仔细的读者可能会注意到我写的配置是“固定”数据。我把这个词固定在引号里。我做了它的目的,因为配置并不总是固定的。有时候,即使游戏已经推出,设计师也可能想要改变它们。设计者甚至可能希望为随机数量的用户改变配置。这种技术称为A / B测试。
这就是为什么将配置作为JSON或XML文件从服务器下载是一个好主意。我不知道如何容易地使预制支持A / B测试。
因此我想提出以下解决方案。有一个单独的场景,游戏设计师可以放置游戏对象,平衡数据,但有一个“生成配置”按钮,使数据不捕获作为预制,但更简单的表示,你可以用于A / B测试。