问题标签 [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.
c++ - 在 dll 的模板化方法中使用外部类
我正在尝试将我的游戏引擎用于外部项目。一切正常,但是当我尝试创建自定义组件时遇到问题(继承自 ABhaviour,ABhaviour 是一个抽象类,表示可以激活/禁用的组件)。
GameObject.h (使用 __declspec(dllexport) 导出)
在另一个项目(使用我的游戏引擎)中,我正在尝试创建自定义 ABehaviour :
玩家控制器.h
之后,我将自定义组件添加到我的“玩家”游戏对象中:
主文件
Visual Studio 很不高兴,给我打印这个:
输出窗口:
我认为问题出在我的游戏引擎(这是一组 DLL)正在导出模板化方法(AddComponent 和其他方法,如 GetComponent)。
- 是否可以使用 dll 中的模板化方法和项目中的类/结构模板参数使用 dll ?
- 难道我做错了什么 ?
- 我是否需要在我的 PlayerController 上指定某些内容以使其在 AddComponent 方法中“已知/可用”?
c++ - 存储所有类实例的向量,并调用它们的成员函数
如何创建一个存储类的所有实例的向量?那么我如何迭代它们并调用它们的成员函数之一呢?
这是我一直在尝试做的一个简明示例。
但是 renderEntities() 没有做任何事情。如果我使用例如 player->Draw,则 Draw 成员函数有效。我要么搞砸了向量或迭代器,要么搞砸了两者,我不知道如何修复它。我尝试过使用引用和指针,我认为这是要做的事情,但是每当我尝试使用时,我都会遇到无法修复的错误。
更新:感谢所有帮助,我学到了很多东西。但是我的 render_entities 函数仍然没有做任何事情。这是所有的代码。
任何以 terminal_ 开头的函数调用都来自 BearLibTerminal 库。
主文件
实体.h
实体.cpp
在 main.cpp 中,在 handle_input() 的底部,您将看到...
unity3d - Unity 现在推出了自己的依赖注入框架。Inject 的未来在哪里?
Unity的Entity Component System数据驱动设计,引入了自己的DI框架,甚至包括[Inject]字段属性。
Zenject 将如何融入其新的编码范式?
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
放在首位。
c++ - 实体组件架构:想要拆分大实体 -> 难以重构
在开发的第一步,我设计Car
和AI
作为一个实体。
它工作得很好(伪代码): -
后来,我想要一个新功能:switch in-out Driver(影响AI)。
我拆分实体,如下图所示:-
上面的代码将更新为:-
问题
它在更改前后都运行良好,但很难维护。
如果版本 1 中有N
车辆类型,例如,truck, motercycle, plane, boat, rocket
我
将不得不编辑N*2
可能已经分散在很多地方的行.cpp
。
主要问题:如果我忘记重构任何代码,它仍然可以正常编译。
问题只会出现在运行时。
在现实生活中,每当新设计希望将实体划分为许多更简单的实体时,我都会遇到这样的问题。
重构总是只是添加另一个间接。
问题
假设在version1中,我不希望我想要切换进/出驱动程序。
有没有可能防止这个问题?如何?
swift - Swift 中的实体组件
我正在尝试使用类似于此处描述的实体组件架构构建一个简单的 iOS 游戏。
我想在我的游戏中实现的是当用户触摸屏幕时,检测触摸发生的位置并将一种类型的所有实体移向特定方向(方向取决于用户触摸的位置,屏幕右侧 = 向上,左侧屏幕 = 向下)。
到目前为止,游戏真的很简单,我才刚刚开始,但我被这个简单的功能困住了:
我的问题是 anSKAction
应该在一种类型的所有实体上运行,但根本不会发生。
在我将游戏重新设计为 ECS 方法之前,它运行良好。
这是GKEntity
我在 Lines.swift 中声明的子类:
在TouchesBegan
我调用Move(XAxisPoint: t.location(in: self))
声明的函数时,GameScene
这是什么Move()
:
我猜这行代码有一些问题,Line.component(ofType: SpriteComponent.self)?.node
但是编译器没有抛出任何错误,我不确定我的错误在哪里。
任何帮助/指导将不胜感激!
c# - 统一安装(实体组件)包时出错
我遵循的步骤:
下载最新版unity 2018.2.0f2
安装统一后,我更改了脚本运行时版本 4.x
然后我尝试从包管理器安装实体包,但出现以下错误:
解析包时出错:
无法将一个或多个包添加到本地文件系统: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)
有人可以帮我解决这个问题吗?提前致谢。
c++ - 使用字节向量作为其他类型的原始存储是一种好习惯吗?
我已经开始关注 YouTube 上的 ECS 教程,而且我从未见过有人将新变量分配到 a vector
ofuint8
之前。
(有问题的完整代码可以在这里找到;Array
这里是#define Array std::vector
)
它与使用指针向量有何不同,为什么它更好?
c++ - 检查抽象元素列表是否包含 C++ 中某个派生类型的元素?
你好!
C++ 问题!
我想检查(在C++中)包含抽象类型 A 的对象的向量是否包含 B 类型的对象,其中 B 是从 A 派生的类。
为什么?
我需要这个的原因是我试图在C++中实现一个基本的实体组件系统。
因此,每个组件类型都将派生自一个抽象类,这将让我将它们全部存储在同一个向量中。
但我确实需要某种方式来了解实体附加了哪些类型的组件。所以我也需要某种区分方式,而这正是我真正需要帮助的地方!
这是一个示例代码,非常简单地说明了我要实现的内容:
……
所以在:
test.contains(B); 应该是真的。
test.contains(C); 应该是假的。
顺便说一句,我知道 StackOverflow 中有一些与此问题类似的问题,但我看到的每一个解决方案都是特定于编程语言的,不适用于 C++。
至少据我所知。
谢谢!
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
将组件放入地图中。
我的确切错误是: