# Entity 组件分析

## 组件职责

`Entity.*` 负责：

- 分配与回收 `entity_id`；
- 维护实体到 `transform/script` 句柄的绑定；
- 提供 `is_alive` 存活判定。

## 核心存储

位于 `Entity.cpp` 的静态容器：

- `transforms`：实体索引 -> 变换组件句柄
- `scripts`：实体索引 -> 脚本组件句柄
- `generations`：实体索引 -> 当前代数
- `free_ids`：可复用实体 ID 队列

## 创建流程

入口：`game_entity::create(entity_info info)`。

主要步骤：

1. 校验 `info.transform`，Transform 为必需组件；
2. 分配 `entity_id`：
   - 回收路径：从 `free_ids` 取旧 id，`new_generation`；
   - 新建路径：追加新索引并扩展并行数组；
3. 创建 Transform 组件（强制）；
4. 若传入脚本工厂，则创建 Script 组件（可选）；
5. 返回 `entity` 轻句柄。

## 删除流程

入口：`game_entity::remove(entity_id id)`。

步骤：

1. 校验实体存活；
2. 若存在脚本组件，先删脚本并清空句柄槽；
3. 删除 Transform 并清空句柄槽；
4. 把 id 放入 `free_ids`，等待复用。

## 存活判定规则

`is_alive(id)` 依赖两项：

- `generations[index] == id::generation(id)`
- `transforms[index].is_valid()`

这让“旧代数句柄”天然失效，避免悬挂句柄误访问。

## 设计特点

- Entity 层是组件索引空间的“主时钟”；
- Transform 与实体强 1:1 绑定；
- Script 按需挂载，存在即可访问，不存在则为空句柄。
