问题标签 [entity-component-system]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
44 浏览

c++ - 在 dll 的模板化方法中使用外部类

我正在尝试将我的游戏引擎用于外部项目。一切正常,但是当我尝试创建自定义组件时遇到问题(继承自 ABhaviour,ABhaviour 是一个抽象类,表示可以激活/禁用的组件)。

GameObject.h (使用 __declspec(dllexport) 导出)

在另一个项目(使用我的游戏引擎)中,我正在尝试创建自定义 ABehaviour :

玩家控制器.h

之后,我将自定义组件添加到我的“玩家”游戏对象中:

主文件

Visual Studio 很不高兴,给我打印这个:

输出窗口:

我认为问题出在我的游戏引擎(这是一组 DLL)正在导出模板化方法(AddComponent 和其他方法,如 GetComponent)。

  • 是否可以使用 dll 中的模板化方法和项目中的类/结构模板参数使用 dll ?
  • 难道我做错了什么 ?
  • 我是否需要在我的 PlayerController 上指定某些内容以使其在 AddComponent 方法中“已知/可用”?
0 投票
5 回答
447 浏览

c++ - 存储所有类实例的向量,并调用它们的成员函数

如何创建一个存储类的所有实例的向量?那么我如何迭代它们并调用它们的成员函数之一呢?

这是我一直在尝试做的一个简明示例。

但是 renderEntities() 没有做任何事情。如果我使用例如 player->Draw,则 Draw 成员函数有效。我要么搞砸了向量或迭代器,要么搞砸了两者,我不知道如何修复它。我尝试过使用引用和指针,我认为这是要做的事情,但是每当我尝试使用时,我都会遇到无法修复的错误。

更新:感谢所有帮助,我学到了很多东西。但是我的 render_entities 函数仍然没有做任何事情。这是所有的代码。

任何以 terminal_ 开头的函数调用都来自 BearLibTerminal 库。

主文件

实体.h

实体.cpp

在 main.cpp 中,在 handle_input() 的底部,您将看到...

0 投票
0 回答
1379 浏览

unity3d - Unity 现在推出了自己的依赖注入框架。Inject 的未来在哪里?

Unity的Entity Component System数据驱动设计,引入了自己的DI框架,甚至包括[Inject]字段属性。

https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/Documentation/content/ecs_in_detail.md#injection

Zenject 将如何融入其新的编码范式?

0 投票
1 回答
3084 浏览

c# - 如何将实体传递给作业以添加组件?

编辑:见下面我的编辑)

为了在使用 ECS 时减少样板,我将这段代码变成:

前:

后:

在那之前,一切正常。直到我尝试在每个实体初始化后为其添加一个组件。

它提出了:

InvalidOperationException:NativeArray MyJob.Group.Entities 必须在作业 MySystem:MyJob 中标记为 [ReadOnly],因为容器本身标记为只读。

但是,如果我确实将其更改为[ReadOnly],它会抱怨我在到达该行时对其进行了编辑CommandBuffer.AddComponent

还有哪个容器提到被标记ReadOnly

是否有另一种方法可以将EntityArray(或向 index 的实体添加组件i)提供给作业,而不需要示例 1 中的所有样板代码?

编辑:如果我像这样手动喂它,仍然会抱怨:

这不就是我们应该做的吗?在这里完成:https ://forum.unity.com/threads/some-beginner-questions-about-pure-ecs.524700/#post-3449277

EDIT2:我在他的代码中发现的唯一区别是

并使用EndFrameBarrier. 我升级了我的代码,但收到:

InvalidOperationException:MyJob.CommandBuffer 未在 IJobParallelFor 作业中声明为 [ReadOnly]。容器不支持并行写入。请使用更合适的容器类型。

因此,为什么我把它ReadOnly放在首位。

0 投票
1 回答
58 浏览

c++ - 实体组件架构:想要拆分大实体 -> 难以重构

在开发的第一步,我设计CarAI作为一个实体。
它工作得很好(伪代码): -

后来,我想要一个新功能:switch in-out Driver(影响AI)。
我拆分实体,如下图所示:-

在此处输入图像描述

上面的代码将更新为:-

问题

它在更改前后都运行良好,但很难维护。

如果版本 1 中有N车辆类型,例如truck, motercycle, plane, boat, rocket
将不得不编辑N*2可能已经分散在很多地方的行.cpp

主要问题:如果我忘记重构任何代码,它仍然可以正常编译。
问题只会出现在运行时。

在现实生活中,每当新设计希望将实体划分为许多更简单的实体时,我都会遇到这样的问题。
重构总是只是添加另一个间接。

问题

假设在version1中,我不希望我想要切换进/出驱动程序。
有没有可能防止这个问题?如何?

0 投票
1 回答
442 浏览

swift - Swift 中的实体组件

我正在尝试使用类似于此处描述的实体组件架构构建一个简单的 iOS 游戏。

我想在我的游戏中实现的是当用户触摸屏幕时,检测触摸发生的位置并将一种类型的所有实体移向特定方向(方向取决于用户触摸的位置,屏幕右侧 = 向上,左侧屏幕 = 向下)。

到目前为止,游戏真的很简单,我才刚刚开始,但我被这个简单的功能困住了:

我的问题是 anSKAction应该在一种类型的所有实体上运行,但根本不会发生。

在我将游戏重新设计为 ECS 方法之前,它运行良好。

这是GKEntity我在 Lines.swift 中声明的子类:

TouchesBegan我调用Move(XAxisPoint: t.location(in: self))声明的函数时,GameScene这是什么Move()

我猜这行代码有一些问题,Line.component(ofType: SpriteComponent.self)?.node但是编译器没有抛出任何错误,我不确定我的错误在哪里。

任何帮助/指导将不胜感激!

0 投票
1 回答
1511 浏览

c# - 统一安装(实体组件)包时出错

我遵循的步骤:

  1. 下载最新版unity 2018.2.0f2

  2. 安装统一后,我更改了脚本运行时版本 4.x

  3. 然后我尝试从包管理器安装实体包,但出现以下错误:

解析包时出错:

无法将一个或多个包添加到本地文件系统:com.unity.burst: write EPROTO 101057795:error:140770FC:SSLroutines:SSL23_GET_SERVER_HELLO:unknown protocol:openssl\ssl\s23_clnt.c:797:

com.unity.incrementalcompiler:编写 EPROTO 101057795:错误:140770FC:SSL 例程:SSL23_GET_SERVER_HELLO:未知协议:openssl\ssl\s23_clnt.c:797:

com.unity.package-manager-ui:编写 EPROTO 101057795:错误:140770FC:SSL 例程:SSL23_GET_SERVER_HELLO:未知协议:openssl\ssl\s23_clnt.c:797:

com.unity.textmeshpro:写 EPROTO 101057795:错误:140770FC:SSL 例程:SSL23_GET_SERVER_HELLO:未知协议:openssl\ssl\s23_clnt.c:797:

可能需要重新导入项目来解决问题或手动修改 E:/New Unity Project (3)/Packages/manifest.json 文件。

程序集引用了不存在的程序集“Unity.Burst”(Packages/com.unity.entities/Unity.Transforms/Unity.Transforms.asmdef)

有人可以帮我解决这个问题吗?提前致谢。

0 投票
2 回答
110 浏览

c++ - 使用字节向量作为其他类型的原始存储是一种好习惯吗?

我已经开始关注 YouTube 上的 ECS 教程,而且我从未见过有人将新变量分配到 a vectorofuint8之前。

(有问题的完整代码可以在这里找到;Array这里是#define Array std::vector

它与使用指针向量有何不同,为什么它更好?

0 投票
0 回答
56 浏览

c++ - 检查抽象元素列表是否包含 C++ 中某个派生类型的元素?

你好!

C++ 问题!

我想检查(在C++中)包含抽象类型 A 的对象的向量是否包含 B 类型的对象,其中 B 是从 A 派生的类。

为什么?

我需要这个的原因是我试图在C++中实现一个基本的实体组件系统。

因此,每个组件类型都将派生自一个抽象类,这将让我将它们全部存储在同一个向量中。

但我确实需要某种方式来了解实体附加了哪些类型的组件。所以我也需要某种区分方式,而这正是我真正需要帮助的地方!

这是一个示例代码,非常简单地说明了我要实现的内容:

……

所以在:

  • test.contains(B); 应该是真的。

  • test.contains(C); 应该是假的。

顺便说一句,我知道 StackOverflow 中有一些与此问题类似的问题,但我看到的每一个解决方案都是特定于编程语言的,不适用于 C++。

至少据我所知。

谢谢!

0 投票
0 回答
152 浏览

c++ - 向我的地图添加 shared_ptr 会引发读取访问冲突

所以我正在用 C++ 构建一个游戏引擎,只是为了学习目的。我正在尝试遵循实体组件系统,当我将组件添加到我的实体时遇到问题。

在我的 Entity 类中,我想将该实体的所有组件保存在:std::map<type_index, std::shared_ptr<Component>> components;

当我添加一个组件时,我的 Entity 类的 .h 文件中有这个方法:

在同样的方法中,我也做了一些不同的事情,比如尝试添加组件components[std::type_index(typeid(*component))] = component;而不是使用 emplace,然后我也尝试std::move将组件放入地图中。

我的确切错误是: