Entity component system -> handling components that depend on one another

Posted by jtedit on Game Development See other posts from Game Development or by jtedit
Published on 2013-11-03T13:42:21Z Indexed on 2013/11/03 16:12 UTC
Read the original article Hit count: 361

I really like the idea of an entity component system and feel it has great flexibility, but have a question. How should dependent components be handled?

I'm not talking about how components should communicate with other components they depend on, I have that sorted, but rather how to ensure components are present.

For example, an entity cannot have a "velocity" component if it doesn't have a "position" component, in the same way it cant have an "acceleration" component if it doesn't have a "velocity" component.

My first idea was every component class overrides an "onAddedToEntity(Entity ent)" function. Then in that function it checks that prerequisite components are also added to the entity, eg:

 struct EntCompVelocity() : public EntityComponent{
      //member variables here

      void onAddedToEntity(Entity ent){
          if(!ent.hasComponent(EntCompPosition::Id)){
               ent.addComponent(new EntCompPosition());
          }
      }
 }

This has the nice property that if the acceleration component adds the velocity component, the velocity component will itself add the position component to the entity so dependency "trees" will sort themselves out. However my concern is if I do this components will silently be added with default values and, in the example of adding position, many entities will appear at the origin.

Another idea was to simple have the "Entity.addComponent();" function return false if the component's prerequisite components aren't already on the entity, this would force you to manually add the position component and set its value before adding the velocity component.

Finally I could simply not ensure a components prerequisite components are added, the "UpdatePosition" system only deals with entities with both a position and velocity component, so therefore adding a velocity component without having a position component wont be a problem (it wont cause crashes due to null pointer/etc), but it does mean entities will carry useless unused data if you add components but not their prerequisite components.

Does anyone have experience with this problem and/or any of these methods to solve it? How did you solve the problem?

© Game Development or respective owner

Related posts about architecture

Related posts about entity-system