问题标签 [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# - Unity ECS 不显示自包更新以来创建的实体
我尝试生成一些实体并为它们分配网格和材质。不知何故,它们既没有出现在编辑器中,也没有出现在游戏视图中。当我使用“GameObjectToEntity”转换脚本时,实体确实出现了,我尝试了新的 Alpha 版本的编辑器 (2020.1.0a25),但它没有帮助。我也在使用URP。它可能与更新预览包(实体、混合渲染等)有关,因为我在使用旧版本的不同项目中没有问题。不过,我可能在我的代码中遗漏了一些东西。
非常感谢您抽出宝贵时间
architecture - 将组件与 ECS 中的特定实体相关联的“规范”或最佳方式是什么?
我已经看到了大量关于如何在实体组件系统中存储信息的不同的、相互矛盾的建议——一些吹捧“纯度”或缓存优化,没有太多解释。作为一般总结:
实体列表,将组件存储在其结构中(例如,某种
unordered_map<type_info, IComponent*>
C++ 中的)。系统会跟踪它们自己的列表,其中当前活动的实体拥有它们所操作的组件。与 1 相同,除了系统全局迭代所有实体并检查它们包含哪些组件。
每种类型的组件都有一个单独的列表,并且没有实际存储的“实体”列表 - 系统迭代它们的相关组件,并且必须以某种方式找到属于同一实体的其他关联组件,通过一些唯一的 ID 连接他们。支持将组件保存在这样的列表中,因为据说可以改善缓存局部性(尽管我不知道如何,因为您仍将搜索几个大列表以查找特定实体上的相关组件),并且没有实际的 ' entity' 类型应该是“纯” ECS 的标志。
每个组件类型都有自己的全局容器/列表,但仍然有一个实体结构列表,用于跟踪哪些组件属于某个特定实体。系统的行为与 1 或 2 相同。
我还发现一些支持“每个系统一个组件类型”的争论——这将简化系统 3 的一些挑战,但总体上没有什么意义。
所以我的问题是 - 消除不同实现的所有噪音,这些中的任何一种都是制作 ECS 的“理想”或“规范”方式吗?很难分析每种设计的优缺点以及它们的许多不同变化。我通常按照上面列表中的“1”来实现它们,事实证明这很方便,但不一定是最佳的。
c++ - 使用模板参数包初始化联合
我正在用 ECS 和面向数据的模型编写引擎。我试图避免继承和动态调度,以避免每次update()
调用都破坏缓存。我想出的是:
然后我有一个room
通过内存池保存所有系统和组件的类(管理器)。问题是
编译器抱怨的部分:
我尝试移动椭圆,但没有效果。我实际上想要做的是避免在每一帧上同时使用模板和动态调度,但我需要模板进行初始化。我有一些基本语法错误吗?我完全错过了什么吗?我是面向数据的范式的新手,所以我很乐意接受任何建议。最小的可重现示例:https ://godbolt.org/z/zGAfXS
programming-languages - 是否可以围绕实体-组件-系统架构建立一种语言?
几个星期以来,我一直在考虑在脑海中创建一种基于 ECS 的编程语言的想法。但是,我不太确定创建基于 ECS 的通用语言是否可行。
数据结构将如何实现?你怎么能做图形的东西或网络的东西?
我开始认为这是不可能的,但我决定在放弃这个想法之前先在这里问一下。我真的很想完成这项工作,但我只是不知道这是否可能。
那么,有可能吗?你会怎么做我提到的事情?
提前致谢!
linux - 尝试启动新的 2D 项目时,Linux 上的 Unity ECS 错误
我已经在 linux 上安装了 Unity,在标准模型中开发游戏时,一切似乎都按预期工作。但是,当我为 ECS 开发设置项目时,通过安装以下软件包:
- 爆发 1.3.0
- 实体 0.11.0
- 混合渲染器 0.5.1
- 乔布斯 0.2.10
- 数学 1.1.0
创建空白 2D 项目时出现以下错误:
Unity 版本:2019.3.14f1 个人版
任何人都知道可能是什么问题?
lua - 如何在匹配键上复制嵌套表值
我正在尝试使用纯 Lua 表来实现组合的概念。程序集是较大的表,而原型/类是具有匹配键的较小表,用于修改程序集中的默认值。这一直工作正常,但所有组件都位于实体内的同一级别。现在我正在尝试按类别组织组件,如下所示:
physics = {}
该集合在物理 ( )下只有一个空表
我组装实体的功能是:
(deepcopy 取自 lua 用户 wiki)
但是,因为原型表只包含修改后的值,所以将原型的组件复制到集合中将覆盖集合的默认值。我尝试了递归:
(只是用 assemble_entity 交换了 deepcopy)
我发现的问题是大多数组件返回 nil (而且它的效率明显低下,但并不是每一帧都调用它),所以它肯定是错误的。我以前从来没有搞过递归,所以任何帮助表示赞赏。
我可以通过将每个值存储在原型中来解决这个问题,但是使用组合就没有意义了,而且我还有很多打字工作要做。
kotlin - 我的游戏自定义输入适配器没有运行渲染系统
我正在使用 Ashley 和 Guicer 使用 LibGDX 和 Kotlin 制作 ECS 游戏。一切正常,除了当我单击时,实体生成时没有纹理。当我在主文件中调用 addEntity 时,纹理被加载但在MyInputAdapter纹理中只是不加载。
这是MyInputAdapter类:
这是适配器在Main类中的注册:
TextureRegionComponent在输入适配器中被忽略,但它不在Main类中:
这是一些图片: 示例
rust - 在 Amethyst ECS 架构中添加事件通道
在Amethyst Pong 教程中,对实体/组件/系统(ECS)架构的解释让我觉得系统是在main
函数中添加到游戏中的东西,不能在运行时添加或删除。
在同一本书中,我按照这一部分添加了一个Producer
系统和一个Receiver
系统,它们都与定制的EventChannel
.
由于Receiver
和Producer
是系统,按照教程我只学习了如何将它们添加到main
函数中,而没有其他地方,而在代码示例中,Receiver
'new
方法是在World
struct
. 我没有任何关于World
when 在main
函数中的实例,因为在创建过程中似乎还为时过早,无法拥有其中之一。
如何以正确的 ECS 兼容方式完成?有没有办法在游戏循环期间从状态中检索系统并在那里订阅?会是正确的吗?
entity-component-system - 实体组件系统中的初学者
我刚刚深入研究了实体组件系统并喜欢这个想法。我已经了解它背后的基础知识,但细节是大多数问题隐藏的地方。所以我想知道是否有人可以帮助我克服它?
实体-组件结构应该是什么?我已经看到了两种实现方式 - 将实体作为对象/结构并在内部作为变量。其次,具有组件的数组或映射,其中数组或 int 在映射中的索引表示实体的 ID。哪种方式更好?
如果将实体作为合法对象的第一种方法更好,那么我应该如何找到具有系统特定组件的实体?我是否应该遍历每个实体,然后遍历它的组件数组以找出它是否具有此特定组件?相同的逻辑可以应用于不同组件的映射,因为我再次需要遍历映射以查找它是否具有特定的 id。
如果使用数组的第二种方法是正确的,那么如果我有一个像“PlayerController”这样的组件,它只分配给一个实体,但仍然会有这些组件的整个数组(只是空值,但它们也占用 64 位)。以防万一-我需要整个数组作为数组中项目的索引实际上代表实体的 id 所以我需要数组至少是具有该组件的实体的 id 的大小,但也可能是大于由于泛化
奇怪的是,如此美丽的架构在网上没有太多信息,只有图书馆(和那些教程),如果你想了解其中的深度,你必须查看它们。
c# - 当前上下文中不存在名称“实体”
我知道我还没有为 Entities.ForEach(); 输入参数;——那不是我的问题。我收到错误消息;
“当前上下文中不存在名称‘实体’”
我在这里做错了吗?