EntityManager
Resumen
El EntityManager
es el núcleo del sistema Entity-Component-System (ECS).
Se encarga de crear, almacenar y administrar todas las entidades y sus componentes.
Responsabilidades
- Crear y eliminar entidades.
- Añadir y eliminar componentes a las entidades.
- Buscar entidades que contengan componentes específicos.
- Crear entidades a partir de arquetipos.
- Controlar el estado de habilitación/deshabilitación de entidades y componentes.
- Mantener la jerarquía padre-hijo de entidades (vínculo entre componentes Transform si existen).
Ejemplos de uso
Crear una entidad manualmente
const player = entityManager.createEntity([
new Transform({ position: new Vector2(0, 0) }),
new Player({ health: 100 }),
new SpriteRenderer({ sprite: "player.png" }),
]);
Crear una entidad desde un arquetipo
const player = entityManager.createEntity(playerArchetype);
Buscar entidades con un componente
const players = entityManager.search(Player);
for (const { entity, component } of players) {
component.health -= 10;
}
Buscar entidades con varios componentes
const entities = entityManager.searchEntitiesByComponents([Player, Transform]);
Buscar entidades con criterios (SearchCriteria)
const injuredPlayers = entityManager.search(Player, (component) => component.status === "injured");
Buscar dentro de los hijos (SearchInChildren)
const childWeapons = entityManager.searchInChildren(parentEntity, Weapon);
Obtener un componente de una entidad
const damageController = entityManager.getComponent(player, DamageController);
Añadir y eliminar componentes dinámicamente
entityManager.addComponent(player, new Weapon({ damage: 25 }));
entityManager.removeComponent(player, Weapon);
Habilitar / deshabilitar entidades y componentes
entityManager.disableEntity(enemy);
entityManager.enableEntity(player);
entityManager.disableComponent(player, SpriteRenderer);
entityManager.enableComponent(player, SpriteRenderer);
Modificar los atributos de un componente
entityManager.updateComponentData(player, Player, (player) => {
player.health = 50;
});
Establecer o cambiar la relación padre-hijo
entityManager.setParent(childEntity, parentEntity);
Nota:
Si ambos tienen un componente Transform
, se creará una jerarquía de Transform que hace que el hijo herede la posición, rotación y escala del padre.
Quitar el padre de una entidad (hacerla raíz)
entityManager.removeParent(childEntity);
Verificar si una entidad tiene un componente
if (entityManager.hasComponent(player, SpriteRenderer)) {
// realizar una acción
}
Notas importantes
- Cada entidad tiene un identificador único de tipo
number
. - Los componentes son objetos simples que contienen datos.
- Los componentes pueden estar habilitados o deshabilitados individualmente.
- La búsqueda puede incluir criterios (
SearchCriteria
) para filtrar resultados. - Cuando se crea una relación padre-hijo entre entidades que tienen
Transform
, las transformaciones del padre afectan automáticamente a sus hijos.