Files
XCEngine/docs/api/XCEngine/Editor/Managers/SceneManager/SceneManager.md

6.4 KiB

SceneManager

命名空间: XCEngine::Editor

类型: class

源文件: editor/src/Managers/SceneManager.h

描述: ISceneManager 的默认实现,负责编辑器场景对象树、复制粘贴、场景文件加载保存、脏状态、启动场景回退以及场景快照恢复。

概述

SceneManager 是当前 Editor 里最核心的状态服务之一。 它不只是“提供一个当前场景指针”,而是把下面几条工作流集中到同一个实现里:

  • 实体树的创建、删除、重命名、复制、粘贴、复制副本和层级移动
  • 场景新建、加载、保存、另存为与启动场景加载
  • 脏状态与 dirty tracking 开关
  • play mode 使用的 SceneSnapshot 抓取与恢复
  • 本地 Core::EventEventBus 的同步通知

当前内部状态

当前主要状态字段包括:

  • m_scene 当前活动 Scene
  • m_rootEntities root 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. 状态查询与访问器

这组接口主要暴露当前活动场景、root 缓存、脏状态和进程内剪贴板状态,供面板、命令层和 play mode 管理器读取。

当前事件语义

SceneManager 同时维护两套通知出口:

  • 本地 Core::Event
    • OnEntityCreated
    • OnEntityDeleted
    • OnEntityChanged
    • OnSceneChanged
  • EventBus
    • EntityCreatedEvent
    • EntityDeletedEvent
    • EntityChangedEvent
    • EntityParentChangedEvent
    • SceneChangedEvent

当前实现里,这些通知都是同步触发,不做延迟队列。

当前实现边界

  • 当前复制粘贴依赖 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 判断进程内实体剪贴板是否有内容。

相关文档