问题标签 [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.
java - Animate Player using Finite State Machine in Ashley ECS
I have a big school project and I'm developing a Pixel Platformer game using libGDX.
I'm using ECS for the most part, but I've been having trouble rendering my player's animations because I can not distinguish the state of the player or at least the attack ones.
Player State Class
Let me just show you, so I have this "move" states:
Player Animations Enum
But I'll need at least this states for player animation:
And many more has u can see on this packed texture: Player Animations Atlas
PlayerAgent Class:
Animation Code
Code in the AnimationSystem that takes care of the player:
I was thinking of having states inside a state like Grounded -> Idle, Walking. But I still don't know how I can make the player AttackStates.
lua - 如何获得表索引的引用?(lua)
我想获得对表格中某些内容的引用,但是当我尝试时:
我复制价值。我尝试在表之间使用变量:
但这也不起作用
提前致谢 :)
c# - 如何在 MonoBehaviour 中将可变列表公开为只读属性
假设我有这样的东西
并且我希望能够在添加/删除孩子和更换父母时保持这两个链接。理想情况下,我只会创建属性,并确保在添加子项时更新父项,反之亦然。但是将列表公开为属性(甚至是只读属性)-允许我这样做
它不会调用 setter,因此父字段不会正确更新。
我见过人们将 List<...> 暴露为 ReadOnlyCollection<...> 类型的属性,但我不确定统一组件系统是否可以使用这样的属性,也许有更好的方法?另外-也许 IReadOnlyCollection 更好?
我知道我可以做一个游戏对象的层次结构,并使用内置的统一父子关系,但我不希望我的 BodyParts 是具有变换和一切的成熟游戏对象,它只是 RPG 属性和库存的模型系统。该示例也被简化了,最终我希望在该模型中编码的组件之间有更多的逻辑和几种关系。
c# - 从集合持有接口返回类而不是接口
我想创建一个小型实体组件系统示例并创建了一些组件,例如
和
每个组件都实现了一个当前为空的接口IComponent
。当系统循环遍历实体时,我想快速找到相关组件。
我考虑创建一个字典,将组件类型作为键,将当前实体的组件作为值。
我从public Dictionary<Type, IComponent> Components { get; }
我可以使用添加组件myEntity.Components.Add(typeof(Movement), new Movement() as IComponent);
但是我怎样才能返回一个组件?我创建了一个运动系统示例
if (components.TryGetValue(typeof(Position), out Position positionComponent))
崩溃是因为字典的值不返回所需类型本身的组件,而是返回接口。
我怎样才能让它工作?
(是的,我知道我可以使用 ECS 框架,但出于学习目的,我想自己做)
c# - 修改字典值作为输出参数和引用
我想创建一个实体-组件-系统示例。我有像
和
哪个实施
在遍历组件时,我想尽快找到它们。我考虑过创建一个字典,将组件类型作为键,将组件作为值。
有两个问题出现。
如果有人使用
float movementspeed
并尝试添加一个新的 MovementspeedComponent 怎么办?拥有两个浮点数会引发重复键异常。我只能添加实现IComponent
接口的自定义结构组件以防止重复。当我尝试修改组件时,它们不会被引用修改
/li>
有什么建议么?
c++ - 使用模板化函数 c++ 从副本中保存“新”对象
我的想法: 我希望能够使用作为参数传入的组件的副本创建新实体,还可以对未定义数量的组件使用可变参数模板函数。
原因:我想要一种在运行时创建新实体的简单方法。
问题:我的初始代码没有创建组件的副本,而是使用引用并将指针保存在组件数组中。就我目前的知识而言,所需的代码对我来说有点太复杂了。帮助表示赞赏。
理想代码:
到目前为止我的尝试:(在传递组件引用时有效)
我使用的是实体组件系统系统,而 EntityHandle 是对实体的 ID 引用。
CreateEntity 将 id 返回给一个对象。起初我调用 AddComponent(entityHandle, &component) 来添加新组件(它们在我的 ECS 系统中保存为指针)但是当我开始在运行时创建对象以及当我想在循环中创建很多对象时,这变得很烦人。
可能的解决方案?:
使用“new”关键字创建新实体:
但是,这要求我的所有结构组件都具有设置其所有值的构造函数。
编辑: 我在这里可能完全错了,但我认为我要求的是一种将堆栈对象“转换”为堆对象的方法,这可能是不可能的?
c++ - 在实体组件系统中维护多态性
我正在编写一个实体组件系统,我遇到了一个常见问题:组件相互依赖。我将使用一个例子:
假设您制作了一个项目组件,其中包含项目共有的数据(例如,重量)。但是,如果您想制作设备组件怎么办?任何设备也必须是一个项目,所以你有两个依赖组件。这种is-a关系似乎很适合继承,所以我做了一个继承组件。
问题是,我现在需要两个“多态层”,而我编写的枚举标记系统不再工作了。此外,我可能希望稍后将该设备组件分支为更多类型。
那么,如何以多态方式设置和获取这些类型的组件呢?我想我可以在 get_component 方法中对标签进行 if 检查的大列表,但乍一看,这对我来说似乎是一个愚蠢的解决方案。
c# - 为系统循环创建高性能组件池
我正在设置一个非常小的实体组件系统示例,并且组件池存在一些问题。
目前我的实体只是 ID (GUID),这很好。
每个系统都必须实现ISystem
接口
并存储在一个KeyedByTypeCollection
. 该系列确保每个系统都是独一无二的。
每个组件都必须实现IComponent
接口。
通过这样做,我可以将所有不同的组件类型存储到它们匹配的组件池中。每个池都是一个Dictionary<Guid, IComponent>
. 键代表实体的 ID,值是该实体的组件。每个池都存储在一个KeyedByTypeCollection
中,以确保组件池是唯一的。
目前我的EntityManager
课程包含核心逻辑。我不知道是否需要将其设为静态,但目前我的系统需要从中获取一些信息。
处理组件池的重要核心方法是:
我创建了一个小型运动系统用于测试目的:
由于字典查找,这应该没问题。我不确定是否可以优化它,但我认为我必须先遍历所有实体。
这就是问题所在:
我无法使用KeyedByTypeCollection<Dictionary<Guid, IComponent>>
,因为我需要类似的东西
KeyedByTypeCollection<Dictionary<Guid, Type where Type : IComponent>>
我的GetComponentPool
和AddComponentPool
方法抛出错误。
GetComponentPool:无法将 IComponent 隐式转换为 TComponent
调用时,GetComponentPool
我必须将字典值从IComponent
to 转换为TComponent
。
AddComponentPool:无法从 TComponent 转换为 IComponent
打电话时,我必须AddComponentPool
投到.TComponent
IComponent
我不认为强制转换是一种选择,因为这似乎会降低性能。
有人介意帮我解决类型问题吗?
更新:
调试时,我使用此代码来测试整个 ECS
我已经展示了Movement
系统,这里是缺少的组件
c# - 创建对对象的引用并将这些引用保存在缓存中
我想为我的Entity-Component-System中的每个系统创建一个 chache 。目前,每个系统都会遍历所有实体并检查所需的组件。
ISystem
只需要实现一个Run
方法。如果每个系统都必须检查正确的组件,我认为这种方法可能会变得非常慢。
我将所有组件保存到组件类型的池中,这些池存储到集合中。
总是在哪里object
。Dictionary<Type, object>
Dictionary<Guid, TComponent>()
在运行系统时,最好只传递所需组件的集合。
这些是我的EntityManager类中的方法,它们会影响每个系统的缓存
如何创建仅引用所需组件的系统并在调用上面显示的这些方法之一时更新其缓存?
我试图创建一个伪代码示例来说明我的意思
也许可以创建不需要的集合entityId
,因此它们只存储对应该更新的组件的引用。
c++ - 使用 realloc 自定义池化内存分配器
我正在创建 pooled_allocator 以在一个内存块中为我的特定类型的组件分配内存。如何更新存储在某个容器中的已分配 ptrs?
我用通用方法为我的游戏实现了 ECS。我用了
按类型存储我的组件。
这就是我现在为组件分配内存的方式。
所以,现在我想实现一些 pooled_allocator,它应该满足所有 std::allocator_traits 要求,以将它用作我的组件的分配器。但我想让它动态化,所以它应该能够扩展它的内部内存块。
我现在有什么?
问题是 realloc 返回指向另一个已分配块的指针(不同的指针)已分配的对象已复制到新位置,并且存储在 components[typeIndex()] 内的所有 ptrs 变得无效(
我该如何解决?一种选择是返回一些 ComponentHandle 而不是 T*,如果内部内存块已移动,则使用新指针更新所有已返回的句柄,但这会降低分配速度并产生一些限制。
而且我知道 boost::pool_allocator,但是我的游戏太小而无法集成这样的库。