
1. 从“37”这个编号说起Modeling Tools 到底解决了什么痛点如果你在 UE5 里做过一段时间场景或者道具大概率经历过这种循环在 DCC 软件里建好模型导出 FBX拖进引擎发现比例不对或者某个面朝向反了又切回 DCC 改再导出再导入。一个简单的碰撞体调整可能要来回折腾三四次。UE5 的 Modeling Mode 就是冲着这个痛点来的——它把一整套网格编辑能力直接塞进了引擎编辑器里让你不用离开 UE 就能完成建模、改形、布尔、UV 调整、碰撞生成这些活儿。标题里的“37”是这套工具集在官方文档体系里的章节编号但真正值得聊的不是编号本身而是它背后三个互相咬合的能力层Modeling Mode 工具集面向手工操作的交互式工具、动态网格编辑Dynamic Mesh底层数据结构、Geometry Script 联动用蓝图或 Python 程序化生成和修改网格。这三层从“手动”到“半自动”再到“全程序化”覆盖了从美术到技术美术再到程序化关卡生成的完整需求链。我第一次认真用 Modeling Mode 是在做一个室内场景的灰盒阶段。当时需要快速切出几十个不同尺寸的墙体和门洞如果用传统流程每个门洞都要单独建模。后来发现 Modeling Mode 里的Boolean布尔工具可以直接在引擎里对墙体做差集运算配合PolyGroup Edit快速选中要挖掉的面整个过程不到两分钟。从那以后我的灰盒流程基本就固定在引擎里完成了。这篇文章适合谁看如果你是会一点蓝图但没系统用过 Modeling Mode 的开发者或者你是想把手动建模流程部分自动化的技术美术再或者你只是好奇“UE5 到底能不能当建模软件用”那接下来的内容应该能帮你省下不少来回切换软件的时间。我会从工具集的整体设计思路讲起然后拆解动态网格这个核心数据结构再重点讲 Geometry Script 怎么和前面两者联动最后给一份实操流程和踩坑记录。2. Modeling Mode 工具集的整体设计与选型逻辑2.1 为什么是“模式”而不是“面板”UE5 把建模功能做成一个独立的Mode模式而不是像细节面板那样常驻在右侧。这个设计选择背后有很实际的考量建模操作会大量占用视口交互比如拖拽顶点、刷选面片、绘制多边形这些操作和常规的关卡编辑选中 Actor、移动 Transform在输入语义上是冲突的。如果做成常驻面板你就得频繁切换“当前鼠标左键是选中 Actor 还是拖顶点”体验会很割裂。做成模式之后进入 Modeling Mode 时视口的交互逻辑整体切换成“网格编辑语义”左侧工具栏变成建模工具集合右侧变成对应工具的参数面板。退出模式后一切恢复原样。这个思路和 Maya 的 Modeling 模块、Blender 的 Edit Mode 是一致的本质上是用模式隔离来避免输入歧义。实际操作中你可以用快捷键Shift 5快速进入 Modeling Mode再按一次退出。我习惯把它和关卡编辑交替使用灰盒阶段大部分时间待在 Modeling Mode 里摆位和逻辑挂载时切回普通模式。2.2 工具集的分类逻辑左侧工具栏看起来工具很多但按功能可以分成几大类理解分类比死记每个工具名字有用得多类别代表工具核心用途创建类Box、Sphere、Cylinder、PolyExt从零生成基础形体变形类Transform、Smooth、Displace对已有网格做形变拓扑类PolyGroup Edit、Tri Edit、Remesh改拓扑结构、面片分组布尔类Boolean、Trim网格间的交并差运算UV类UV Editor、Project UVUV 展开与调整属性类Attribute、Generate Collision碰撞、法线、材质分配程序化类Geometry Script蓝图/Python 驱动这个分类不是官方强制的但按这个逻辑去记你在遇到具体需求时能快速定位到该用哪类工具。比如“我要在这面墙上挖个窗洞”那就是布尔类“我要把这个高模减面”那就是拓扑类的 Remesh“我要批量生成一百个随机大小的箱子”那就直接跳到程序化类。2.3 动态网格整套工具的底层支撑所有 Modeling Mode 的操作最终都作用在Dynamic Mesh动态网格这个数据结构上。理解这一点很关键因为它解释了为什么有些操作在普通 Static Mesh 上做不了必须先“转为动态网格”。Static Mesh 是经过优化的、面向渲染的网格格式它的顶点数据、索引缓冲、UV 都是烘焙好的引擎假设它不会在运行时被频繁修改。而 Dynamic Mesh 是一个可变的、支持运行时增删改的网格表示它保留了完整的拓扑信息顶点、边、面、PolyGroup允许你随时切割、合并、挤出。当你对一个 Static Mesh Actor 使用 Modeling 工具时引擎会在背后把它转换成一个 Dynamic Mesh 副本你所有的编辑都作用在这个副本上编辑完成后可以选择“Accept”把结果烘焙回 Static Mesh或者保持动态状态继续编辑。这个转换过程是有开销的尤其是高面数模型所以我的经验是灰盒和中等精度模型随便用百万面级别的高模尽量在 DCC 里处理完再进来。提示Dynamic Mesh 的编辑历史默认不保留。如果你做了一步不满意的布尔运算CtrlZ 只能撤销有限步数复杂操作建议先复制一份 Actor 作为备份。3. 动态网格编辑的核心细节与实操要点3.1 PolyGroup被低估的核心概念很多人第一次用 Modeling Mode 会觉得“选面好难选”问题往往出在没理解PolyGroup多边形组。PolyGroup 是把网格的面按逻辑分组的一种标记它决定了你点击一个面时是只选中这一个三角面还是选中整个逻辑平面。举个例子一个立方体有 6 个面但底层三角化之后是 12 个三角形。如果没有 PolyGroup你点一下只能选中一个三角形想选中整个正方形面就得点两次。而有了 PolyGroup每个正方形面被标记为一个组点一下就能选中整个面。这就是为什么 Modeling Mode 里很多操作都围绕 PolyGroup 展开。生成 PolyGroup 的常用方式Generate PolyGroup按角度阈值自动分组适合硬表面模型默认阈值 25 度左右PolyGroup Edit手动绘制、合并、拆分组按材质/UV 岛生成适合已经有清晰材质划分的模型我在处理建筑墙体时会先用 Generate PolyGroup 按 30 度阈值跑一遍这样墙面的平面、窗台的斜面都能自动分好组后续做布尔或者挤出时选中效率高很多。3.2 布尔运算的实操细节布尔是 Modeling Mode 里使用频率最高的工具之一但也是最容易出问题的。核心参数有三个Operation TypeUnion并集、Difference差集、Intersection交集Try Fix Result是否尝试修复运算后的拓扑错误Transfer Materials是否把工具网格的材质传递到结果上做差集挖洞时我的标准流程是先选中被挖的墙体Target在布尔工具里把 Operation 设为 Difference然后把挖洞用的形体Tool拖进工具槽勾选 Try Fix Result点击 Accept。如果结果出现了破面或者法线翻转通常是两个网格有共面重叠导致的解决办法是把工具网格稍微偏移 0.1 个单位避免完全共面。注意布尔运算对非流形网格比如有孤立边、重叠面非常敏感。运算前建议先用Repair工具检查一遍把明显的拓扑问题修掉能大幅降低布尔失败率。3.3 Remesh 与减面什么时候该用哪个Remesh 工具提供了几种不同的重网格化策略选错了会让模型变得面目全非Uniform按统一边长重新划分适合需要均匀拓扑的场景但会丢失硬边Voxel体素化重网格适合有机形体或者需要封闭水密网格的情况Simplify减面保留大致形状的前提下降低面数我踩过的一个坑拿一个硬表面机械零件做 Voxel Remesh结果所有锐利的边角都被磨圆了因为体素化本质上是用小球去填充空间。硬表面减面应该用Simplify配合较高的保留比例或者干脆用Tri Edit手动删边。减面的参数里有个Target Triangle Count直接填你想要的面数。但要注意减面算法是启发式的实际结果可能和你的目标有偏差而且减面后 UV 可能会错乱如果模型已经贴好图减面后要检查 UV 是否需要重新投影。3.4 碰撞体生成和热词里那个 overlap 问题直接相关热搜词里有个“ue5碰撞盒识别不到overlap事件”这个问题很多时候和碰撞体的生成方式有关。Modeling Mode 里的Generate Collision工具可以基于网格自动生成碰撞体有几种模式Box/Sphere/Capsule生成简单碰撞体性能最好Convex Hull生成凸包碰撞适合大多数道具Mesh Collision用简化后的网格做碰撞精度高但开销大如果你用 Mesh Collision 生成了碰撞但 overlap 事件不触发常见原因是碰撞体没有正确设置为Query Only或者Physics Actor的碰撞预设不对。在 Modeling Mode 里生成碰撞后记得回到 Actor 的 Collision 设置里检查 Collision Preset确保它响应了 Overlap 通道。我的习惯是道具和可交互物体用 Convex Hull静态场景用简单 Box 组合只有形状特别复杂的才用 Mesh Collision。这样既保证 overlap 能正常触发又不至于让物理开销失控。4. Geometry Script 联动把手动操作变成可复用的程序4.1 Geometry Script 是什么为什么它重要如果说 Modeling Mode 是给美术用的手动工具那Geometry Script就是给技术美术和程序用的“建模 API”。它是一套蓝图节点也有 Python 版本让你用代码的方式创建、查询、修改 Dynamic Mesh。它的价值在于可复用和可参数化。手动挖一个门洞要两分钟但如果你写一个 Geometry Script 函数输入墙体尺寸和门洞位置它能在毫秒级生成一百个不同规格的墙体。这在程序化关卡生成、批量资产处理、参数化建筑这些场景里是刚需。4.2 核心节点拆解Geometry Script 的节点数量很多但常用的核心节点就那么几类创建类Create Mesh/Create Box/Create Sphere从零生成基础形体Append Mesh把多个网格合并成一个查询类Get Mesh Bounding Box获取包围盒用于计算尺寸和位置Get Vertex Count/Get Triangle Count获取面数信息Raycast射线检测用于判断某个点是否在网格内部修改类Apply Transform对网格做位移旋转缩放Boolean程序化布尔运算Simplify Mesh程序化减面Set Material按面设置材质输出类Copy Mesh to Static Mesh把 Dynamic Mesh 烘焙成 Static Mesh 资产Set Dynamic Mesh把结果写回 Actor4.3 一个完整的程序化门洞生成示例假设我要做一个函数输入墙体长宽高、门洞位置和尺寸输出带门洞的墙体。用 Geometry Script 的思路是这样的用Create Box生成墙体主体用Create Box生成门洞的“挖除体”位置和尺寸由输入参数决定用Boolean节点做 Difference 运算用Copy Mesh to Static Mesh输出结果在蓝图里这个逻辑可以封装成一个函数参数暴露出来。更进阶的做法是用Geometry Script 的 Python API在编辑器里批量跑import unreal # 创建动态网格 mesh unreal.DynamicMesh() # 生成墙体 unreal.GeometryScriptLibrary.create_box(mesh, 400, 20, 300) # 生成门洞挖除体 door unreal.DynamicMesh() unreal.GeometryScriptLibrary.create_box(door, 100, 40, 220) # 布尔差集 unreal.GeometryScriptLibrary.apply_boolean(mesh, door, unreal.GeometryScriptBooleanOperation.DIFFERENCE) # 输出为 Static Mesh unreal.GeometryScriptLibrary.copy_mesh_to_static_mesh(mesh, /Game/Generated/Wall_With_Door)这段代码的实际执行效率很高生成一面带门洞的墙大概几十毫秒。如果你要生成一整栋楼的墙体循环调用这个函数几分钟就能出一套完整的灰盒。4.4 Geometry Script 和 Modeling Mode 的联动方式两者不是割裂的。你可以在 Modeling Mode 里手动调整好一个基础形体然后用 Geometry Script 对它做批量复制和参数化变形。反过来也可以用 Geometry Script 生成一批候选方案再进 Modeling Mode 手动微调细节。一个实用的联动技巧用 Geometry Script 生成网格后不要直接烘焙成 Static Mesh而是保持 Dynamic Mesh 状态然后进入 Modeling Mode 继续编辑。这样你可以享受程序化的批量生成又保留手动精修的自由度。提示Geometry Script 生成的网格默认没有 UV。如果后续要贴图记得在脚本里加上Recompute UV或者Project UV节点否则材质会显示异常。5. 完整实操流程从零做一面带窗洞的墙5.1 准备工作与基础形体创建打开 UE5新建一个空白关卡按Shift 5进入 Modeling Mode。在左侧工具栏找到Create分类点击Box在视口里拖出一个长方体。右侧面板里把尺寸设为长 500、宽 20、高 300单位是厘米UE 默认单位。点击 Accept 确认。这一步生成的其实是一个 Dynamic Mesh Actor。你可以在大纲视图里看到它名字类似BoxActor。选中它在右侧 Details 面板里确认它的 Mesh 类型是 Dynamic 而不是 Static。5.2 用 PolyGroup 划分墙面选中墙体在工具栏找到PolyGroup Edit。先点击Generate PolyGroup角度阈值设为 30 度。这一步会把墙体的六个面各自分成一个 PolyGroup。你可以用鼠标点击墙面确认一下是不是整个面被选中而不是单个三角形。如果发现某些面没有被正确分组可以用 PolyGroup Edit 里的Paint模式手动刷。按住 Ctrl 刷是添加按住 Shift 刷是移除。这个操作在复杂模型上很常用值得花几分钟熟悉。5.3 布尔挖窗洞回到工具栏点击Boolean。在右侧面板里Operation Type 选Difference勾选Try Fix Result勾选Transfer Materials然后在视口里创建一个用来挖洞的 Box尺寸设为长 120、宽 40、高 150位置调整到墙面上你想开窗的地方。把这个 Box 拖进 Boolean 工具的 Tool 槽里点击Accept。如果一切正常你会看到墙面上出现了一个窗洞。如果出现了破面检查一下挖除体是不是和墙面完全共面了把它往墙的厚度方向偏移 0.5 个单位再试一次。5.4 用 Geometry Script 批量生成变体手动做一面墙大概需要两三分钟。现在假设你要生成 20 面不同尺寸、不同窗洞位置的墙。手动做就是 40 分钟用 Geometry Script 就是写一个循环的事。在内容浏览器里右键创建一个Editor Utility Blueprint在里面写一个函数参数是墙体尺寸和窗洞参数内部用 Geometry Script 节点实现。然后写一个循环随机生成 20 组参数调用这个函数输出 20 个 Static Mesh 资产。这个流程我第一次跑通的时候生成 20 面墙用了不到 10 秒。当然生成的资产还需要手动检查一下有没有拓扑问题但相比手动建模效率提升是数量级的。5.5 碰撞体生成与 overlap 测试选中生成好的墙体在 Modeling Mode 里找到Generate Collision。选择Convex Hull模式点击生成。然后退出 Modeling Mode在 Details 面板里把 Collision Preset 设为BlockAll或者自定义一个响应 Overlap 的预设。放一个带碰撞的 Actor比如一个球体在场景里让它穿过窗洞。如果窗洞的碰撞体没有正确挖空球体会被挡住。这时候需要回到 Modeling Mode检查碰撞体是不是基于挖洞后的网格生成的。如果碰撞体还是完整的方块说明生成碰撞时用的是原始网格需要先 Accept 布尔结果再生成碰撞。6. 常见问题与排查技巧实录6.1 布尔运算失败或结果异常这是最高频的问题。排查顺序如下现象可能原因解决办法布尔后网格消失两个网格没有实际相交检查位置确保有重叠体积结果有破面共面重叠或非流形偏移 0.1-0.5 单位先 Repair法线翻转工具网格法线朝内用 Flip Normals 翻转工具网格材质丢失未勾选 Transfer Materials重新运算并勾选该选项我的经验是布尔运算前先花 10 秒检查两个网格的位置关系和法线方向能省下后面 10 分钟的排查时间。6.2 动态网格转 Static Mesh 后 UV 错乱Dynamic Mesh 在编辑过程中 UV 可能会被破坏尤其是布尔和 Remesh 之后。解决办法是在烘焙成 Static Mesh 之前用UV Editor或者Project UV重新投影一遍。Project UV 有几种投影方式Planar平面投影、Cylindrical柱面、Box盒式。对于墙面这种平面为主的模型Planar 投影配合合适的轴向就能得到可用的 UV。6.3 Geometry Script 执行报错或结果为空常见原因有几个一是输入网格为空检查 Create 节点是否成功执行二是布尔运算的两个网格没有相交三是输出路径不存在Copy Mesh to Static Mesh 的路径需要是有效的资产路径。调试的时候可以在关键节点后面加 Print String输出顶点数和面数确认每一步的数据是正常的。6.4 碰撞体识别不到 Overlap 事件这个问题在热词里被单独提出来说明踩坑的人不少。除了前面说的 Collision Preset 问题还有一个隐蔽的原因碰撞体生成时用的是简化网格简化过度导致窗洞被填上了。解决办法是生成碰撞时选择较低的简化程度或者手动用多个 Box 拼出碰撞体。另外如果 Actor 的 Mobility 是 Static某些 overlap 事件在运行时可能不触发。把需要交互的物体设为 Movable 或者 Stationary 试试。6.5 性能问题什么时候不该用 Modeling ModeModeling Mode 很方便但不是万能的。以下情况建议回到 DCC 软件处理面数超过 50 万的模型Dynamic Mesh 转换和编辑会明显卡顿需要精确 UV 展开的模型引擎里的 UV 工具精度不如专业软件需要复杂绑定和动画的模型引擎里做不了骨骼绑定需要细分曲面的有机模型Modeling Mode 的细分工具比较基础我的原则是灰盒、道具、建筑模块、碰撞体在引擎里做角色、高模、复杂 UV在 DCC 里做。两者不是替代关系而是分工关系。7. 一些实操心得和后续扩展方向用了一段时间 Modeling Mode 和 Geometry Script 之后我最大的体会是这套工具的真正价值不在于替代 DCC而在于缩短迭代循环。以前改一个门洞位置要导出导入现在在引擎里两分钟搞定。这种即时反馈对灰盒阶段的设计探索特别重要你可以在几分钟内试出十种不同的布局方案。另一个心得是关于 Geometry Script 的学习曲线。它的节点很多但常用的就那二三十个。建议从“生成一个 Box 并输出为 Static Mesh”这个最小闭环开始跑通之后再逐步加布尔、加循环、加参数化。不要一上来就啃完整套 API容易劝退。后续可以扩展的方向把 Geometry Script 和 PCGProcedural Content Generation框架结合用 PCG 控制布局用 Geometry Script 生成具体网格这样能做出真正意义上的程序化建筑生成系统。另外Geometry Script 的 Python API 可以配合 Editor Utility 做批量资产处理比如批量给一批模型生成碰撞体、批量减面、批量重投影 UV这些在项目后期优化阶段特别有用。最后分享一个小技巧在 Modeling Mode 里按F可以聚焦到选中的网格按Alt 鼠标左键可以旋转视角这些快捷键和普通模式一致但配合建模操作时手感更顺。另外Ctrl Shift Z是重做和大多数软件一致不用重新适应。