Articles of 实体系统

在ECS模式中组织关系的正确做法是什么?

我是新来的ECS概念,并尝试用ECS方式重构我的应用程序。 在阅读了一些文章之后,我还是不了解如何组织这种模式的层次结构。 我的问题是 一个组件是否允许有另一个组件? 例如,我看到里面包含一个Mesh的RenderComponent 。 网格也是一个组件或它的原始数据,它应该存储在RenderComponent中? 当组件的一个实例需要被两个实体共享时会发生什么? 如果一个实体应该只是一个整数,你如何组织实体之间的关系? 是否应该有一个父母/子女/关联实体,还是所有这些关系都由系统管理? 谢谢!

如何解决实体系统中的重复数据?

在为我的C ++实体系统 ( C ++ Entity System)进行实例和升级的同时,随机引起了我的注意,令人惊讶的是:重复的数据。 我所指的是一个使用其他库(如Ogre3D,SFML等)的实体系统,它已经存储了一些关于你的实体的信息,它们处理存储在自定义组件中的信息。 问题: 假设您有两个定义组件types,称为: Position组件(其中包含实体的位置)和Velocity组件(其中包含实体正在移动的速度以及正在移动的方向)。 当然,你有一个移动系统,移动一个Position和Velocity组件附加到它的实体。 现在…这里是棘手的部分,你将如何有效地存储位置组件,以便您不重复数据? 通过重复数据,这就是我的意思(这是一个简单的例子):一个Sprite对象通常拥有它自己的x / y位置(例如, SFML的Sprite类 ),因此如果我有一个Position组件它自己的x / y值,那么我会复制数据,我不? 我想过在Position组件中使用指针/引用*,但是如果我想将实体保存到文件中,这并不是真的。 *是的,我知道sizeof(float) == sizeof(float*) ,但是sizeof(vec2/3) != sizeof(vec2/3*) 。 起初这似乎并不是什么大问题,但如果我有更大的对象来存储,比如: 网格: 我如何将一个Mesh有效地存储在一个组件中? 我正在考虑将一个string存储到网格数据所在的位置,但后来我想,如果它不在文件中呢? 我该如何解决? 我也想过将原始数据存储在组件中,但是如果我使用第三方graphics库(如Ogre3D或Irrlicht),则需要通过另一个对象实际创建Mesh数据。 所以,总结的问题是:在游戏中使用实体系统devise来减less重复数据的最佳方法是什么? 我是否必须从头开始重新创建所有的东西,以便它适合我的实体系统? 我宁愿不这样做,特别是如果我决定改变我用来制作游戏的devise模式。

六角形瓦片系统和类的高效使用

所以我已经建立了自己的一个课程系统,我认为这是一个有效的方式来描述一个可以生活在我的游戏中的实体。 这是一个有效的方法,还是我创建的实体太大? 我希望游戏能够很好的运行,即使有一些瓦片。 我看了这篇文章( 有2000万块地图,使得游戏内存耗尽,我怎么能避免它? )关于有一百万个tile和内存问题,我担心我使用实体系统创建的tile系统将会不能处理如此庞大的地图,因为有太多的信息需要处理。 为了让你了解一个hex实体的每个组件的含义,精灵组件保持以下variables:纹理,位置,旋转,高度和宽度; 而hex实体的hex格式则保留:位置,棋盘上的坐标,方向以及与之相邻的hex。 我应该简化datetypes吗?

如何使用实体组件系统使用子弹物理?

我有一个实体组件系统,我想要一个Physics组件,将给定的对象添加到物理模拟。 我的问题出现了,因为Bullet API要求我在模拟之前添加每个对象。 我应该如何继续创建一个系统(实体组件系统中的系统),它包装子弹物理API做模拟,而Physics组件正在被添加和删除? 编辑: 这就是我的实体组件系统的样子。 class Entity { std::unordered_map< size_t, void* > components; public: // setters getters for components based on key } class EntitySystem { std::unordered_map< size_t, Entity* > entities; // maps entity GUID to entity* public: // calls function on all entities void Process( void* userdata, void (function*)(void*, Entity*) ); // Entity […]

如何干净地序列化/ de序列化一个字典的值是一个派生类使用c#newtonsoft json

我正在和实体组件系统,我正在存储实体作为JSON文件。 组件作为组件字典存储在实体中。 我正在使用newtonsoft的JSON库。 经过很多挫折后,我设法序列化一个字典,使用ItemTypeNameHandling属性来存储从Component派生的对象 组件类: class Component { protected String name; public String Name { get { return name; } } } 派生组件的示例: [JsonObject(MemberSerialization.OptIn)] class Position : Component { [JsonProperty(Required = Required.Always)] public int x = 50; [JsonProperty(Required = Required.Always)] public int y = 20; public Position() { this.name = "position"; } } 实体类与词典: class […]

实体组件 – 从实体系统获取对象而不知道它的ID

我一直在使用实体组件系统构建游戏,但即时通讯在查找实体系统中的特定对象时不知道实体的标识有点问题。 我的游戏是按层组织的,每层都拥有自己的一套系统,比如实体系统,渲染系统,碰撞等。 现在,游戏有两层。 封装所有游戏对象及其数据的游戏层,以及容纳所有UI控件的Hud层。 (暂停,重新启动等)。 我希望能够做的是,一旦某个特定的事情发生在游戏层,比如死亡的敌人,我希望能够与Hud层进行交stream,告诉button出现或者禁用自己等等。问题是,我无法find该button,因为我没有Id来查询Hud图层实体系统中的button,并且在游戏启动时创建button后,对button的引用会丢失。 我已经考虑实现一个消息队列types的东西,或者使用某种发布/订阅模式,但问题仍然是如何可以将这个变化传达给一个对象谁是我不知道。 我想到的一个解决scheme是给所有UI元素唯一的名称。 这样,无论何时我需要在UI中进行更改,我都可以向Hud Layer实体系统查询具有该名称的实体,并获取其参考。 但是那完全毁了一个拥有唯一标识的实体,因为它现在依靠使用名字来标识。 有什么办法可以解决这个问题吗?

一个系统应该能够渲染的东西? (ECS)

我目前正在构建一个实体组件系统,我只是有一个问题…应该允许系统渲染东西到屏幕上? 例如,我应该创建一个包含Sprite的SpriteComponent,然后创建一个将Sprite渲染到屏幕上的SpriteRenderSystem? 还是应该渲染实体由其他东西完全管理? 我问的原因是因为我在许多论坛上读过,允许系统渲染是一个坏主意。 但我不明白这是为什么, 如果我的游戏中的游戏对象是使用ECS来表示的,那么我将如何去渲染对象到屏幕呢?

超类RPG游戏实体

我在RPG游戏的devise过程中,在游戏开发中我没有任何经验。 这个问题是关于如何使用OOP类来处理实体管理。 我的思路如下: 具有基本的update()函数的实体接口 “凡人”类和“NPC”类实体 “英雄”和“怪物”类inheritance了“凡人”类 在这种情况下,凡人类都是具有诸如HP和MP等状态的那些实体。 NPC是自我解释的。 我相信我的方法是天真的,所以我想知道利弊,什么是更好的方法来处理这个问题。

在游戏引擎中替代实体系统?

我一直在开发一个游戏引擎。 我想知道我应该使用什么组件系统。 我已经阅读了实体组件系统,但还有什么其他的select? search整个游戏世界中所有实体的“主列表”的想法似乎效率低下且缓慢。 我需要最有效率的(3D和2D,如果有的话)。 使用面向对象编程(C ++)

在实体组件引擎中获取组件到它们各自的系统

我在stackoverflow问这个问题,但我没有得到任何答复。 我认为这个交换更适合。 我正在构建一个各种各样的游戏引擎(纯教育游戏),我不确定当使用系统共享的对象时,保持大型系统解耦的最佳方式。 我的引擎正在使用一个实体组件devise,其中组件只包含状态。 系统是使这些组件运行的驱动力,所以我需要能够在各自的系统上注册组件。 我只是不确定如何通过层次结构看起来像这样的组件: 我可以想到一些处理这个问题的方法。 选项1:单身。 如果我使我的引擎对象单身我可以使用静态方法直接在我的input组件绑定到input系统。 class InputComponent: public Component { InputComponent() { Engine::getEngine()->getInputSystem()->bindInputComponent( this ); } virtual ~InputComponent() { Engine::getEngine()->getInputSystem()->unbindInputComponent( this ); } } 这有利于组件自动绑定和解除绑定到他们的系统,这是方便的。 它有一个单身人士(不一定是坏的,但它可能会使我的引擎在未来僵化)和InputComponent“知道”InputSystem这可能是坏的devise的失败。 scheme2:从现场系统下来。 我可以让我的场景系统负责绑定和解除绑定组件。 class SceneSystem: public System { void setActiveScene( Scene* scene ) { // Deactivate (and unset components) for the current scene. unsetActiveScene(); for( auto […]