Articles of 实体系统

实体组件系统,武器

我是新来的游戏编程,目前试图通过实施简单的二维游戏来了解实体组件系统devise。 以ECS来说,我的意思是devise, 这里就是一个例子 在我的游戏中,我有不同types的武器:自动,枪,手榴弹等…每种types的武器都有它自己的影响区域(沿着直线射击,手榴弹爆炸并覆盖一些球形区域),破坏影响,视觉效果和子弹量,镜头之间的延迟。 所以我不完全理解如何实现武器。 应该武器是一个实体还是应该是一个组件? 玩家如何拿起武器,在不同types的武器之间切换等等。

如何在实体系统中使用外部库?

我正在实施一个用于教育目的的实体系统。 我想专注于系统本身,对渲染和物理知识不太了解,因此我正在使用外部库来完成这些任务。 这些库为它们的对象(精灵,身体等等)提供了预定义的类。这些不容易融入我的实体系统。 如何在实体系统中利用现有的库和类?

在基于组件的实体实现中,AI系统的组件是什么?

为了围绕基于组件的系统,我开始制作自己的小框架。 不幸的是,我不完全确定系统在某些特定情况下应该如何使用。 例如,我可以理解RenderSystem或CollisionSystem的使用,但是如何实现AI以及组件如何看起来像? 行动时我特别困惑。 行动是否可以作为对象存储在组件中?

XNA实体组件devise:失去了如何包含精灵animation

我一直在阅读关于实体组件的devise,并认为它非常整齐。 我一直试图在XNA中编写一个快速的2D引擎。 我认为我已经为注册和更新实体奠定了基础,因为我创建了一些似乎与我的Camera Entity(一个只拥有ZoomableComponent,PositionComponent,MouseInputComponent的实体)兼容的“PositionComponents”。 所有的教程似乎都在这个devise阶段结束 。 我现在很失去如何devise我的animation/精灵组件。 我知道我想要某种'RenderableComponent',你为它分配一个Texture 我需要某种有限状态机(有限状态机)来保存实体状态 我需要某种animation管理器。 有没有人有任何提示?

实体系统创建组件

在我看到的每个实体系统都用C ++实现,甚至在Java / C#(例如Artemis框架)中实现。 我看到组件没有通过一个新的运算符(或类似的,例如std::make_shared )分配。 例如: entity.addComponent(new Position(32, 4, 5)); entity2.addComponent(new Position(5, 6, 7)); // those two position components that were just created // may/may not be together in memory // or even: // how can you avoid using new here? (in the implementation) entity.addComponent<Position>(32, 4, 5); 这不会损害性能,因为会有caching未命中(因为新的可以从堆中的任何地方分配数据)? 你将如何实现一个系统的方式,每个types的组件连续分配在内存中,所以你避免caching未命中? 我主要想知道如何在C ++中这样做。

ECS,数据库,XML和序列化

我的实体/组件/系统引擎相当漂亮, 我有两个不同的应用程序在同一个可执行文件上工作。 (一个二维卷轴,一个3D小行星型游戏)。 为了获得某些function,我一直在创建游戏的XML定义,并使用一个小的自定义工具来编辑它们,这些工具确保不会添加不存在的组件,而且文件是有效的XML。 我处于一个顶点或者说转折点,因为我使用的工具和stream程确实不适合生产。 手工编辑大型XML文件是一个容易出错,痛苦的过程。 (JSON得到了很好的支持和精辟的操作,但是仍然需要可视化的语法检查。)我可以切换到SQLite等数据库,但是我还没有find一个好的graphics界面(SQL Server Management Studio中的某些东西是很好的) 。 有没有任何COTS工具可以缓解这个过程? 我发现了一个带有基本ORM的C#SQLite实现,但是它不支持像Vector3或Rectangle这样的复杂types。 我可以将这些序列化为string或编辑ORM代码以支持这些types,但是随后我将自己的OSS组件的分支结束,从而使得维护难题进一步恶化。 另一个想法是在SQL Server中完成所有的工作,并从那里生成XML,并且有一个工具可以使数据库模式与我的引擎中的组件types保持同步,这与使用ORM类似。 这个问题有什么好的解决方法? 我已经读过那些比较大的工作室(比如在一个以上的人中)为这种事情建立自己的工具。 我可以这样做,但是我宁愿写我的游戏,也不愿意制作一套只有我才能看到的工具。 澄清:那些使用实体/组件/系统引擎的人如何创建和维护定义游戏的数据?

实体组件体系结构中的系统function

我开始与ECS合作,但我不完全确定自己的理解正确。 正如我现在看到的 – 系统可以实现碰撞,移动的逻辑,类似的东西。 但是专门用于挖掘游戏逻辑的系统是否正确? 它具有挖掘动作的方法,它还设置animation组件来播放“挖掘”animation,并侦听关于animation完成的事件,然后执行挖掘动作。 我做对了吗?

何时不使用ECS架构?

我熟悉实体 – 组件系统架构的概念,以及它比传统类树的优势。 这就是说, 有没有一种情况下, 不希望使用实体组件系统架构?

基于组件的devise是一种架构模式还是devise模式?

在像Unity这样的引擎的游戏开发中使用基于组件的范例时,基于组件的devise是一种架构模式还是devise模式? 我甚至可以说基于组件的devise是我的游戏的“主要”架构模式吗? 我认为架构模式比devise模式更高级。 游戏开发环境中的基于组件的devise(如使用Unity引擎)似乎适合作为一种架构模式给我。 然而,在一些网站上,我读到基于组件的devise是一种行为模式,与其他行为devise模式非常相似,而不像MVC这样的架构模式。

我应该使用另一个模板函数来包装模板函数,还是…?

我目前正在使用C ++制作一个实体系统,而且我自己也在质疑我应该如何连接一些方法。 特别是在我的实体和ComponentManager类。 ComponentManager管理特定世界中所有实体的所有组件。 它可以添加/删除/确定一个组件是否存在等现在检索一个组件,我正在考虑使用模板函数,这样看起来更整洁,并没有多less强制转换(方法外)。 但是,我想通过一个实体对象快速访问组件。 例如 entity.getComponent<VelocityComponent>().x = 30; (是的,我知道一个实体只是一个ID,这就是为什么我有我的组件在ComponentManager类,每个实体是由一个ID代表)。 即 ComponentManager的get函数:(组件被存储为二维数组,第一个元素是实体的ID,第二个元素是组件的类types的ID) template <typename Comp> // Comp = Component Comp* getComponent(Entity& e) { return (Comp*)_components[e.getId()][Comp::GetClass().getId()]; } 而实体的get函数: template <typename Comp> Comp* getComponent() { return getWorld().getComponentManager().getComponent<Comp>(*this); } 所以如果我要使用模板函数,我只会有2个模板函数的重复。 当然,这对于向实体添加组件也是一样的。 所以基本上, 用另一个模板函数包装模板函数是一个好主意吗? 我可以,或者在Entity系统模板中创建方法,并使组件管理器中的方法成为非模板函数,即 Component* ComponentManager::getComponent(Entity& e, const Component::Class& componentClassType) const { return _components[e.getId()][componentClassType.getId()]; } 我对我应该做的事情感到困惑。