实体概述
在 ECS 架构中,实体(Entity)是游戏世界中的基本对象。实体本身不包含游戏逻辑或数据,它只是一个容器,用来组合不同的组件来实现各种功能。
实体是一个轻量级的对象,主要用于:
- 作为组件的容器
- 提供唯一标识(ID 和 persistentId)
- 管理组件的生命周期
实体必须通过场景创建,不支持手动创建。
// 正确的方式:通过场景创建实体const player = scene.createEntity("Player");
// ❌ 错误的方式:手动创建实体// const entity = new Entity("MyEntity", 1);通过场景创建可以确保:
- 实体被正确添加到场景的实体管理系统中
- 实体被添加到查询系统中,供系统使用
- 实体获得正确的场景引用
- 触发相关的生命周期事件
框架提供了高性能的批量创建方法:
// 批量创建 100 个子弹实体const bullets = scene.createEntities(100, "Bullet");
bullets.forEach((bullet, index) => { bullet.createComponent(Position, Math.random() * 800, Math.random() * 600); bullet.createComponent(Velocity, Math.random() * 100, Math.random() * 100);});createEntities() 会批量分配 ID、优化查询系统更新,减少系统缓存清理次数。
每个实体有三种标识符:
| 属性 | 类型 | 说明 |
|---|---|---|
id | number | 运行时唯一标识符,用于快速查找 |
persistentId | string | GUID,序列化时保持引用一致性 |
handle | EntityHandle | 轻量级句柄,详见实体句柄 |
const entity = scene.createEntity("Player");
console.log(entity.id); // 1console.log(entity.persistentId); // "a1b2c3d4-..."console.log(entity.handle); // 数字类型句柄// 名称 - 用于调试和查找entity.name = "Player";
// 标签 - 用于快速分类和查询entity.tag = 1; // 玩家标签enemy.tag = 2; // 敌人标签// 启用/禁用状态entity.enabled = false;
// 激活状态entity.active = false;
// 更新顺序(数值越小越优先)entity.updateOrder = 10;场景提供了多种查找方式:
// 通过名称查找const player = scene.findEntity("Player");// 或别名const player2 = scene.getEntityByName("Player");
// 通过 ID 查找const entity = scene.findEntityById(123);
// 通过标签查找所有相关实体const enemies = scene.findEntitiesByTag(2);// 或别名const allEnemies = scene.getEntitiesByTag(2);
// 通过句柄查找const entity = scene.findEntityByHandle(handle);实体的变化会触发事件:
// 监听组件添加scene.eventSystem.on('component:added', (data) => { console.log(`${data.entityName} 添加了 ${data.componentType}`);});
// 监听组件移除scene.eventSystem.on('component:removed', (data) => { console.log(`${data.entityName} 移除了 ${data.componentType}`);});
// 监听实体创建scene.eventSystem.on('entity:created', (data) => { console.log(`实体已创建: ${data.entityName}`);});
// 监听激活状态变化scene.eventSystem.on('entity:activeChanged', (data) => { console.log(`${data.entity.name} 激活状态: ${data.active}`);});// 获取实体调试信息const debugInfo = entity.getDebugInfo();console.log(debugInfo);// {// name: "Player",// id: 1,// persistentId: "a1b2c3d4-...",// enabled: true,// active: true,// destroyed: false,// componentCount: 3,// componentTypes: ["Position", "Health", "Velocity"],// ...// }
// 实体字符串表示console.log(entity.toString());// "Entity[Player:1:a1b2c3d4]"