【问题标题】:Component Entity System Entity Specific Data组件实体系统实体特定数据
【发布时间】:2016-11-05 12:17:08
【问题描述】:

我已经用 javascript 编写了一个组件实体系统有一段时间了,但我一直回到一个根本问题。

您如何处理特定实体(即单个实例或单个类型)的功能?

这是目前的情况:

我构建事物的方式是,当一个物品实体被另一个实体存储在库存中时,它不会被销毁,只是剥离了它的大部分组件。这样一来,如果它被丢弃,或者可能被取回以供使用,它可以以其旧状态重新激活。剥离的组件存储在附加到实体的 InstanceDataComponent 中(这只是一个 JSON 对象)。

有一个小型系统用于管理是否可以拾取物品的内部结构,并为所存储的东西添加带有哈希、数量和 id 的库存记录,但需要管理该实体从其“item”状态到“stored”状态。 应该怎么做?在我看来,要删除的组件和要更改的数据的详细信息对于每个项目都需要几乎是唯一的。

假设将来我想要一个实体在两种行为之间动态切换。例如,来回踱步直到它受到干扰,然后寻路找到玩家。什么会处理这种转变?

我觉得我对这里的问题和典型架构存在根本性的误解。什么是处理这个问题的干净方法?我是否应该为每组行为转换添加一个组件?最终不会有太多组件被美化为回调包装器吗?或者我是否遗漏了一些关于实体存储在库存中时应该如何更改的内容?


对可能正在经历这种情况的其他人的一些想法。

我当前的解决方案(经过多次迭代)是触发一个全局事件,例如itemPickupSystem:storedItem 并且实体可以为其工厂方法内的任何事件附加处理程序。由于多种原因,这是不可扩展的。我一直在考虑将这些事件移到队列中以便稍后执行。

我的工厂方法已经变成了回调定义的大杂烩,事情正在退化为回调地狱。另外,这个赛事系统不得不去,它是整个系统中唯一打破了游戏循环的串行性的部分。到目前为止,每个系统都以定义的顺序触发,所有逻辑都驻留在这些系统中。现在我不能保证实体会处于特定状态,因为这些回调可能在不同的时间点被触发。最后,由于执行被全权委托给不属于核心功能一部分的代码,因此无法知道触发事件时调用堆栈的大小。


【问题讨论】:

    标签: javascript frameworks entity components game-engine


    【解决方案1】:

    有时从实用的网络复制的角度来考虑这个问题是最容易的,组件之间的界限自然而然。

    假设您的演员既可以使用又可以存储一把剑。

    我不希望从inventorySword 到presentationSword 的“转换”,而是在“inventoryItem”和“swordPresentation”之间有一个自然的划分。

    在服务器上,每个玩家都会被分配到他们库存中的物品列表。每个项目都有一个世界的唯一 ID。库存物品可能派生为“SwordItem”,并具有 SwordType 和 Condition% 的属性

    在客户端上,“swordPresentation”组件可能会处理要显示哪个网格、通过第一人称相机显示时将动画数据附加到哪个套接字以及如何平滑动画转换的工作。但这对于游戏的实际状态来说并不重要,这只是我们的客户看待世界的方式。

    如果您将游戏状态分发给每个客户端,那么您将通过网络传递的所有内容将是当前玩家的库存,而对于其他玩家来说,每个玩家当前装备了哪些物品以及他们在哪里(假设他们在视力范围内)

    因此,考虑创建一个基于库存项目创建“swordPresentation”的工厂,找到可以作为参数传递的最低限度以创建组件的表示(可能是剑类型、剑百分比条件等)。

    最低限度是您想要序列化为库存项目的最低限度。

    在复制数据之间建立清晰的界限意味着在编写多人游戏时性能更好,漏洞更少。当您编写单人游戏时,它将帮助您了解保存文件中的内容。

    【讨论】:

    • 此时我将体验限制为单人游戏,但我同意你的观点,谢谢。
    猜你喜欢
    • 2018-01-05
    • 2016-01-23
    • 2017-10-21
    • 2021-02-20
    • 2018-08-13
    • 2020-10-18
    • 2014-07-06
    • 2017-05-28
    • 2018-09-03
    相关资源
    最近更新 更多