Articles of 组件

在使用组件系统时,将现有实体列表传递给新客户端?

我的游戏服务器使用包含组件的实体来表示游戏世界中的一切。 到目前为止,这工作得很好,但是现在我遇到了一个问题,即允许客户端连接到服务器。 基本上服务器需要告诉连接的客户端游戏中所有现有的实体。因为玩家,怪物,树等都是从同一个实体类实例化的,所以我现在没有办法告诉客户每个实体是什么是。 将实体发送到客户端的最好方法是什么,以便客户端知道要向每个客户端添加哪些组件? 我唯一能想到的是在实体上有一个string“名称”,然后像这样发送数据包给客户端… { 'action': 'create-entity', 'data': { 'entity-type': 'dragon', 'x': 300, 'y': 40, } } 所以现在客户端会知道调用“createDragonEntity”函数来创建正确的实体。 有更好的建议吗?

我应该如何实际执行组件的影响?

我在这里问了一个关于实现组件的问题: 我在这个组件架构的正确轨道上? 但是我想问一些更多的问题。 实际执行组件效果的最佳方法是什么? 例如,我有一个项目对象,和一个可选的HealingComponent。 HealingComponent允许物品被用作HealingItem(用于恢复HP / MP /等)。 我从多达3个StatAffectorComponents(一个用于HP,MP和SP)组成治疗组件。 影响者指定目标状态,目标变化量和变化types(%,绝对值等)。 所有的基本组件都在C ++中实现,但是我打算把基本组件扩展到我的脚本(python) 现在我的问题是,我怎么实际执行这个? 我有三个想法如何做到这一点。 允许HealingComponent包含一个Use函数,该函数接受适当的参数,并将StatAffector组件应用于它们。 这样做的好处是,如果使用脚本扩展行为,可以轻而易举地重写/定制行为,但是我也将使用的机制与项目紧密地联系在一起。 允许游戏机制强制组件。 当物品被用作治疗项目时,机制会提取统计影响者并将其应用于自身的适当目标。 这样做的好处是可以将项目/组件从其使用中分离出来,但与此同时,我将不得不在改变机制时随时决定将扩展function/组件添加到修复项目中。 治疗项目在开发过程中可能不会经常改变其效果,但某些项目类别可能会发生 允许项目本身定义它的使用函数,并负责检查它的组件。 这是远离基本实体进一步专门化的项目,但具有被脚本覆盖以允许自定义组件的优点 一般来说,做这件事的最好方法是什么?

基于组件的体系结构中的组件inheritance之后未使用的方法?

我有一个GameObject类,其中包含组件,如: 渲染 相机 行为 刚体 首先, 我从具有Update()方法的Componentinheritance了它们 ,并且在每个游戏对象的每个组件上调用每一帧。 但后来我注意到,**渲染器和相机的更新方法是未使用**。 (像RenderData和CameraData这样的类是由基元分离出来的,在创建这些组件时,这些数据的指针被发送给GraphicsEngine,它将每帧处理它们。) 所以有一个未使用的方法是不好的。 所以我创建了一个DynamicComponent类 ,它inheritance了Component,而Behavior&Rigidbody类是从它inheritance的。 我将Update()从Component移动到了DynamicComponent,并且在gameobjects中有两个容器 : 组件(对于直接从组件inheritance的组件) dynamic组件(用于从D.Compinheritance的组件) 而每一帧我只称为DynamicComponents的更新()。 现在我有另一个问题。 有Behavior类,其中应该是一个Start()方法 ,在场景完全初始化时在每个Behavior上调用它。 这意味着我应该在游戏对象中有一个Components,D.Components和一个Behaviors容器 。 这对我来说很不好 有一个组件类,与开始(),更新()等非常简单,使一个非常干净的代码,但这意味着只有less数派生类实现其虚拟方法。 我该怎么办?

如何干净地序列化/ 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 […]

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

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

如何构建系统是Enity组件系统,在C ++中

在C ++中创建ECS时,构建系统的好方法是什么? 每个系统应该是一个专门的类的静态函数(这是否在语义上不仅仅是一个全局函数?)或者,系统应该是相关组件或“系统管理器”的静态方法? 还是有一些更优雅的方式? (这些方法对我来说都不是很优雅…)

子系统和GameObject组件之间的通信?

目前我有一个架构(不是100%准确): RenderData包含原始graphics,由GraphicsEngine处理。 在创建之后,我必须将渲染数据的指针从渲染器发送到GraphicsEngine。 这是通过传递给GameObject来完成的,GameObject将它传递给Scene,它传递给Core,它将在GraphicsEngine中调用相应的方法。 这个问题是场景可以访问Core。 我怎样才能正确地在GraphicsEngine上注册这些RenderData? 这与用于发送声音的AudioEngine的行为组件相同。 这与刚体组件的刚体数据和物理引擎也是一样的。 但是还有一个问题:如何发送与PhysicsEngine相撞的对象? 我曾经想过在碰撞对象的RigidbodyData处注册对象ID,Renderer会感觉到这一点,并处理自定义行为。 (就像子弹与玩家相撞时发生的情况) 如果这是好的,那么我如何给自定义的脚本指示与另一个游戏对象有碰撞? 在创建Behavior之后,我们将他们的OnCollide方法添加到Rigidbody的数组中? 或者只是将行为存储在通用组件容器中,而不是将这些行为存储在通用组件容器中,只需对它们进行迭代,然后调用OnCollosion? 另一个问题:窗口处理input,并且必须在场景中指示这些行为组件。 所以它已经访问了Scene,并且在接收到input时,它会调用Scene对应的方法来以某种方式传播事件?

游戏对象和组件

我正在用C ++和Qt创建一个相对简单的游戏引擎。 我正在使用Irrlicht进行graphics处理,截至目前,我不会使用任何物理或audio库。 为了时间的缘故,我使用Irrlicht的内置边界框来进行碰撞检测并忽略audio。 这是我想要的: GameObject :具有保证组件的可更新容器。 请注意,可更新对象只是意味着存在一个虚拟函数update,它允许对象根据上次渲染帧的时间进行更新。 可更新是一个抽象类。 TransformComponent :封装存储位置,旋转和大小的责任。 每当属性发生变化时, TransformComponent会发出一个信号,通知其侦听器该属性已经由给定的delta值改变。 GameObject的TransformComponent保持其他组件保持alignment。 例如,改变一个GameObject的TransformComponent的位置将改变GameObject的graphics表示的位置位置及其物理相关信息。 这个信息通过GameObject在实例化时处理的信号和插槽被中继。 请注意,这些组件不知道对方 – GameObject只是简单地处理以下任务:来自给定组件的信号需要与另一个组件的插槽进行通信。 GraphicsComponent :封装渲染和播放animation的责任。 GraphicsComponent有一个TransformComponent ,它存储graphics对象的(Irrlicht-functional)位置,大小和旋转。 请注意,更新GameObject的TransformComponent将更新GameObject的GraphicsComponent的TransformComponent 。 但是,这些* TransformComponent *是松散耦合的,因为可以在不更新GameObject的TransformComponent的位置的情况下更新GraphicsComponent的TransformComponent的位置。 同样,这一切都是通过事件监听器完成的。 PhysicsComponent :封装确定何时与另一个GameObject发生冲突的责任。 这是我有麻烦的地方。 为了做到这一点, GameObject必须知道PhysicsComponent ,而PhysicsComponent必须知道GameObject 。 这不仅是一个循环引用,表示强耦合,而且我的一个组件必须知道它的集合类,这与黑盒重用的整个目的是相矛盾的。 为了好奇,下面是我的游戏对象的一些示例代码: class Player : public GameObject { Q_OBJECT public: Player(); ~Player(); protected slots: void onUpdate(float deltaTime); // virtual […]

游戏系统和组件基础架构中的组件之间的关系?

基于我之前在这里提出的有关将input与实体的其他组件解耦的问题,我在XNA之上开发了一个小型组件体系结构,以了解每件事情是如何工作和共同进行的。 基本上,我的架构有以下组件/服务/系统: 游戏 这是任何游戏的根源,负责勾选游戏循环(更新,绘图)以及实例化所有系统。 GameModule 负责游戏某个方面的游戏模块,比如UI( UIModule ),Input( InputModule ),animation( SpriteAnimationModule ),场景( SceneStackModule )等等。 场景 掌握游戏的当前状态。 基本上是一个实体经理。 🙂 实体 只有一些组件和非常基本的世界空间信息,例如位置,旋转等等的实体 零件 一个实体的组件,可以是任何东西( SpriteComponent , ScriptComponent , ControllerComponent )… 然而现在我似乎有一个问题,就是我的游戏系统(模块)和组件之间的责任问题,这些组件之间并不知晓。 例如,我有一个在我的游戏中实例化的UIModule ,我需要在任何其他系统之前更新/渲染,以便在UI上正确处理input事件。 为此,我需要遍历所有的UIComponent – 不幸的是封装在当前场景中。 而这又只能通过SceneStackModule (场景的LIFO集合)访问。 所以我必须让我的UIModule知道场景的概念(通过使SceneStackModule成为UIModule的依赖),为每个场景创建一个UIModule ,或者使UIModule成为一个依赖,并且注册UIComponent两次(一次在实体中,一次在模块中)。 方法1 public class UIModule : GraphicalModuleBase { public UIModule(SceneStackModule sceneStack) { } public void Draw(GameTime gameTime) { […]

实体 – 组件体系结构中的中央逻辑

我已经建立了一个基于entity-component-system-idea的架构。 所以我得到了 组件 – 只需存储数据 系统 – 在组件上运行 脚本 – 只是脚本types的对象并附加到ScriptComponent。 一个ScriptSystem将在脚本上执行init()和update()函数。 然而,我不知道在哪里放置中央游戏逻辑,因为我必须检查一些关于整个游戏过程的东西,拿着地图,计算点数,检查点数是否足够用于结束屏幕等等… … 我应该创建一个附有这样一个脚本的单一实体,还是有更好的解决scheme呢?