# 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 按需挂载,存在即可访问,不存在则为空句柄。