![](https://img-blog.csdnimg.cn/fd3fdfe2e1f24740b2a120f825f4e73d.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Entitas
文章平均质量分 80
ECS 开发模式, unity3d 游戏开发使用
toophy1980
这个作者很懒,什么都没留下…
展开
-
Entitas 十 Hello World 一个小例子
这是一个非常简单的示例,但它说明了 ECS 的优势。我们不关心此实体附加了哪种其他组件,它可以是汽车、人、狗、房子,我们不关心。我们只是定义了,如果某物具有位置和速度,它将被移动。上述实现非常简单,它只是将速度减半,因此速度会很快变为零向量,当它变为零向量时,我们会将其整体移除。使用给定的移动系统,我们将保持以恒定速度移动事物,直到停止游戏/应用程序。然后,我们可以遍历所有可移动物体,并将可移动物体的位置替换为其先前位置加上速度。现在,我们可以简化减速系统,通过删除速度检查并仅用减小的速度替换当前速度。翻译 2023-08-19 21:55:54 · 46 阅读 · 0 评论 -
Entitas 九 Reactive System 响应式系统
通常情况下,人们希望在添加了两个组件中的任何一个组件时收集实体。如在收集器章节中所述,当实体被收集时,即使在逻辑上可能会感觉到第一个事件的逆转的事件也会保留其收集,它仍将保持收集状态,并将传递给。如果您需要有一个响应式系统,可以从不同上下文类型中收集实体,则需要扩展抽象的。只有当添加了其中一个组件时,实体才会进入该组,当我们添加第二个组件时,实体仍在该组中,因此它不会被。否则,就像在此特定示例中一样,我们可以检查收集的实体是否仍在其中拥有。匹配器的监视组的收集器时,您可能会得到意外的结果,因为当您有组件。翻译 2023-08-19 21:53:47 · 63 阅读 · 0 评论 -
Entitas 八 System 系统
到目前为止,在本章中我所描述的一切都只是接口,这些接口反映了我们用于拆分行为代码的惯例。类是在 Entitas-CSharp 中生成的另一个方便类,我们可以在其中引用不同的上下文实例。在 Entitas-CSharp 中,还有另一种处理数据的方法,您将在下一章中详细了解。通常情况下,在我们启动游戏时,我们需要首先创建初始状态。在 Entitas-CSharp 中,我们有多个接口,我们必须实现这些接口才能将一个类标记为系统。执行系统定期运行,因此我们通常要做的是,在系统构造函数中设置一个或多个组,然后在。翻译 2023-08-19 21:52:22 · 66 阅读 · 0 评论 -
Entitas 七 Indexs 索引
当我们开始创建实体并向其中添加组件时,它们将开始进入组,索引将被通知添加了以下组件的实体。它获取先前的组件,以便从 HashMap 中删除条目,并且如果我们将其替换为另一个组件,则会再次收到添加事件,其值为新值。您可能需要更复杂的策略,例如在范围内获取实体,或者具有更复杂的索引键。这也是我们推荐的,当您需要从一个实体到另一个实体存储引用时(在“Ingredients”章节中会详细介绍)。在此代码片段中,我们要求上下文为我们提供在“input”影响的位置上的所有实体,并过滤掉不是交互式的实体。翻译 2023-08-19 21:51:10 · 62 阅读 · 0 评论 -
Entitas 六 Collector 收集器
收集器是驱动反应式系统的核心。您可能不会单独使用它,但它仍然是 Entitas 的一个非常重要的组成部分。收集器还可以使用一组组和事件数组创建,这意味着我们可以观察多个组并保持已更改实体的联合列表。收集器可以被激活和停用,以便我们可以停止和恢复对组的观察。我们可以遍历收集的实体并清除它们。组件,它仍然会保持被收集状态,因此它将再次被添加到组中。收集器是一个观察组的类。它将订阅组事件,并保持对将离开组的实体的引用列表,因为我们对。还要注意的是,当一个实体被收集器从组中移除时,即使我们再次向其添加。翻译 2023-08-19 21:49:48 · 64 阅读 · 0 评论 -
Entitas 五 Group 组
更重要的是要理解,当我们在实体上替换一个组件时,旧的组件将被删除,新的组件将被添加。生成的代码会询问用户获取新值,像是我们会删除具有旧值的组件一样触发事件,然后在组件中设置新值,再像是添加了新组件一样触发事件。如上下文章节所述,上下文管理着所有的实体,因此我们可以向上下文询问所有的实体,然后遍历它们,收集那些具有位置和速度组件的实体。上下文保留了您要求的所有组的内部列表,因此如果您再次使用相同的匹配器请求一个组,它将只是给您一个对已经存在的组的引用。的情况下,我们不希望列出的组件存在。翻译 2023-08-19 21:48:00 · 49 阅读 · 0 评论 -
Entitas 四 Context 上下文
如果您仅使用原始的 Entitas,不在自己的代码中持有任何对实体的引用,您不需要考虑它。一个组件是一个列,一个实体是一行,上下文本身就是一个表。这意味着,当我们定义更多的组件类时,我们的表就变得更广泛了。有时,出于组织目的,将组件切片到不同的上下文中也是有益的。您可能有一些仅在核心游戏上下文中需要的组件,以及一些仅与元游戏相关的组件。它还是第一个在我们操作实体时被通知的观察者(请参阅实体章节中的实体观察部分)。顺便说一下,我们不鼓励具有对另一个实体引用的组件,而更倾向于使用实体索引(请参阅索引章节)。翻译 2023-08-19 21:45:02 · 36 阅读 · 0 评论 -
Entitas 三 Entity 实体
引用计数是一种内部机制,确保在实体不再被引用之前不会被重新使用。当您保持对实体的引用时,必须调用,而在释放引用时,调用是很重要的。这些调用会增加和减少引用计数。Entitas-CSharp 的所有内部类都尊重这种机制,您的代码也应该遵循这一点。如果您在保持对实体的引用时不调用Retain,可能会最终持有对已被销毁并重生为其他内容的实体的引用。如果您忘记在保持的实体上调用Release,它将永远停留在对象池中,从而使内存消耗随时间增长。翻译 2023-08-19 18:16:42 · 72 阅读 · 0 评论 -
Entitas 二 Component 组件
然而,根据我的经验,对于中等核心移动游戏来说,大约有 150 个组件是相当不错的数量。事实上,我比较了我参与开发的两个不同的移动游戏,两者都大约有 150 个组件。从技术上讲,引用组件也只是具有多个属性的组件,但这些属性并不代表数据,它们引用一个复杂对象。它是数据的原子化表示。在这种情况下,我们可以在组件内部存储一个函数/委托/动作,从而将其附加到一个实体上。这是组件的有效用法,但正如我们在食谱部分将讨论的那样,它造成了更多的伤害而不是好处。的习惯用法,其中一个对象在整个应用程序生命周期中是唯一且持久的。翻译 2023-08-19 18:13:17 · 64 阅读 · 0 评论 -
Entitas 一 介绍
我叫 Maxim,是一名软件开发者。我在 2012 年末在柏林的休闲游戏工作室 Wooga 工作时,偶然间接触到了 ECS(Entity Component System,实体组件系统)和 Entitas(ECS 的实现)。从那时起,我帮助改进并将 Entitas 移植到不同的编程语言,并且自己用它构建了一些游戏和应用程序。坦白地说,写这本书不是我的想法。Entitas-CSharp 社区的热心人推动我朝这个方向前进,并承诺在这个过程中提供帮助。翻译 2023-08-19 18:10:00 · 54 阅读 · 0 评论