2.7 KiB
2.7 KiB
Scene
命名空间: XCEngine::Components
类型: module
描述: 提供场景容器 Scene 与多场景入口 SceneManager,负责组织 GameObject 层级、场景级更新与自定义文本序列化。
概述
XCEngine/Scene 这组头文件位于 Scene 目录下,但公开类型实际放在 XCEngine::Components 命名空间中。这反映了当前引擎的建模方式:
Scene负责持有一组GameObject。GameObject负责父子层级、TransformComponent和其它组件。SceneManager负责持有多个已加载场景,并暴露“当前活动场景”入口。
这和商业引擎里常见的 Unity 风格思路接近:场景是对象集合与生命周期边界,真正可组合的行为仍然落在对象与组件层。
当前实现成熟度
这一组 API 已经能支撑基础场景树、更新和保存/加载,但需要对当前边界保持诚实:
Scene::IsActive()/SetActive()当前只是存储一个标志位,不会阻止Update()、FixedUpdate()或LateUpdate()运行。FindGameObjectWithTag()当前并没有真正的 tag 系统支持,实际按对象名称匹配。Scene::~Scene()不会逐个调用DestroyGameObject(),因此不会触发场景销毁事件,也不会为组件调用OnDestroy()。SceneManager::LoadSceneAsync()当前不是异步加载,只是同步包装。SceneManager的活动场景指针,与Scene自身的 active 标志当前是两套彼此独立的状态。
设计要点
Scene采用“所有权集中、访问返回裸指针”的模式:内部由std::unique_ptr<GameObject>持有对象,API 对外返回非拥有指针。- 根对象列表与父子层级分开维护,这让“遍历根对象”和“对象挂接到父节点”可以各自保持简单。
- 序列化走的是引擎私有文本格式,而不是通用 JSON。这样实现成本低、易于直接落地组件自定义序列化,但兼容性和健壮性也相对有限。
头文件
- Scene -
Scene.h,单个场景容器、更新入口和序列化接口。 - SceneManager -
SceneManager.h,多场景注册表与活动场景入口。
相关指南
- Scene Lifecycle And Serialization - 解释场景树为什么这样设计、活动状态分层意味着什么,以及当前序列化链路的实际限制。