我理解ECS模式及其旨在解决的问题。但是我很难找到识别组件的最佳方法。
例如,我正在制作一个你有船的游戏,你可以攻击其他玩家/ npc并收集资源。
我是否需要为每个属性创建一个组件,还是可以将明显不相关的属性分组到同一个组件中?
例如,每个属性的组件看起来像这样:
// Components
Position {
int x, y;
}
Velocity {
int speed;
double direction;
}
Sprite {
Image[] images;
}
Health {
int health;
}
Name {
String name;
}
Resource {
// Tag for resources.
}
// Entities
MapEntity {
Position position;
Sprite sprite;
}
ResourceEntity {
Position position;
Sprite sprite;
Resource resource;
}
ShipEntity {
Position position;
Sprite sprite;
Velocity velocity;
Health health;
Name name;
}
每个属性有多个组件,它们看起来像这样:
// Components
MapObject {
int x, y; // Position
Image[] images; // Sprite
}
Resource {
// Tag for resources
}
Velocity { // separated component for static map entities
int speed;
double direction;
}
Ship {
int health
String name;
}
// Entities
MapEntity {
MapObject mapObject;
}
ResourceEntity {
MapObject mapObject;
Resource resource;
}
Ship {
MapObject mapObject;
Velocity velocity;
Ship ship;
}
我认为它不会有所作为,但我正在使用LibGDX的Ashley框架。
答案 0 :(得分:0)
我通常使用使用它们的系统对属性进行分组。
例如,您将拥有一个动画系统和一个渲染系统。然后,您将拥有一个包含所有纹理相关数据的纹理组件,以及一个包含所有动画相关数据的动画组件。
如果您有一些由多个系统使用的数据,那么请将它们分开,就像保存实体位置,旋转,大小等的变换组件一样。然后动画系统和渲染系统将使用它们。
在您的示例数据中,您将位置和速度保持在同一个组件中,因为它们很可能都用于计算实体的位置。
但是,这些都不是设置规则,您可以将所有组件分开,这将在以后为您提供更大的灵活性。例如,您可能希望稍后添加一个系统,该系统仅适用于具有速度的实体。将组件分开后,您可以从组件创建族,而不对当前系统进行任何更改。如果在变换组件中有速度,则必须将其分离以创建族或使用变换组件并在系统中添加一些条件。