文章目录
- 一,世界编辑器
- 二,编辑器插件架构
- 三,设计叙事工具
- 四,Reflection和Gameplay
- 五,协同编辑
- QA
一,世界编辑器
其实是一个平台(hub),集合了所有能够制作地形世界的逻辑
- editor viewport:可以说是游戏引擎的特殊视角,会有部分editor only的代码(不小心开放就会变成外挂入口)
- Editable Object:人、物、房、云等都是可编辑对象
- Object管理:场景对象结构(一般是树)、layer、搜索等功能
- 属性面板
- Content Browser:资源管理浏览器
- 鼠标选取:用到Ray Casting,用包围盒或者用ObjectID Buffer区分物体(粒子或透明物体需要特殊处理)
- transform、快捷键、高亮等交互
- Height Brush:地形刷,需要设计smoothing或让艺术家自定义笔刷
- 环境规则:比如路上不能有树,把结果保存为图,再进行程序化生成或刷子效果(甚至可以控制风格)
二,编辑器插件架构
插件需要同时考虑引擎系统和对象2个维度,如图,支持矩阵性数据访问
- 插件的4种组合方式:
- 版本控制:引擎接口修改后可能会导致插件功能失效,这就需要引擎端设计接口时就考虑到这些问题,老师认为没有10年引擎经验可以不用考虑这些问题,同时老师不认为程序员写了5-10年代码就应该做管理,没有10-20年沉淀很难理解其中复杂度和丰富度,架构师也是程序员的终极归宿。
三,设计叙事工具
游戏做的越来越像电影,Storytelling就变得很重要,下图的时间线在ue里叫Sequencer,相当于电影导演的统筹安排,游戏中一些过场动画就是这样做的。这个过程中涉及到很多工具的实现
四,Reflection和Gameplay
-
游戏玩法不断更新就需要不断提供新的工具、接口,现代引擎中可视化编程可以部分处理这种可拓展性,比如ue的蓝图;
-
但是在增加逻辑后,接口、工具都需要有相应的更新,工作量是非常大的,那就需要用到反射Reflection(高级语言基本都支持,如java和c#)。「反射允许程序在运行时检查、修改和操作其自身的结构和行为」即引擎实现功能后,通过反射告诉工具有哪些开放类和接口可以访问,这时在蓝图中创建对象时,其接口参数全部可以展现
-
c++中如何实现反射?
c++在编译时会翻译成抽象语法树(Abstract Syntax Tree,AST),比如类就会被翻译成一个树状结构表,在这个表里就比较容易提取接口和参数。课程小引擎用的是Clang,其中还涉及部分代码生成的内容
五,协同编辑
协同编辑是引擎发展方向,但大量数据、不同版本如何协作?
- 冲突:用类似git的方式管理merge冲突;
- 避免冲突:分层分配、分块分配、One File Per Actor
- 在线同步操作:类似在线文档,需要同步,并解决Undo、Redo、Merge,比如用资源锁,或下述方法
QA
- 反射会不会影响运行效率:Runtime基本不会,但在编辑工具里频繁调用会有消耗
- 现代游戏开发中,DCC工具和引擎的分工是什么:DCC很多有渲染系统,引擎也想把DCC功能加入引擎里,两边都在大量融合