问题标签 [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++ - 实体组件系统 (ECS):实体专有组件数据在具有该组件的所有实体之间共享
我会尽量保持简短
上下文
我的基本 C++(SDL 和 OpenGL)2D 游戏引擎有一个 ECS。我有一个名为TextSystem的系统,它需要 3 个组件。变换组件、渲染组件和文本组件。
这是为系统设置的签名的代码片段。
TextSystem 所做的只是将RenderComponent中的“纹理”变量设置为由文本/字体制成的纹理。这是使用名为 LoadTextureFromFont 的函数完成的。
另一个处理渲染的系统RenderingSystem会自动添加实体,如果它已经注册到TextSystem,因为RenderingSystem具有TextSystem需要的所有组件,即转换和渲染组件。
因此,TextSystem根据文本输入(TextComponent中的“输出”变量)更改实体的纹理以更新它,然后RenderSystem呈现该实体。
TextSystem的 Update 在RenderingSystem的 Draw 之前调用。
问题
在为TextSystem中注册的实体重新分配渲染组件中的纹理变量时,应用的最新纹理(通过 LoadTextureFromFont)将应用于所有具有TextComponent的实体。本质上,最后一个TextComponent成为所有具有该组件的实体的TextComponent 。纹理的大小是根据原始文本的大小制作的,因此较长但已被最新文本替换的文本看起来会不成比例。
任何其他组件都不会发生这种情况,严格来说,这个组件(它只包含一个字符串和字体对象)似乎不是实体专有的。
我已经尽我所能来解决这个问题(10-12 小时......),谷歌搜索没有产生预期的结果。
如果需要任何东西(更多代码片段和/或上下文),请告诉我!我不确定这个问题是否适合 Stack Overflow 或 Game Development。
unity3d - Unity DOTS 对普通游戏有多大好处?
我知道 DOTS 和 ECS 的巨大优势体现在游戏包含大量拥有相同数据的对象时,因此它们可以放在内存块中并轻松迭代。
我的问题是:我正在做一个普通的游戏,它不包含数千个拥有相同数据的对象,恰恰相反:有很多对象包含不同的数据和行为。使用 DOTS 是否仍然有益?
我知道就内存而言,它是有益的,因为只有有用的东西才能发挥作用,但是在 DOTS(数千个类似对象)的巨大好处不存在的情况下,我应该如何决定使用它与否?
c++ - 如何在没有参数的函数中从可变参数模板类型迭代/获取静态成员?
我需要为 ECS 编写一个函数,该函数接受可变数量的模板参数(组件)并且没有参数,并将返回附有这些组件的实体列表。
格式如下所示:
在函数中,我需要访问每个 Component 类的静态 ID 以确定要返回的实体,如下所示:
我已经搞砸了很多,无法想出任何产生这种行为的东西,但我很确定这是可能的,因为我认为我以前见过类似的 API。任何帮助将不胜感激,谢谢!
java - 如何实现 Unity 风格的 GetComponentJavaFX 中的 () 函数?
我正在尝试制作具有实体组件系统风格的游戏。实体类有一个不同组件的列表,它们都扩展了 Component 类。如何创建一个函数来返回指定类的组件?(变换、物理等)。来自 Unity 的示例:Transform tf = player.GetComponent();
我在实体类中有这个功能:
在 PhysicsComponent 中,我试图获得对 TransformComponent 的引用,如下所示:
getComponent 函数总是返回 null 因为我必须将组件作为参数传递给播放器构造函数以显示我希望播放器拥有的组件类,所以我不能在任何组件构造函数中引用播放器,因为我需要在播放器之前制作虚拟组件。
我怎样才能像 Unity 一样使用简单的 GetComponent(); 功能?
c++ - 如何使用模板化别名或 const 变量来缩写静态 const 变量?
我正在编写一个实体组件系统作为 C++17 的练习。我想让每个组件类型(表示为一个结构)与一个唯一标识符相关联,该标识符可用作组件注册表中位集向量的索引,例如。这可以使用模板化的 struct ComponentType
。ComponentType<Tag>::type
但是,每次我想获得价值时都感觉很冗长。我更喜欢使用类似component_type_t<Tag>
. 但是,使用模板化别名和如下实现会失败,尽管它会编译,但使用会产生以下输出。有没有更好的方法来解决这个问题?
代码:
rust - 有没有办法从 rust Legion ECS 系统中查看(并从中获取实体)世界?
我正在关注使用Specs ECS 的 rust 教程,我正在尝试使用legion ECS来实现它。我喜欢军团,一切都很顺利,直到我遇到问题。
我不确定如何提出我的问题。我想要做的是创建一个系统,该系统在每个具有例如 ComponentA 和 ComponentB 的实体上进行迭代,但它也会检查实体是否具有 ComponentC 并在这种情况下做一些特殊的事情。
我可以使用规格(示例代码)这样做:
我很难将其转换为使用军团(当前使用最新的 0.4.0 版本)。我不知道如何获取当前实体拥有的其他组件。这是我的代码:
上述系统中的实体仅包含其 ID。如何在没有 World 的情况下访问该实体的组件列表?或者有没有办法在军团系统中访问世界?或者任何其他方式来实现与 Specs 版本相同的效果?
谢谢!
c++ - 模板化函数静态成员
我目前正在开发一个实体组件系统,在该系统中我需要为不同的组件类型创建唯一的 ID,最好不要在组件类中存储任何额外的数据(因为这需要静态虚拟方法,这些方法不起作用,并且所以每次比较某些东西时我都需要实例化一个新组件)。我最终采用的方法是创建一个模板化方法:
然后在我的组件基类中有一个静态方法,每次在 GetTCompomponentID() 中初始化一个新的静态 COMP_ID 时,它都会返回一个唯一 ID:
使用它,我可以为我使用的每个组件派生创建唯一的静态 ID,而无需将数据作为虚拟函数存储在类本身中(它不能是静态的,因此每次需要比较时都需要新实例)
除了静态方法成员使用的明显额外内存之外,使用这样的系统是否存在任何潜在问题?
-谢谢
postgresql - 在 Postgres 中实现实体组件系统是否明智?
我正在寻找一个灵活的数据库模式。阅读了有关实体组件系统的信息后,它似乎很合适。
例如,文本冒险模式可能是:
除了链接多个表的潜在性能问题之外,以这种方式建模数据还有哪些其他缺点?
javascript - 打字稿省略getter setter readOnly for Partial数据?
我如何在数据中省略getter、setter 和方法Partial<>
?
还是存在一种使用 typescript 获得这种架构的方法?
我需要一个具有完全访问权限的类型,以及一个没有 readOnly 的类型。
我试着在这里做一个小例子,见注://
我想要的是内部function renderer(A: A) {
能够使用所有公共道具方法,getter,setter。并且里面function create(data?: Partial<A>)
只允许部分数据(没有getter,setter,methods)。
所以我想要一个技巧来在这里只获得黄色道具,当我使用时create()
我尝试了许多没有成功的场景,总是在某个地方撞墙!如果您有其他方式来构建它?谢谢