1.5 KiB
1.5 KiB
Entity 组件分析
组件职责
Entity.* 负责:
- 分配与回收
entity_id; - 维护实体到
transform/script句柄的绑定; - 提供
is_alive存活判定。
核心存储
位于 Entity.cpp 的静态容器:
transforms:实体索引 -> 变换组件句柄scripts:实体索引 -> 脚本组件句柄generations:实体索引 -> 当前代数free_ids:可复用实体 ID 队列
创建流程
入口:game_entity::create(entity_info info)。
主要步骤:
- 校验
info.transform,Transform 为必需组件; - 分配
entity_id:- 回收路径:从
free_ids取旧 id,new_generation; - 新建路径:追加新索引并扩展并行数组;
- 回收路径:从
- 创建 Transform 组件(强制);
- 若传入脚本工厂,则创建 Script 组件(可选);
- 返回
entity轻句柄。
删除流程
入口:game_entity::remove(entity_id id)。
步骤:
- 校验实体存活;
- 若存在脚本组件,先删脚本并清空句柄槽;
- 删除 Transform 并清空句柄槽;
- 把 id 放入
free_ids,等待复用。
存活判定规则
is_alive(id) 依赖两项:
generations[index] == id::generation(id)transforms[index].is_valid()
这让“旧代数句柄”天然失效,避免悬挂句柄误访问。
设计特点
- Entity 层是组件索引空间的“主时钟”;
- Transform 与实体强 1:1 绑定;
- Script 按需挂载,存在即可访问,不存在则为空句柄。