4.1 KiB
4.1 KiB
Scene
命名空间: XCEngine::Components
类型: class
头文件: XCEngine/Scene/Scene.h
描述: 持有一组 GameObject、驱动场景级更新,并提供层级对象树保存/加载能力的场景容器。
概述
Scene 是当前引擎里“对象集合”的所有权边界。它内部同时维护:
m_gameObjects,按 ID 保存GameObject的唯一所有权m_rootGameObjects,保存根对象 ID 列表m_gameObjectIDs,保存当前场景内的对象 ID 集合- 两个创建/销毁事件入口
Scene 负责对象集合、根节点入口、保存/加载边界和场景级更新;对象本身再负责组件与层级递归。
生命周期与所有权
- Constructor 创建空场景,默认
m_active = true - CreateGameObject 分配、登记并唤醒一个新对象
- DestroyGameObject 从当前场景树中递归移除对象
- Destructor 当前直接清空内部
unique_ptr容器
查询接口返回的都是观察指针,不转移所有权。
tag 查询与序列化边界
- 从根对象开始
- 对每个对象调用
CompareTag(tag) - 以深度优先顺序返回第一个匹配对象
场景保存/加载同样已经覆盖 tag/layer:
- SerializeToString 会写出每个对象的
tag与layer - DeserializeFromString 会恢复这些字段
因此场景级 tag 查询、原生对象字段和托管 GameObject.tag / layer 当前共享同一份底层状态。
当前实现边界
m_active当前不会参与更新门控;即使场景 inactive,Update 系列接口仍会执行- Destructor 不会触发
OnGameObjectDestroyed(),也不会为组件调用OnDestroy() - DeserializeFromString 直接重建内部状态,不经过 CreateGameObject,因此不会触发创建事件或
Awake() - Save / Load 打开文件失败时当前只做有限处理,不提供事务式恢复
- SetName 只修改场景对象内部名称;如果场景由
SceneManager管理,管理器 key 不会随之更新
线程语义
- 当前没有锁
- 默认应在主线程或外部同步前提下使用
公开方法
| 方法 | 说明 |
|---|---|
| Constructor | 构造空场景。 |
| Destructor | 销毁场景。 |
| GetName | 查询场景名称。 |
| SetName | 设置场景名称。 |
| IsActive | 查询场景 active 标志。 |
| SetActive | 设置场景 active 标志。 |
| CreateGameObject | 创建场景对象。 |
| DestroyGameObject | 销毁场景对象。 |
| Find | 按名称查找对象。 |
| FindByID | 按 ID 查找对象。 |
| FindGameObjectWithTag | 按真实 tag 递归查找第一个匹配对象。 |
| FindObjectOfType | 查找第一个匹配组件。 |
| FindObjectsOfType | 查找所有匹配组件。 |
| GetRootGameObjects | 获取根对象列表。 |
| Update | 驱动每帧更新。 |
| FixedUpdate | 驱动固定步长更新。 |
| LateUpdate | 驱动晚更新。 |
| Save | 保存到文件。 |
| Load | 从文件加载。 |
| SerializeToString | 序列化为完整场景文本。 |
| DeserializeFromString | 从完整场景文本反序列化。 |
| OnGameObjectCreated | 访问对象创建事件。 |
| OnGameObjectDestroyed | 访问对象销毁事件。 |