实体财产制度

代替实体组件系统的典型实现,我已经走了Jason Gregory在Game Engine Architecture中描述的面向数据的路线。 对于几乎每个实体都需要存在的常见属性,这种方法非常有效,例如位置,模型信息和健康状况。

// Common properties namespace Entity { Vector position[MAX_ENTITIES]; int health[MAX_ENTITIES]; Model::ID model[MAX_ENTITIES]; } 

但是当涉及到人物状态,AI行为修饰符和NPC描述等具体信息时呢? 只有less数实体需要这种信息:谁会期望一桶发出任务? 它需要为每个实体离散,所以flyweighting排除。

 // Rare properties namespace Entity { // Character stats int strength[MAX_ENTITIES]; int intelligence[MAX_ENTITIES]; int charisma[MAX_ENTITIES]; // AI behaviour int aggressiveness[MAX_ENTITIES]; int recklessness[MAX_ENTITIES]; } 

我应该咬紧牙关,让每个实体都有相同的数据? 还是有什么我可以做的实体types之间的区别?


编辑:

这是我正在考虑的方法。 希望我可以编程系统来利用这种布局,同时还能避免内存问题。

 // Common entity data bool Entity::active [MAX_ENTITIES]; Vector Entity::position [MAX_ENTITIES]; Quaternion Entity::orientation [MAX_ENTITIES]; Vector Entity::scale [MAX_ENTITIES]; // Entity handles Model::ID Entity::model [MAX_ENTITIES]; // Index into the Model::X properties NPC::ID Entity::npc [MAX_ENTITIES]; // Index into the NPC::X properties Script::ID Entity::script [MAX_ENTITIES]; // Index into the Script::X properties Status::ID Entity::status [MAX_ENTITIES]; // Index into the Status::X properties // Models Material::ID Model::material [MAX_MODELS]; Mesh::ID Model::mesh [MAX_MODELS]; Skeleton::ID Model::skeleton [MAX_MODELS]; // Materials Texture::ID Material::colorMap [MAX_MATERIALS]; Color Material::diffuse [MAX_MATERIALS]; Texture::ID Material::normalMap [MAX_MATERIALS]; Color Material::specular [MAX_MATERIALS]; Shader::ID Material::shader [MAX_MATERIALS]; // You can see where this is going... 

这样做的好处是你只需要为你需要的组件指定数据,而且它和我的资源系统(通过句柄操作)很好地协同工作。 它也允许我以相同的方式处理每个网格,每个animation以相同的方式等等。

如果遇到任何问题,我会发布更多信息。

你可以使用一个实体系统。 我不是指你当前实现一个实体组件系统。 实体系统被devise为取消对实体(游戏对象)的inheritance的使用,以便您可以定义复杂的实体。

如果你还不知道…一个实体系统是一个分成三个主要部分的devise。 第一部分将是一个实体,它定义了一个场景/世界中的一个对象,它通常由一个整数(因为它是标识符)表示,而没有其他*。 实体系统的第二部分是组件,通常由数据结构来表示。 一个组件实际上可以存储任何东西,比如网格,变换(位置,旋转,缩放等),碰撞信息等等。有一点需要注意的是,正如我所说的,一个组件只存储数据并且不包含任何逻辑。 实体系统的最后一部分是系统,系统为你的游戏定义逻辑。 例如,假设你想用InputComponent和PositionComponent移动所有的实体,你需要创建一个MovementSystem,它定义了移动实体的方法(通过PositionComponent,通常是一个叫做processEntities或update的函数)。

*实体不存储他们拥有的组件的列表

注意:一个实体系统不是一个面向对象的devise,你可以用过程语言实现一个,比如C。但是,这并不意味着你必须一起避免所有的类,事实上,它们可以使你受益。

替代实施:

您可以在网上find各种替代实现,例如:

  • 组件不仅定义数据,它们还定义了逻辑,这与Unity3d游戏引擎一起使用(我个人不喜欢这种devise,但是它的工作原理)

  • 实体存储他们的组件列表(在我看来,这是一个非常糟糕的devise,因为你可以从存储在一个位置受益)

例子

一个非常着名的Java实现,Artemis框架: http : //gamadu.com/artemis/

一个C ++实现(这个库是我的): http : //github.com/miguelishawt/anax

进一步阅读

实体系统(页面底部)上有各种链接: http : //gamadu.com/artemis/tutorial.html