尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Stride 引擎资产编辑器体系详解:从 AssetEditors 目录结构到 GameEditor 基础设施

Stride 引擎资产编辑器体系详解:从 AssetEditors 目录结构到 GameEditor 基础设施 游戏开发图形学VR【免费下载链接】strideStride (formerly Xenko), a free and open-source cross-platform C# game engine.项目地址https://gitcode.com/gh_mirrors/st/stride点击查看免费下载导读Stride前身 Xenko是一款免费开源的跨平台 C# 游戏引擎其内置编辑器 GameStudio 为不同类型的资产提供了形态各异的专用编辑器——从精灵图集Sprite Sheet的区域裁剪到 3D 场景/预制体的实时视口编辑再到渲染管线合成器与可视化脚本的节点图编辑。本文以仓库文档 docs/editor/editors.md 为骨架结合Stride.Assets.Presentation项目的实际源码完整梳理 GameStudio 现有 8 类资产编辑器的定位、类结构与目录组织并深入讲解游戏视口类编辑器共享的GameEditorViewModelIEditorGameController基础设施及其线程模型。读完本文你将能够快速定位任意编辑器的实现入口理解带实时游戏视口的编辑器与纯数据结构编辑器的架构差异并掌握贡献者在多线程场景下安全更新 ViewModel 状态的标准写法。概览AssetEditors 目录的组织约定所有具体的资产编辑器都集中在Stride.Assets.Presentation项目下的 AssetEditors 目录 中。每个编辑器文件夹内部遵循一套约定俗成的结构ViewModels/子目录存放编辑器的 ViewModel 类是编辑器的核心逻辑所在Views/子目录存放 XAML 视图及代码后置code-behindGame/与Services/子目录仅游戏视口类编辑器存放与游戏实例交互的服务例如相机服务、选择服务、变换服务等例外ScriptEditor和VisualScriptEditor的文件平铺在文件夹根部前者连Views/子目录也没有视图代码后置如ScriptEditorView.xaml.cs直接与 ViewModel 同层存放。从实际目录树可以看到EntityHierarchyEditor、GameEditor、UIEditor等文件夹内部还细分出Adorners/、EntityFactories/、Gizmos/等子目录分别承载 UI 装饰层、实体工厂与 Gizmo 叠加层这为定位功能代码提供了清晰线索。编辑器总览表下表是定位任何现有编辑器的入口完整列出编辑器 ViewModel、对应资产类型、继承的基类、是否拥有游戏视口以及所在文件夹EditorAsset typeBase classGame viewportFolderSpriteSheetEditorViewModelSpriteSheetAssetAssetEditorViewModelNoSpriteEditor/SceneEditorViewModelSceneAssetEntityHierarchyEditorViewModelYesEntityHierarchyEditor/PrefabEditorViewModelPrefabAssetEntityHierarchyEditorViewModelYesEntityHierarchyEditor/UIPageEditorViewModelUIPageAssetAssetCompositeHierarchyEditorViewModelYesUIPageEditor/UILibraryEditorViewModelUILibraryAssetAssetCompositeHierarchyEditorViewModelYesUILibraryEditor/GraphicsCompositorEditorViewModelGraphicsCompositorAssetAssetEditorViewModelNoGraphicsCompositorEditor/ScriptEditorViewModelScript assetsAssetEditorViewModelNoScriptEditor/VisualScriptEditorViewModelVisualScriptAssetAssetEditorViewModelNoVisualScriptEditor/从表中可以看出两类典型范式带游戏视口的编辑器Scene、Prefab、UIPage、UILibrary与纯数据编辑器GraphicsCompositor、Script、VisualScript、SpriteSheet。前者跑一个完整或轻量游戏实例用于实时预览后者仅编辑资产数据结构本身。SpriteSheet 编辑器轻量视口预览SpriteSheetEditorViewModel让用户在一张纹理中定义 sprite包括区域region、枢轴点pivot、边框border以及动画帧。它使用自己独立的轻量ViewportViewModel渲染预览而不是挂接完整游戏实例——这意味着渲染开销远小于完整游戏编辑器。关键类型位于 SpriteEditor/ClassRoleSpriteSheetEditorViewModelEditor ViewModelSpriteEditorViewXAML viewViewportViewModel轻量渲染预览无完整游戏循环值得注意的实现细节使用ViewportViewModel渲染而非IEditorGameController——比完整游戏编辑器更轻量实现IAddChildViewModel接口支持将纹理直接拖拽到编辑器上以新增 sprite配套 ViewModel 还包括 TextureRegionViewModel、SpriteBordersViewModel、SpriteCenterViewModel 等分别对应区域、边框与中心点编辑SpriteEditorImageCacheServices/负责预览图像的缓存。Scene / Prefab 编辑器共享实体层级基础设施SceneEditorViewModel与PrefabEditorViewModel提供完整的 3D 场景与预制体编辑能力实体层级树、变换 Gizmo移动/旋转/缩放手柄、相机控制以及实时游戏视口。两者共享同一套基类基础设施具体子类非常薄。关键类型ClassRoleEntityHierarchyEditorViewModel共享基类 ViewModelEntityHierarchyEditor/ViewModels/SceneEditorViewModel场景专用薄子类PrefabEditorViewModel预制体专用薄子类EntityViewModel层级中每个实体的 Part ViewModelEditorCameraViewModel相机移动与控制位于 GameEditor/ViewModels/属于共享基础设施EntityGizmosViewModelGizmo 叠加层平移/旋转/缩放手柄EntityHierarchyEditorView抽象基类视图SceneEditorView/PrefabEditorView具体视图源码印证的关键点绝大多数逻辑都在EntityHierarchyEditorViewModel中。从源码看该类声明为AssetCompositeHierarchyEditorViewModelEntityDesign, Entity, EntityViewModel并实现IAddChildViewModel见 EntityHierarchyEditorViewModel.cs构造函数中一次性装配了Camera、Transform、Grid、Navigation、Lighting、Rendering、EntityGizmos等子 ViewModelL60-L66并注册了一批与预制体相关的命令OpenPrefabEditorCommand、SelectPrefabCommand、SetActiveRootCommand、BreakLinkToPrefabCommand、CreatePrefabFromSelectionCommandL76-L80。Scene 与 Prefab 的核心区别在于加载的层级根hierarchy root不同以及是否启用原型prefab base / archetype链接。EntityHierarchyRootViewModel.ActiveRoot支持在多个场景根之间切换L88。SceneEditorViewModel用[AssetEditorViewModelSceneViewModel]特性声明自己负责的资产类型构造时通过x new SceneEditorController(...)注入控制器工厂见 SceneEditorViewModel.cs——这一特性注册 工厂注入模式是编辑器与资产类型绑定的标准方式。视图代码后置将游戏宿主注入 XAML 面板SceneView.Content hierarchyEditor.Controller.EditorHost。EditorHost即GameEngineHost见 EditorGameController.cs是嵌入 WinForms/WPF 面板的游戏渲染宿主。在实体创建方面EntityFactories/ 提供了一系列工厂CameraEntityFactory、LightEntityFactory、ModelEntityFactory、AudioEntityFactory、ParticleSystemEntityFactory等配合CreateEntityCommand/CreateEntityInSelectionCommand实现从工具箱创建各类实体的能力AddAssetPolicies/ 则决定将模型、纹理、预制体、UI 页面等资产拖入场景时的默认行为。UIPage / UILibrary 编辑器WYSIWYG UI 层级编辑UIPageEditorViewModel与UILibraryEditorViewModel提供 UI 层级的所见即所得WYSIWYG编辑UIPage 是全屏布局页面UILibrary 是可复用的组件集合。元素在实时游戏视口中渲染并叠加选择装饰器selection adorners、调整大小手柄resize handles与吸附参考线snap guidelines。关键类型ClassRoleUIEditorBaseViewModel共享基类 ViewModelUIEditor/ViewModels/UIPageEditorViewModelUI 页面专用子类UILibraryEditorViewModelUI 库专用子类UIElementViewModel每个 UI 元素的 Part ViewModelUIEditorView抽象基类视图UIEditor/Views/UIPageEditorView/UILibraryEditorView具体视图值得注意的实现细节装饰器叠加层吸附参考线、调整大小手柄以 WPF 图层形式渲染在游戏视口之上——这是少数 WPF 与游戏渲染被显式合成的场景之一。对应的 WPF 装饰器类位于 UIEditor/Adorners/BorderAdorner、SizingAdorner、MarginAdorner、MoveAdorner、HighlightAdorner等而游戏侧的装饰服务在 UIEditor/Game/UIEditorGameAdornerService.cs 中实现。UIEditorBaseViewModel负责元素工厂IUIElementFactory、缩放/平移状态与选择管理子类只增加资产类型特有的根节点处理。从源码看基类还内置了吸附与装饰的配色/粗细配置如GuidelineColor、SelectionColor、SnapValue等属性见 UIEditorBaseViewModel.cs并支持从选中元素创建页面/库CreatePageCommand、CreateLibraryCommand、GroupIntoCommand。游戏侧通过 UIEditorGameCameraService.cs 提供 2D UI 相机UILayoutHelper负责布局计算。GraphicsCompositor 编辑器渲染管线节点图GraphicsCompositorEditorViewModel是渲染管线的可视化节点图编辑器节点代表渲染特性render features与渲染阶段render stages连线代表节点间的数据流。关键类型位于 GraphicsCompositorEditor/ClassRoleGraphicsCompositorEditorViewModelEditor ViewModelViewModels/GraphicsCompositorEditorViewXAML viewSharedRendererFactoryViewModel共享渲染器块的工厂/列表RenderStageViewModel渲染阶段的节点 ViewModel值得注意的实现细节节点图画布基于Stride.Core.Presentation.Graph见 presentation/Stride.Core.Presentation.Graph视图层另有GraphicsCompositorGraph与GraphicsCompositorNodeVertex辅助类不使用IEditorGameController——没有实时游戏实例合成器是一个纯粹的数据结构编辑器编辑结果反映在渲染管线配置资产上ViewModel 侧提供了一套完整的槽位/连线模型GraphicsCompositorBlockViewModel、GraphicsCompositorLinkViewModel、GraphicsCompositorSlotViewModel、EntryPointBlockViewModel等配合SharedRendererBlockViewModel管理共享渲染块。Script 编辑器嵌入式代码编辑ScriptEditorViewModel在 GameStudio 内打开一个嵌入式代码编辑器来编辑脚本资产提供编译反馈与基础 IDE 集成。关键类型位于 ScriptEditor/ClassRoleScriptEditorViewModelEditor ViewModel文件夹根部ScriptEditorViewXAML view值得注意的实现细节这是最轻量的编辑器——本质上是嵌入式代码编辑器控件的外壳shell撤销/重做undo/redo委托给代码编辑器自身而不是IUndoRedoService——标准的资产事务基础设施在这里不适用从源码看该目录包含RoslynHost、RoslynWorkspace、ScriptTextEditor、SimpleCodeTextEditor等类说明嵌入式编辑器基于 Roslyn 提供语法高亮与代码分析能力ScriptEditorSettings负责编辑器配置。VisualScript 编辑器可视化脚本节点图VisualScriptEditorViewModel是可视化脚本的节点图编辑器块block代表操作连线代表数据流与控制流。关键类型位于 VisualScriptEditor/ClassRoleVisualScriptEditorViewModelEditor ViewModel文件夹根部VisualScriptMethodEditorViewModel按方法method进行图编辑VisualScriptBlockViewModel每个块的节点 ViewModelVisualScriptLinkViewModel每条连线的边 ViewModel值得注意的实现细节结构与GraphicsCompositorEditorViewModel类似纯数据结构编辑器无游戏实例ViewModel 文件平铺在文件夹根部无ViewModels/子目录视图仍在Views/子目录配套类型还包括BlockNodeVertex、LinkNodeEdge、VisualScriptSlotViewModel插槽模型、VisualScriptFunctionParameterViewModel以及VisualScriptEditorViewModel.Diagnostics.cs提供的诊断与编译反馈支持。共享游戏编辑器基础设施GameEditorViewModel 与 IEditorGameController所有带游戏视口的编辑器Scene、Prefab、UIPage、UILibrary都继承自GameEditorViewModel并通过IEditorGameController运行一个游戏实例。游戏循环的后台线程模型控制器在后台线程上管理游戏循环结果通过IDispatcherService编组回 ViewModel。以 EditorGameController.cs 的实现为例每个编辑器会创建一个以资产 URL 命名的后台线程new Thread(...) { IsBackground true, Name $EditorGameThread ({asset.Url}) }并设置为 STA 单元L115-L116游戏实例通过EditorGameFactoryTEditorGame委托创建L40-L41启动与内容加载通过TaskCompletionSourcebool协调gameStartedTaskSource表示游戏启动完成gameContentLoadedTaskSource对外暴露为GameContentLoaded任务L86-L90、L136。GameEditorViewModel的初始化流程见 GameEditorViewModel.cs依次为Controller.StartGame()——启动后台游戏线程与游戏实例等待Controller.GameContentLoaded——等待游戏内容加载完成Controller.CreateScene()——创建编辑场景OnGameContentLoaded()——供子类在内容加载后做后续处理。此外GameEditorViewModel还暴露了LastException属性与CopyErrorToClipboardCommand/ResumeCommand命令配合EditorGameRecoveryService实现游戏崩溃后的恢复与诊断L118-L128。贡献者关键规则跨线程安全更新 ViewModel 状态对贡献者最重要的含义在这些编辑器中属性变更可能来自两个线程——UI 线程用户交互或游戏线程模拟更新。从游戏线程修改 ViewModel 状态的代码必须通过Asset.Dispatcher调度回 UI 线程。AssetEditorViewModel.Asset继承了DispatcherViewModel的Dispatcher属性因此标准写法是Asset.Dispatcher.InvokeAsync(() { // safe to update ViewModel properties here });这一模式在源码中被广泛使用。例如EntityHierarchyEditorViewModel在构造函数中订阅控制器的AssetLoading/AssetLoaded事件时正是通过asset.Dispatcher.InvokeAsync(() CompilingAssets ...)回写CompilingAssets属性见 EntityHierarchyEditorViewModel.cs。同理EditorGameController.Destroy()在清理完成后也通过Asset.Dispatcher.Invoke(...)置位IsDestroyed。编辑器的服务化架构游戏视口编辑器的功能高度服务化GameEditorController内部维护一个EditorGameServiceRegistry编辑器功能通过Controller.GetServiceT()获取。可用的服务接口包括IEditorGameCameraService/IEditorGameCameraViewModelService——相机控制GameEditor/Game/EditorGameCameraService.csIEditorGameEntitySelectionService/IEditorGameEntityTransformService——实体选择与变换IEditorGameMaterialHighlightService——材质高亮配合 Material 选择模式IEditorGameGridService/IEditorGameNavigationMeshService——网格与导航网格显示UIEditorGameAdornerService——UI 编辑器专属的装饰层服务。这类服务注册 跨线程调度的设计让编辑器功能模块化既能在实体层级编辑器与 UI 编辑器之间复用通用服务也为将来扩展 Model、Material 等新的资产编辑器预留了空间GameEditorViewModel的源码注释明确指出了这一演进方向。小结如何定位与扩展一个编辑器要在 GameStudio 中定位某个现有编辑器只需三步在 AssetEditors 目录 找到对应资产类型的文件夹进入ViewModels/查看编辑器 ViewModel进入Views/查看视图游戏视口编辑器还需查看Game/与Services/下的编辑器服务通过编辑器类上的[AssetEditorViewModelTAsset]特性确认它绑定的资产类型并阅读构造函数中注入的IEditorGameController工厂来理解其运行时架构。在扩展新编辑器时参照两类既有范式即可纯数据编辑器如 GraphicsCompositor、VisualScript直接继承AssetEditorViewModel用节点图或自定义画布编辑资产游戏视口编辑器如 Scene、Prefab、UIPage、UILibrary继承GameEditorViewModel通过IEditorGameController在后台线程跑游戏实例并务必遵守游戏线程只经Asset.Dispatcher.InvokeAsync回写 ViewModel 状态的跨线程纪律。赞分享游戏开发图形学VR【免费下载链接】strideStride (formerly Xenko), a free and open-source cross-platform C# game engine.项目地址https://gitcode.com/gh_mirrors/st/stride点击查看免费下载相关推荐SwarmUI构建企业级AI图像生成平台的终极解决方案SwarmUI构建企业级AI图像生成平台的终极解决方案 SwarmUI作为一款模块化的AI图像生成Web界面为开发者和企业用户提供了完整的Stable DiLiveCodeBench高级技巧使用uv管理依赖的最佳实践LiveCodeBench高级技巧使用uv管理依赖的最佳实践 LiveCodeBench是一款用于评估大型语言模型代码能力的专业工具而uv作为新一代Pyth人工智能模型评测代码模型Godot引擎信号系统详解从基础到实践Godot引擎信号系统详解从基础到实践 什么是信号系统 在Godot游戏引擎中信号Signals是一种强大的事件通知机制它允许游戏对象在特定事件发生文档教程游戏开发上一篇【免费下载】 DbGate 开源数据库管理工具安装及使用指南下一篇Dataherald 开源项目使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表