问题标签 [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.
typescript - 类型“N[P]”不能用于索引类型“IComponents”'
我试图在打字稿中实现实体组件系统模式。我有一个实体类,我想在其中保留实体的组件。我想为这个模式创建独立的包并在我的其他项目中使用它。
这是我有错误的实体类。
在方法中addComponents
我得到了这个错误
Type 'N' cannot be used to index type 'IComponents<N>'.
这是Component
班级的签名
有一个项目我使用这个包:
为组件创建组件、实体和枚举
获取实体并处理它的系统。在这种方法中,我想从entity.components
特定组件中获取并处理它
java - 实体组件系统中的边界和位置
我正在开发一个主要使用 ECS(不是纯 ECS)的游戏引擎,但我遇到了问题。
一些实体将需要一个Bounds
组件(例如,一个具有Rectangle
代表位置、宽度和高度的组件)。像按钮。许多实体还需要一个包含位置但不一定包含边界的组件。
如何协调重叠?
1)如果一个实体同时有一个Bounds
组件和一个位置组件,就会有两个位置。不好
2)实体只有Bounds
从位置组件继承的组件。丑陋,因为我必须重写translate
来自位置组件的实用程序方法并让它更新边界对象的位置。此外,实体将没有位置组件,这很奇怪。
3)Bounds
组件只包含宽度和高度。我不喜欢这样,因为那样我就不能使用Rectangle
类之类的东西来表示界限。
有任何想法吗?谢谢你。
oop - 与 OOP(或其他范式)相比,ECS(实体-组件-系统)架构模式有哪些缺点?
因为 Unity ECS,我最近阅读了很多关于 ECS 的内容。
ECS 架构有很多明显的优势:
ECS是面向数据的:数据倾向于线性存储,这是系统访问它的最佳方式。在体面的 ECS 实现中,数据是按顺序存储和处理的,对于任何给定的系统处理它的组件集几乎没有中断或没有中断。
ECS 是非常分区的:它自然地将数据与行为分开,强制“组合而不是继承”(google it)等。
ECS 对并行处理和多线程非常友好:由于事物的结构化方式,许多实体和组件可以避免冲突并与其他系统并行处理。
然而,ECS 的缺点(与 OOP 或实体组件 [无系统] 相比,直到最近在包括 Unity 在内的游戏引擎中很常见)很少被谈论,如果有的话。它们存在吗?如果他们这样做,他们是什么?
c++ - 此 ECS 实施在多大程度上遵循了这些原则
我目前正在学习实体-组件-系统架构数据驱动设计,以此来应对糟糕的 OOP 设计并将数据获取优化为 CPU 友好的操作。
我正在尝试编写一个简单的 ECS 系统来尝试遵循这些原则:
- 通过将实体/组件存储在连续的内存块中并最大限度地减少缓存未命中,对 CPU 友好
- 未设置系统中实体/组件/系统数量的上限
到目前为止,我的基本实现如下:
Entity
m_ID
每个新创建的实体都会增加一个计数成员的类。用于包含子实体的
。用于包含实体使用的组件的签名。我选择了,因为我希望能够作为在运行时添加/删除组件的要求,并且我不希望为实体拥有的组件大小设置上限,因此我无法在编译时知道大小,所以我决定使用将每个存储为 1 位的专业化,这样可以节省一些空间并允许增长。其中键是组件的 ID,值是组件 ID 到驻留在类中的组件向量的映射的索引。std::vector<Entity*>
std::vector<bool>
std::vector<bool>
std::bitset<S>
std::vector<bool>
bool
std::unordered_map<unsigned int, unsigned int>
std::vector<unsigned int, std::vector<ComponentBase>>
ECSManager
Component
每个组件类型具有唯一 ID 的类,使用模板Component<T>::ID
为每个组件类型生成唯一 ID。
System
包含std::vector<bool>
负责保存系统想要操作的实体的签名的类取决于它们是否具有足够的组件签名。
现在我确定我的实现并不接近我的要求,例如,我不确定它是否像 ECS 那样对 CPU 友好,因为我严重依赖std::unordered_map
链表实现的。但老实说,我根本不确定,所以这就是为什么我在这里发布我的实现,希望得到关于什么是好的,什么不是以及我可以如何让它变得更好的反馈。
ComponentBase.h
:
Component.h
:
Entity.h
:
Entity.cpp
:
System.h
:
System.cpp
:
ECSManager.h
:
game-engine - 在 ECS(实体组件系统)中,组件管理器和系统有什么区别?
我正在尝试了解 ECS。所以一个组件只是简单的数据,一些管理器将这些组件保存在一个容器中,并循环遍历所有组件以对这些数据采取行动,以“更新”它们。
这个管理器是人们所说的“组件管理器”还是“系统”?还是他们的意思是一样的?如果不是,组件管理器和系统做什么?
rust - 如何通过泛型类型获取数组结构 (SOA) 中的值?
我正在寻找您对一段代码的反馈/建议。
基本上,我有一个这样的 SOA:
我可以通过他的“句柄”访问一个特定的值(每个句柄都绑定到特定的类型),所以我可以通过entities.meshes.get(&handle)
.
到目前为止,一切都很好,但我试图通过相应的竞技场动态检索值来实现这一点。通过做entities.get(&handle)
如果句柄类型是Mesh
,我返回entities.meshes.get(&handle)
。我的Entities
结构有一个名为的方法get
:
这完美地工作。我将泛型类型转换为具体类型,然后再转换为泛型类型,但这似乎很奇怪和棘手。
也许我遗漏了一些东西,或者您对此有更好的想法;你会怎么做?:)
javascript - 如何处理 ECS 模式中的冲突?
我正在使用打字稿和 ECS 模式制作游戏。但我不明白如何处理实体之间的冲突。我有一组组Player
件的实体:
- LayerComponent - 组件,它保留用于渲染的图层名称;
- PositionComponent - 保持位置的组件;
- AppearanceComponent - 组件,保持渲染选项;
- BoxColliderComponent - 为碰撞句柄保持 AABB 大小的组件。
Enemy
我也有具有相同组件集的实体。这些实体的值不同LayerComponent
。中的Player
实体LayerComponent
保持Player
值,Enemy
实体保持Enemy
值。
我不知道如何处理这些实体之间的冲突。这些实体不应相互穿过。
目前我已经创建了 system PlayerPosition
,它处理碰撞和块通过实体移动BoxColliderComponent
。但我认为这是错误的,因为必须在他们自己的系统中处理冲突。
代码PlayerPosition
c# - 如何在 Unity ECS 中获取 ComponentDataFromEntity 到并行作业?
我正在尝试在并行作业中访问实体组件数据。组件数据的类型为PheromoneComponent
。定义作业的结构如下所示:
该作业使用以下实例执行:
代码运行,但每次调用更新时我都会收到以下错误消息:
由于我从未明确定义过,ComponentDataFromEntity
因为[WriteOnly]
这个错误似乎表明并行工作中存在一些冲突。我ComponentDataFromEntity
是否正确通过?还有其他我不知道的陷阱吗?我还有其他一些正在运行的工作,PheromoneComponent
但我尝试禁用它们并且错误仍然存在。此外,我猜 ECS 作业系统应该注意在执行另一个作业之前完成所有作业依赖项。
我也尝试过[NativeDisableParallelForRestriction] ComponentDataFromEntity<PheromoneComponent>
而不是[ReadOnly] public ComponentDataFromEntity<PheromoneComponent> pheromoneDataArray;
但没有改变。
任何帮助或解释将不胜感激!
c# - 使用结构的 ECS 中的组件实现
目标:
我正在尝试实现一个实体组件系统,但我坚持使用我的组件实现。我打算有一个通用组件类型,其中包含每个组件的静态位,例如位置类型的组件有位 = 0,精灵类型的组件有位 = 1,等等。一个组件应该只包含它持有的值因此我从结构开始。以下是我对此的尝试(不工作的代码):
之后我发现无法继承结构,因此我尝试将结构更改为有效的类。
问题:
有没有办法像在 C++(模板)中那样使用结构来实现这些功能?出于以后的实现/性能原因,我想将它们保留为值类型而不是引用类型。
编辑1:
我想要的预期用途是:
c++ - 在 C++ 中调用虚函数时出现分段错误
我目前正在为我的游戏引擎开发 C++ 中的 ECS。我有一个基本系统结构,它有两个虚函数init()
,并update()
在派生结构中实现。我有一个使用模板的addSystem()
和removeSystem()
函数,并且我有一系列System*
系统。如果我尝试调用它们,它会给我一个分段错误。
系统:
添加系统():
删除系统():
从 System* 调用虚函数:
请询问是否需要更多信息。
编辑:
size
在 for 循环中等于 1 并且 systems[i] 是一个有效的指针。我也测试过p systems[i]->update
,它也有一个有效的地址。问题是在调用它时。