问题标签 [entity-component-system]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 将系统与事件联系起来
使用实体-组件-系统模式,我想将一些系统与事件联系起来。所以有些系统不应该循环运行,它们应该按需运行。
以Health系统为例,Death系统仅应在组件的生命值低于 1 时运行。
我想过有两种类型的系统。第一种是周期系统。每帧运行一次,例如渲染或移动系统。另一种类型是基于事件的系统。如前所述,健康与死亡之间存在联系。
首先,我创建了两种系统类型都使用的基本接口。
此外,我创建了接口
和
但我不确定它们是否有必要。使用没有问题
但如果不需要,我不想运行系统。
有两种类型的事件, aChangeEvent
和 a ExecuteEvent
。第一个在组件中的值发生更改时触发。当应该对特定实体进行某些操作时,会触发第二个。
如果你需要或想要你可以看看EntityManager
这ComponentRequirements
以及ECS的使用
一个示例系统将是这样的
我怎样才能创建ChangeEvents
和ExecuteEvents
用于不同的系统?
编辑
如果更改事件正在侦听,或者如果执行事件正在侦听,是否有办法将事件委托添加到组件以在更改时为该实体运行特定系统?
通过提及ChangeEvent
,ExecuteEvent
我只是指事件代表。
目前我可以做这样的事情
但我希望通过使用事件委托使系统相互通信和共享数据来实现更好的架构。
sprite-kit - SpriteKit 实体组件系统 - 带有显示元素的冷却计时器
在实体组件系统中,创建冷却计时器的正确方法是什么,该计时器具有可以附加到按钮的显示元素?
我最初的想法是分别分离出计时器和进度条组件,从而计时器或者委托给实体以通过特定的数字/百分比更新进度条,或者计时器尝试从实体本身获取正确的组件并更新它. 通过这种方式,我将所有关注点拆分为单独的组件。但这实际上是否应该都在一个组件中,例如 timerProgressBarComponent 被视为“一项工作”。理想情况下,这将向现有精灵添加一个显示元素,以展示剩余的时间。
如果您需要更多上下文,我正在考虑一个按钮,该按钮只能每 10 秒按下一次,但我想更新 ui 并指示还剩多长时间,一旦 10 秒是up 使按钮再次可点击。
c++ - 实体组件系统和多个组件共享公共基础类型
我正在尝试为我的游戏引擎实现一个简单的 ECS。我知道我的实现并不是严格意义上的 ECS,但我正在重构我的代码,使其更加基于组件。到目前为止,我有以下课程:
Entity
: 它是一个组件容器,因为我希望我的实体有多个相同类型的组件,所以它将它们存储在一个
std::map<ComponentID,std::vector<std::unique_ptr<Component>>>
. 每个组件都有一个唯一的 ID(一个无符号整数),这是我从网上学到的一个简单模板技巧中获得的:
一个名为 GetUniqueComponentID 的函数:
包含一个简单地生成递增数字的计数器。我从一个名为 GetComponentID 的函数模板中调用此函数:
此模板为我添加到实体中的每个组件实例化一个不同的函数,因此需要检索组件的代码可以使用 索引映射GetComponentId<Component_type>
,并将具体组件类型作为函数的模板参数。
实体类具有 AddComponent 和 GetComponent 等方法,它们分别创建组件并将其添加到实体中,并检索组件(如果存在):
由于我想存储多个相同类型的组件,我将它们存储在std::map<ComponentID,std::vector<std::unique_ptr<Component>>>
.
现在我的问题是:
我需要为一种组件类型创建组件层次结构:我有一个 ForceGenerator 组件,它是各种具体 ForceGenerator(弹簧、重力等)的(抽象)基类。所以我需要创建具体的组件,但我需要通过指向基类的指针多态地使用它们:我的物理子系统只需要关心指向基本 ForceGenerator 的指针,调用它的 Update() 方法来更新力.
我不能使用当前的方法,因为每次创建特定的 ForceGenerator 组件时我都会使用不同的类型调用 AddComponent,而我需要将它们存储在同一个数组中(映射到基本 ForceGenerator 的组件 ID)。
我该如何解决这个问题?
c# - 将组件存储在静态类中可行吗?
我正在为 C# 中 ECS 的自定义实现而苦苦挣扎。
我将组件存储在静态类中,如下所示:
我这样做有两个主要原因:
- 它允许我将我的组件(原样)存储在连续的结构数组中
- 我无需装箱/拆箱即可轻松获得组件
我用表格等管理管理器类中的组件。
到目前为止,我的实现运行良好,但基于这种方法我很紧张。
- 由于通用静力学,我是否缺少任何东西,例如隐藏拳击?性能测试按预期进行,但我还没有实现任何 SystemManager 类型的东西,因为这样做非常棘手,所以如果我一直都错了,我不想从那开始。
我找不到静态通用装箱问题的正确答案,而且我还没有看到任何 ecs 使用它。
c++ - 基于组件的游戏引擎中的不同碰撞几何
我正在编写一个简单的游戏引擎,经过大量重新思考/重构后,我选择了一种基于组件的架构(严格来说不是 ECS,但它也不再基于继承)。所以我的世界中的一切都是一个实体,每个实体都有一堆组件。我游戏中的每个系统/子系统都会扫描一个实体以查找它感兴趣的一系列组件,并执行一些相关的计算。
到目前为止,一切都很好。引擎的基本架构可以在这里看到:
现在,每个可碰撞的实体都有一个碰撞组件(以及位置/移动/刚体组件),因此物理系统需要获取该组件并使用它来提供其碰撞检测算法,以便生成接触数据用于解决碰撞。
我被困在以下问题上:碰撞检测算法处理不同的几何形状:盒子、球体、平面和射线(截至目前),但我不想有一个 spherecollisioncomponent 和一个 boxcollisioncomponent,至少我不'不希望它们不相关,但我希望它们共享一些共同的基类。
显然,每个组件都有不同的界面(盒子有一半大小,球体有半径等等),并且不同的碰撞检测函数对它们中的每一个都有不同的处理方式(盒子-盒子、盒子-球体、球体-球体..)。
那么我怎样才能以一种优雅而健壮的方式解决这个问题呢?
python - 在实体组件系统中应该如何处理设置代码?
我正在用 Python 编写一个 ECS 框架和一个游戏。在 ECS 框架中,组件应该只包含数据。但是,有时需要设置代码来创建数据。例如,在音频组件中,数据将是要播放的声音的音量和音频文件的路径。但是在音频播放库中,有一些对象来表示声音,sound.play()
例如,它们有一个方法。我的问题是这个对象是否应该在组件中创建,这违反了实体应该是纯数据的规则,还是在系统中。如果最好在系统中完成,则只需完成一次(如果需要每帧创建一次音频文件,则会损害性能)。做这个的最好方式是什么?
javascript - 如何迭代两个共享公共属性的数组?
我一直在使用前端的 Pixi.js 在 JavaScript 中开发一个非常苗条的实体组件系统,我有一个问题要问你们一个常见的模式是你在系统中使用的迭代器,例如在 Unity 中你可以这样做:
假设您有一个实体数组和两个包含这些组件类型的数组,需要调用一个函数并将这两个组件作为参数传递,您将如何在后台构建该 forEach 函数?本质上,迭代具有两种类型组件的实体的最优化方法是什么?
简单的方法似乎是迭代实体列表并检查它们的组件类型,但我想知道是否有更好的方法。这种方法看起来像这样:
unity3d - 我们如何在 Unity3D 的实体组件系统中获得刚体行为?
我在玩 ECS。我想知道是否有可能将许多具有刚体的立方体实例化为实体,以便获得更多?
我想要场景中的数万个(如果不是更多)简单(Mesh + Collider + Rigidbody)对象只是为了被动地与场景交互。
game-engine - 使用实体组件系统如何确保一组组件类型中最多存在一个组件(每个实体)?
我使用 ecs 有一段时间了,但有一个问题我找不到一个很好的、主要是通用的解决方案。有一组类型,其中最多一个应该与一个实体相关联。前任。有一些触发逻辑。可以在通常的并行迭代中一次评估所有触发器(具有相同类型)。一切正常,但在单个实体上设置多个触发器是没有意义的。现在,我有各种清理和健全性检查系统(任务),在创建新触发器类型时必须始终更新这些系统(任务)。(编辑在更新时,我指的是源代码而不是运行时。)在传统的 oop 中,这将是微不足道的:将每个实体的单个指针存储到基本类型,派生并实现新的绑定器,仅此而已。在 ecs 中,它们存储在不同的存储中,我没有一个好的解决方案来确保对它们进行某种互斥。
感谢您的任何建议。
c++ - 具有虚拟基类的可变类方法
我正在尝试将我的组件池生成器更改为使用可变参数模板,以试图避免所有 Init() 函数并改为使用每个组件构造函数。但是我无法编译它。
这是组件池类,它有一个基类,其方法将被父类覆盖:
然而,编译器抱怨(并且理所当然地)componentPool Create 方法没有覆盖基类方法。有没有办法解决这个问题?
实际错误(VS 2015)是: