4.6 KiB
ComponentEditors
命名空间: XCEngine::Editor
类型: submodule
源目录: editor/src/ComponentEditors/
描述: Inspector 组件编辑器子模块,负责把运行时组件映射为编辑器侧的专用检查器 UI、添加/移除策略和交互式修改入口。
概述
ComponentEditors 是当前 Inspector 扩展体系里最重要的一层。它的职责不是保存组件数据,而是决定“某个组件在编辑器里应该如何被看见和编辑”。
按当前实现,这条链路很清晰:
InspectorPanel遍历选中对象上的组件。- ComponentEditorRegistry 负责查找匹配的 editor。
- 每个具体 editor 只处理自己负责的组件类型。
- 若 editor 报告发生修改,
InspectorPanel会标记场景 dirty。
这和商业编辑器常见的 custom inspector / details customization 设计非常接近。这样做的直接收益是,复杂组件不会把 InspectorPanel 本身变成一个巨大的 switch。
当前调用链
按 InspectorPanel.cpp 和 InspectorActionRouter.h 的实现:
ComponentEditorRegistry::Get().FindEditor(component)决定当前组件由谁绘制。- editor 的
GetDisplayName()决定 Inspector 组件节标题。 - editor 的
Render(...)负责真正的字段 UI。 - Add Component 菜单通过
ComponentEditorRegistry::Get().GetEditors()遍历所有可显示 editor。
已建立的 canonical 页面
| 页面 | 说明 |
|---|---|
| IComponentEditor | 组件编辑器统一契约。 |
| ComponentEditorRegistry | editor 注册中心与查询入口。 |
| TransformComponentEditor | Transform 组件 Inspector。 |
| CameraComponentEditor | Camera 组件 Inspector。 |
| LightComponentEditor | Light 组件 Inspector。 |
| AssetReferenceEditorUtils | 资产引用属性行 helper。 |
| MeshFilterComponentEditor | MeshFilter 组件 Inspector。 |
| MeshRendererComponentEditor | MeshRenderer 组件 Inspector。 |
| VolumeRendererComponentEditor | VolumeRenderer 组件 Inspector。 |
| ScriptComponentEditor | Script 组件 Inspector 与脚本字段编辑入口。 |
| ScriptComponentEditorUtils | 脚本组件编辑器辅助规则与格式化 helper。 |
当前源码对齐情况
按 ComponentEditorRegistry.cpp 当前实现,registry 实际注册的 editor 包括:
TransformComponentEditorCameraComponentEditorLightComponentEditorMeshFilterComponentEditorMeshRendererComponentEditorVolumeRendererComponentEditorScriptComponentEditor
这说明当前组件编辑器系统已经不再只覆盖基础三组件,而是已经承载 mesh、volume 与脚本组件的 Inspector 逻辑。当前 canonical 树已经把这些渲染组件 editor、脚本组件 editor 和它们共用的资产引用 helper 都补齐了。
ScriptComponentEditor 的特殊性
ScriptComponentEditor 是这个子模块里最依赖运行时元数据的一页。它不是直接读取 ScriptComponent 的本地成员列表,而是通过 ScriptEngine 查询:
- 当前脚本类是否已分配、可用或缺失。
- 脚本字段元数据。
- 默认值、stored override 与 live managed value 的合成结果。
StoredOnly、TypeMismatch一类问题状态。
因此它也是当前 ComponentEditors 和 Scripting 子模块之间最重要的交汇点之一。
设计说明
把组件编辑 UI 拆成独立 editor 类型,有几个非常现实的好处:
- 不同组件可以拥有完全不同的 Inspector 交互形态。
- Add / Remove 规则可以跟组件类型一起定义。
- 像脚本组件这种依赖运行时元数据的复杂面板,不会污染整个 Inspector 主循环。
当前限制
ComponentEditorRegistry仍然是构造函数里手工注册,不是插件式发现机制。