Questions tagged «entity-system»

一种游戏范例,其中游戏对象(实体)由组件组成,并由系统对其进行操作。每个实体都是一个指向特定组件的ID。

4
Lua实体创建/管理良好的游戏引擎
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我正在寻找一种使用Lua或其他脚本语言构造其实体的引擎。这是为了寻找灵感,并在我自己的引擎中也这样做。 我知道CryEngine确实使用Lua制作了他们的实体,但是我想知道是否还有其他可以选择的替代方法。 谢谢!

4
实体系统和渲染
Okey,到目前为止我所知道的;该实体包含一个组件(数据存储),其中包含类似信息;-纹理/精灵-着色器-等等 然后我有一个渲染器系统,可以绘制所有这些图像。但是我不明白渲染器应该如何设计。每个“视觉类型”都应有一个组件吗?一个组件没有着色器,一个组件具有着色器,等等? 只需输入一些“正确方法”即可完成此操作。要提防的提示和陷阱。

2
如何在基于实体/组件的系统中构造游戏状态
我在做设计与实体分量范例,使用系统组件之间的通信,说明游戏在这里。在开发过程中,我已经达到需要添加游戏状态(例如暂停,播放,关卡开始,回合开始,游戏结束等)的地步,但是我不确定如何在我的框架中进行操作。我看这对游戏状态的代码示例,每个人都似乎是参考,但我不认为它与我的框架适合。似乎每个状态都处理自己的绘图和更新。我的框架有一个SystemManager,可以处理使用系统进行的所有更新。例如,这是我的RenderingSystem类: public class RenderingSystem extends GameSystem { private GameView gameView_; /** * Constructor * Creates a new RenderingSystem. * @param gameManager The game manager. Used to get the game components. */ public RenderingSystem(GameManager gameManager) { super(gameManager); } /** * Method: registerGameView * Registers gameView into the RenderingSystem. * @param gameView …

1
如何在自制渲染系统中缓存资源
背景: 我正在为使用C ++和OpenGL的实体组件系统类型体系结构设计一个简单的3D渲染系统。该系统由一个渲染器和一个场景图组成。完成渲染器的第一次迭代后,我可能会将场景图分发到ECS架构中。目前,它是一种占位符。如果可能,以下是我对渲染器的目标: 简单性。这是一个研究项目,我希望能够轻松更改和扩展我的系统(因此采用ECS方法)。 表现。我的场景可能有很多小型模型,也有很多具有很多几何图形的体积。从OGL上下文中获取对象并在每个渲染帧中缓冲几何体是不可接受的。我的目标是数据本地化,以避免缓存未命中。 灵活性强。它必须能够渲染精灵,模型和体积(体素)。 解耦。编写渲染器后,场景图可以重构为核心ECS体系结构。 模块化。能够在不更改场景图的情况下交换不同的渲染器将是很好的。 参照透明性,表示在任何时间点我都可以给它任何有效的场景,并且它将始终为该场景渲染相同的图像。特别地,该目标不是必需的。我认为这将有助于简化场景序列化(我将需要能够保存和加载场景),并为我提供了在运行时出于测试/实验目的而在不同场景中交换的灵活性。 问题与思路: 我想出了一些不同的方法来尝试,但是我正在努力为每个渲染节点缓存OGL资源(VAO,VBO,着色器等)。以下是到目前为止我已经想到的不同的缓存概念: 集中式缓存。每个场景节点都有一个ID,渲染器具有将ID映射到渲染节点的缓存。每个渲染节点包含与几何图形关联的VAO和VBO。高速缓存未命中获取资源并将几何图形映射到高速缓存中的渲染节点。更改几何形状后,将设置脏标志。如果渲染器在遍历场景节点时看到肮脏的几何标志,则它将使用渲染节点重新缓冲数据。移除场景节点后,会广播事件,并且渲染器会在释放资源的同时从缓存中删除关联的渲染节点。或者,将节点标记为要删除,而渲染器负责将其删除。我认为这种方法最接近目标6,同时也考虑了4和5。2遭受了额外的复杂性和丢失了使用地图查找而不是数组访问的数据局部性的麻烦。 分布式缓存。除了每个场景节点都有一个渲染节点外,其他与上面类似。这会绕过地图查找。为了解决数据局部性,可以将渲染节点存储在渲染器中。然后场景节点可以改为具有指向渲染节点的指针,并且渲染器将指针设置在高速缓存未命中。我认为这种模仿实体组件方法,因此与架构的其余部分保持一致。这里的问题是,现在场景节点保存渲染器实现特定的数据。如果更改了事物在渲染器中的渲染方式(如渲染精灵与体积),则现在需要更改渲染节点或向场景节点添加更多“组件”(这也意味着更改场景图)。从好的方面来说,这似乎是启动并运行我的第一迭代渲染器的最简单方法。 分布式元数据。渲染器缓存元数据组件存储在每个场景节点中。此数据不是特定于实现的,而是包含ID,类型以及缓存所需的任何其他相关数据。然后,可以使用ID直接在数组中完成缓存查找,并且该类型可以指示要使用的呈现方法的类型(如精灵与体积)。 访客+分布式映射。渲染器是一个访客,场景节点是访客模式中的元素。每个场景节点都拥有一个只有渲染器才能操作的缓存键(就像元数据一样,只是一个ID)。该ID可以用于数组,而不是广义的地图查找。渲染器可以允许场景节点根据场景节点的类型调度不同的渲染功能,并且ID可以由任何缓存使用。默认或超出范围的ID将指示高速缓存未命中。 您将如何解决这个问题?或您有什么建议吗?感谢您阅读我的文字墙!

1
一个人如何在实体组件系统中存储全局上下文数据?
我的问题是这样的: 一个将如何存储全局上下文数据,即。实体组件系统中的世界数据信息,当前世界时间等? 我正在考虑使用C ++构建矮人要塞风格的开放式世界模拟游戏。我只是出于娱乐目的而建立了一个实体组件样式的游戏引擎,而我目前正在试图弄清楚如何在所有想要的功能中工作。除了标准的游戏玩法(渲染,物理,特定于实体的组件数据等)之外,我还希望获得一些所有相关系统都可以访问的全局上下文数据(即世界数据,例如当前的年份) ,全球变暖是否正在发生,与模拟世界有关的任何事物)。我最初曾想过要制作一个“世界”组件,但是如果许多不同的系统需要访问这个逻辑上的“全局”数据,这似乎毫无意义且困难。 拥有“世界”组件是否有意义,还是应该以其他方式存储此数据? 我还考虑过将这些数据简单地全局化,从而可以访问任何想要使用它的系统。这似乎总体上违反了实体组件原则,并且由于其他原因可能有些混乱,但是我认为这可能确实有效。 我想到的另一件事是将相关的世界上下文数据直接直接嵌入系统本身。例如,如果我有一个AgeSystem“老化”的具有getsWeakerAsTimePasses组件之类的所有实体,那么也许该系统可以直接将世界的相关时间数据存储为成员数据,以用于计算时间的流逝以及需要多少时间。年龄和弱化人们等。这是我最不喜欢的第三种选择,但是在头脑风暴中发生了一些事情。 有人可以建议吗?

4
识别实体组件系统中的实体“类型”
如果实体没有显式的“类型”(例如播放器),而仅仅是组件的集合,那么我如何识别系统应该和不应该使用的实体?例如,在Pong游戏中,桨和球都与窗口边界碰撞。但是,每个碰撞处理系统将有所不同,因此系统不应处理错误类型的实体。 void PlayerCollisionSystem::update(std::vector<Entity *> entities) { typedef std::vector<Entity *>::iterator EIter; for (EIter i = entities.begin(); i != entities.end(); ++i) { Entity *player = *i; // How do I verify that the entity is a player? // Get relevant components. PositionComponent *position = player->getComponent<PositionComponent>(); VelocityComponent *velocity = player->getComponent<VelocityComponent>(); SpriteComponent *sprite = …

3
如何在实体组件系统中避免“斑点系统”?
目前,我面临以下问题: 我正在尝试通过使用实体组件系统(ECS)来编写pong克隆。我自己写了“框架”。因此,有一个类管理具有所有组件的实体。然后是组件类本身。最后是我的系统,它仅获取具有系统所需组件的所有实体。 因此,例如,我的运动系统会查找具有位置分量和运动分量的所有实体。位置分量仅保持位置,而运动分量则保持速度。 但是实际的问题是我的碰撞系统。这个类就像一个逻辑blob。我在这堂课上有很多特殊情况。 例如:我的桨可能会与边框碰撞。如果发生这种情况,其速度将设置为零。我的球也可能与边界碰撞。但是在这种情况下,它的速度仅反映在边界的法线上,因此可以反映出来。为此,我给球添加了一个额外的物理组件,它告诉:“嘿,这件事并没有停止,它反映了这一点。” 因此,实际上,物理组件没有实际数据。它是一个空类,仅用于告诉系统对象是否反射或停止。 然后是这样:当球与球拍或边框碰撞时,我想渲染一些粒子。因此,我认为球必须具有另一个组件,该组件告诉碰撞系统在碰撞时创建粒子。 然后,我想要一个可以与桨碰撞但不能与边界碰撞的力量提升器。如果发生这种情况,通电将消失。因此,我需要更多的情况和组件(以告诉系统某些实体只能与某些其他实体发生碰撞,即使某些其他实体确实可以发生碰撞,机器人也不能与所有实体发生碰撞,此外,碰撞系统还必须对这些实体施加动力桨等,等等。)。 我看到实体组件系统是一件好事,因为它很灵活,并且继承没有问题。但是我现在完全陷入困境。 我觉得太复杂了吗?我该如何应对? 当然,我必须创建实际上负责“碰撞后”的系统,因此碰撞系统只会告诉“是的,我们在最后一帧发生碰撞”,然后有许多“碰撞后”系统所有这些都需要不同的(组合)组件,然后更改组件。例如,将有一个运动后碰撞系统,该系统停止发生碰撞时必须停止的东西。然后是一个反映事物等的物理后碰撞系统。 但这似乎也不适合我,因为例如: 我的运动碰撞后系统将需要具有位置分量,运动分量和碰撞分量的实体。然后,它将实体的速度设置为零。 物理后碰撞系统将需要具有位置成分,运动成分,碰撞成分和物理成分的实体。然后它将反映速度矢量。 问题很明显:运动后碰撞需要实体,这些实体是物理后碰撞系统中实体的子集。因此,两个碰撞后系统将对相同的数据进行操作,其结果是:尽管实体具有物理成分,但碰撞后速度为零。 这些问题一般如何在实体组件系统中解决?这些问题甚至很常见吗?如果是,那么应该怎么做以及如何做呢?

3
如何在基于组件的游戏中更新实体状态和动画?
我正在尝试设计一种基于组件的实体系统,以供学习(以及以后在某些游戏中使用),并且在更新实体状态时遇到了一些麻烦。 我不想在组件内部使用update()方法来防止组件之间的依赖关系。 我目前要记住的是,组件保存数据,而系统更新组件。 因此,如果我有一个简单的2D游戏,其中包含一些具有“变形”,“运动”,“状态”,“动画”和“渲染”组件的实体(例如玩家,敌人1,敌人2),我认为我应该拥有: 一个MovementSystem,用于移动所有Movement组件并更新State组件 还有一个RenderSystem,用于为每个状态更新Animation组件(animation组件应具有一个动画(即一组帧/纹理),并对其进行更新意味着选择与当前状态相对应的动画(例如,jumping,moving_left等),以及更新框架索引)。然后,RenderSystem使用与每个实体的Animation的当前帧相对应的纹理更新Render组件,并将所有内容呈现在屏幕上。 我已经看到了一些像Artemis框架的实现,但是我不知道如何解决这种情况: 假设我的游戏包含以下实体。每个实体都有一组状态和每个状态一个动画: 播放器:“ idle”,“ moving_right”,“ jumping” 敌人1:“上移”,“下移” 敌人2:“向左移动”,“向右移动” 为了更新每个实体的当前状态,最常用的方法是什么?我唯一能想到的就是为每个实体组分别具有单独的系统以及单独的State和Animation组件,因此我将拥有PlayerState,PlayerAnimation,Enemy1State,Enemy1Animation ... PlayerMovementSystem,PlayerRenderingSystem ...但我认为这很不好解决方案并打破了拥有基于组件的系统的目的。 如您所见,我在这里很迷路,因此非常感谢您的帮助。 编辑:我认为使这项工作如我所愿的解决方案是: 使statecomponent和animationcomponent具有足够的通用性,可用于所有实体。它们包含的数据将成为修改诸如播放动画或可用状态之类的修改器。–字节56 现在,我试图弄清楚如何设计这两个通用组件,以便我可以重用它们。可以为每个状态(例如,步行,跑步...)设置UID并将动画存储在地图中并由该标识符作为键的AnimationComponent中吗?

3
组件实体系统-更新和呼叫订单
为了使组件能够更新每一帧(并使此功能不包含在不需要的组件中),我想到了制作一个UpdateComponent组件的想法。诸如MovableComponent(保持速度)的其他组件将从IUpdatable抽象类继承。这迫使MovableComponent实现一个Update(gametime dt)方法,而另一个RegisterWithUpdater()实现提供UpdateComponent了指向的指针MovableComponent。许多组件可以执行此操作,然后UpdateComponent可以调用其所有Update(gametime dt)方法,而不必关心它们是谁或什么。 我的问题是: 这看起来像是正常的东西还是任何人使用的东西?我在这个问题上找不到任何东西。 我该如何维护物理等组件的顺序,然后更改位置?这有必要吗? 还有什么其他方法可以确保应处理的每一帧实际上都得到处理? 编辑 我想我将考虑如何为实体管理器提供可更新的类型列表。然后,该类型的所有组件都可以更新而不是针对每个实体进行管理(无论如何,它们只是我系统中的索引)。 仍然。我的问题对我仍然有效。我不知道这是否是理性/正常的,还是其他人倾向于这样做。 另外,失眠症患者也很棒! /编辑 为前面的示例精简代码: class IUpdatable { public: virtual void Update(float dt) = 0; protected: virtual void RegisterAsUpdatable() = 0; }; class Component { ... }; class MovableComponent: public Component, public IUpdatable { public: ... virtual void Update(float dt); private: ... …

3
创建实体作为聚合
我最近询问了如何将实体与其行为分开以及与本文相关的主要答案:http : //cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ 这里讨论的最终概念是:作为纯聚集体的对象。 我想知道如何使用C#将游戏实体创建为纯聚合。我还不太了解如何运行的概念。(也许实体是实现特定接口或基本类型的对象的数组?) 我当前的想法仍然涉及为每种实体类型都有一个具体的类,然后实现相关的接口(IMoveable,ICollectable,ISpeakable等)。 我如何才能完全将实体创建为聚合,而又没有该实体的任何具体类型?


2
如何通过缓存友好的组件存储安全地支持组件到对象的通信?
我正在制作一个使用基于组件的游戏对象的游戏,但是我很难为每个组件实现一种与其游戏对象进行通信的方式。我将不解释所有内容,而是解释相关示例代码的每个部分: class GameObjectManager { public: //Updates all the game objects void update(Time dt); //Sends a message to all game objects void sendMessage(Message m); private: //Vector of all the game objects std::vector<GameObject> gameObjects; //vectors of the different types of components std::vector<InputComponent> input; std::vector<PhysicsComponent> ai; ... std::vector<RenderComponent> render; } 在GameObjectManager拥有所有的游戏对象及其组件。它还负责更新游戏对象。它通过按特定顺序更新分量向量来实现。我使用向量而不是数组,因此可以同时存在的游戏对象数量实际上没有限制。 class GameObject …

1
基于组件/实体的设计+行为树=>如何集成?
在我当前的项目中,我实现了一个基于组件/实体的系统,基本上遵循了大多数最佳实践,但是这个未定义的领域却存在。 因此,我得到了(略微扩展的)实体,它们基本上是一个intID,一个人类可读的名称,一个std::map组件和一个long“类型指示符”,用于显示存在哪些组件(我enum对所有组件有2的幂类型,并且每当将一个组件添加到Entity时,我都会通过按位操作自动更改该长度,比较此答案)。 然后是Components,也很简单:intID,enum作为组件类型,父Entity指针以及std::map该组件拥有的所有属性。 最后,一些处理实际逻辑处理的系统/管理器。他们首先检查当前处理的实体是否具有匹配的long“类型指示器” =该系统的所有必需组件都已存在。然后,如果需要,它将访问一些属性,并直接调用相应组件中的某些函数或发送一些消息(通过消息分发程序)。 底线:到目前为止,一个相当标准的事件驱动的基于组件/实体的系统与数据驱动的方法相结合(比较,组件没有硬编码的数据变量,而是作为(某些)组件的通用映射组件的/ archetypes将在以后从文件中读取,并且可以选择添加其他数据,这不是实际组件代码的一部分。 现在,我还要在该项目中引入“ 行为树”(基于AiGameDev BTSK),但是我不确定是否以及如何将它们链接到现有组件,或者通常如何集成这些设计。 我想到了几个相关的想法/观点/问题: 我的BT将再次从文件中读取。目前,我很难理解如何最好地BT Action在该树中的a和应用程序中的实际编码之间建立联系。是否应该在BT文件中使用的动作名称和指向实际逻辑实现的函数指针之间建立某种映射?解决该问题的通常方法是什么? 我假设我必须为所有不同Entity类型创建BT (因此,对于我多次提到的长“类型指示器”所指示的每种与游戏逻辑/人工智能相关的组件组合)。结果,将BT Action实现放入组件中没有意义,因为每个动作很可能会涉及许多组件,不是吗? 那么BT Action逻辑是否应该位于一个/多个单独的系统中(想法1的映射所指向的系统指向的方法)?然后,系统将根据我的long“类型指示器” Entity检查当前是否已检查BT并被告知执行特定操作(=系统中的方法)的BT(实际上具有必需的组件)。但是,如果不是这样(例如,因为BT创建者确实忽略了特定情况,即在运行时可能不再将必要的组件附加到Entity),则什么都不会发生。 问题: 是否有经过验证的集成概念? 您对我上面的三点有何看法? 在我的基于组件/实体的设计方面,还有其他需要考虑的事情吗?

2
实体系统中的多种运动源
我对实体系统这个概念还很陌生,已经阅读了很多东西(最有用的是这个很棒的博客和这个答案)。 尽管我在理解如何通过不确定数量的源操纵对象的位置这样简单的事情上遇到了一些麻烦。 也就是说,我有我的实体,该实体具有职位组成部分。然后,我在游戏中发生了一些事件,告诉该实体在给定时间内移动给定距离。 这些事件可以随时发生,并且具有不同的位置和时间值。结果是将它们混合在一起。 在传统的OO解决方案中,我会有某种MoveBy类,其中包含距离/时间,以及在我的游戏对象类内部的数组。每帧,我都要遍历所有MoveBy,然后将其应用于该位置。如果a MoveBy已达到结束时间,请从阵列中将其删除。 对于实体系统,我对如何复制这种行为感到有些困惑。 如果一次只有一个,而不是能够将它们复合在一起,那将是相当简单的(我相信),并且看起来像这样: PositionComponent 包含 x, y MoveByComponent 包含 x, y, time Entity同时具有a PositionComponent和aMoveByComponent MoveBySystem查找具有这两个组成部分的实体,并将的值添加MoveByComponent到中PositionComponent。当time到达,它会从该实体的组件。 我对于在很多情况下如何做同样的事情有些困惑。 我最初的想法是我会: PositionComponent,MoveByComponent与上述相同 MoveByCollectionComponent其中包含MoveByComponents 的数组 MoveByCollectionSystem查找具有PositionComponent和的实体,并在MoveByCollectionComponent其中的MoveByComponents中进行迭代,并根据需要应用/删除。 我猜这是一个更普遍的问题,具有许多相同的组件,并且希望有一个相应的系统对每个组件起作用。我的实体将其组件包含在组件类型->组件的哈希中,因此每个实体严格只有一种特定类型的组件。 这是看待这个问题的正确方法吗? 实体是否应该始终始终只有一种给定类型的组件?

3
基于实体组件系统的引擎
注意:我正在用Javascript编程,但是在大多数情况下,它应该与语言无关。 我正在考虑将引擎转换为基于ECS的引擎。 我有基本的想法(注意:这是错误的,请参见我的回答): 实体是游戏对象。 组件是可以“粘合”到实体的功能(reactToInput())或状态(position)的一部分。 系统具有它们管理和更新的实体的列表。 但是,我不确定我是否可以获得实现和一些细节... 问题:系统可以在不同种类的实体上运行吗?我通常以Scene在引擎中称为类的示例为例,它现在也将用于此目的。场景是所有可以渲染,更新,影响渲染(灯光)的对象的容器,甚至将来甚至可能是2DSoundEmitter对象。它具有一个高级界面,因此用户无需担心他正在播放的对象的类型scene.add()以及所有类似的东西。 我意识到这Scene可能是一个系统。它接受实体,进行存储,然后可以调用其更新方法,甚至可以进行一些状态更改。但是,有一个问题:如上所述,Scene可以为不同类型的对象喂食!例如,在场景中既包含可渲染对象(“可绘制对象”)又包含灯光的情况下,我该怎么办?互动之前,我应该让它进行类型检查吗?或者,我应该在更低的层次上解决它:制作一个LightSource可以添加到任何对象的组件,并且灯光将仅仅是具有LightSource和Position组件的实体。可以接受吗? 另外,仍然使用常规继承和传统类是否是一个好习惯?例如,我只是不知道我Renderer会是什么!它不是一个系统,因为它的唯一功能是获取摄像机和场景,渲染所有内容并应用效果(例如阴影)。它还管理游戏的上下文,宽度和高度,进行翻译……但是它仍然不是系统! 编辑:您是否可以链接在ECS上找到的任何资源?我很难找到好的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.