6.4 KiB
6.4 KiB
SceneManager
命名空间: XCEngine::Editor
类型: class
源文件: editor/src/Managers/SceneManager.h
描述: ISceneManager 的默认实现,负责编辑器场景对象树、复制粘贴、场景文件加载保存、脏状态、启动场景回退以及场景快照恢复。
概述
SceneManager 是当前 Editor 里最核心的状态服务之一。
它不只是“提供一个当前场景指针”,而是把下面几条工作流集中到同一个实现里:
- 实体树的创建、删除、重命名、复制、粘贴、复制副本和层级移动
- 场景新建、加载、保存、另存为与启动场景加载
- 脏状态与 dirty tracking 开关
- play mode 使用的
SceneSnapshot抓取与恢复 - 本地
Core::Event与EventBus的同步通知
当前内部状态
当前主要状态字段包括:
m_scene当前活动Scene。m_rootEntitiesroot game object 缓存,供层级面板直接读取。m_clipboard编辑器进程内的实体复制树,不是系统剪贴板。m_currentScenePath当前场景路径。m_currentSceneName当前场景名。m_isSceneDirty当前场景是否被标记为 dirty。m_sceneDocumentDirtyTrackingEnabled是否允许实体编辑自动把场景标记为 dirty。
主要职责分组
1. 实体树编辑
这些接口会直接改动当前 Scene,并在需要时:
SyncRootEntities()MarkSceneDirty()- 发布实体和场景变化事件
2. 场景文件生命周期
当前 SceneManager 既负责把 .xc 文件装进内存,也负责在项目首次启动或默认场景缺失时创建最小可用场景。
3. 快照与 play mode 恢复
这组接口是当前 play mode “进入前保存编辑态 / 退出后恢复编辑态”的底层基础。
4. 状态查询与访问器
- GetEntity
- GetRootEntities
- HasActiveScene
- IsSceneDirty
- SetSceneDocumentDirtyTrackingEnabled
- IsSceneDocumentDirtyTrackingEnabled
- GetCurrentScenePath
- GetCurrentSceneName
- GetScene
- HasClipboardData
这组接口主要暴露当前活动场景、root 缓存、脏状态和进程内剪贴板状态,供面板、命令层和 play mode 管理器读取。
当前事件语义
SceneManager 同时维护两套通知出口:
- 本地
Core::EventOnEntityCreatedOnEntityDeletedOnEntityChangedOnSceneChanged
EventBusEntityCreatedEventEntityDeletedEventEntityChangedEventEntityParentChangedEventSceneChangedEvent
当前实现里,这些通知都是同步触发,不做延迟队列。
当前实现边界
- 当前复制粘贴依赖
ComponentFactoryRegistry和组件自己的Serialize/Deserialize,不是 prefab 系统。 - 剪贴板只在当前 Editor 进程内有效,关闭进程后不会保留。
MarkSceneDirty()会受m_sceneDocumentDirtyTrackingEnabled门控。- 场景反序列化当前包在
ResourceManager::ScopedDeferredSceneLoad范围内,避免场景加载期间立刻把所有资源同步兑现。
公开方法
| 方法 | 说明 |
|---|---|
| Constructor | 绑定可选 EventBus 的场景管理器构造函数。 |
| CreateEntity | 在当前场景里创建实体,并在必要时隐式创建编辑器场景。 |
| DeleteEntity | 递归删除实体及其全部子节点。 |
| RenameEntity | 修改实体显示名并触发实体变更通知。 |
| CopyEntity | 把实体子树序列化到进程内剪贴板。 |
| PasteEntity | 从进程内剪贴板重建一棵实体子树。 |
| DuplicateEntity | 通过 copy + paste 复制一个实体子树。 |
| MoveEntity | 修改实体父级并同步层级与事件。 |
| NewScene | 创建一个新的空编辑态场景。 |
| LoadScene | 从磁盘加载场景文件。 |
| SaveScene | 保存到当前场景路径。 |
| SaveSceneAs | 保存到新的目标路径。 |
| LoadStartupScene | 解析项目启动场景并在必要时回退创建 demo scene。 |
| MarkSceneDirty | 在 dirty tracking 开启时把场景标记为 dirty。 |
| CaptureSceneSnapshot | 抓取当前场景、路径和脏状态快照。 |
| RestoreSceneSnapshot | 从快照恢复编辑态场景。 |
| CreateDemoScene | 创建当前内置的最小示例场景。 |
| GetEntity | 通过实体 ID 查找当前场景对象。 |
| GetRootEntities | 返回 root game object 缓存。 |
| HasActiveScene | 判断当前是否存在活动场景。 |
| IsSceneDirty | 判断当前场景是否被标记为 dirty。 |
| SetSceneDocumentDirtyTrackingEnabled | 开启或关闭自动 dirty tracking。 |
| IsSceneDocumentDirtyTrackingEnabled | 查询 dirty tracking 开关状态。 |
| GetCurrentScenePath | 返回当前场景路径。 |
| GetCurrentSceneName | 返回当前场景名。 |
| GetScene | 返回当前活动 Scene 指针。 |
| HasClipboardData | 判断进程内实体剪贴板是否有内容。 |