拓冰建站拓冰建站
首页 / 资讯中心 / 正文

UE5 Modeling Mode 与 Geometry Script 联动:动态网格编辑实战指南

1. 从“37”这个编号说起Modeling Mode 到底解决了什么痛点如果你在 UE5 里做过一段时间场景或者道具大概率经历过这种循环在 DCC 软件里建好模型导出 FBX拖进引擎发现比例不对切回 DCC 改再导出再导入材质 ID 乱了UV 接缝对不上碰撞体还得重新做一遍。一个简单的墙面造型来回折腾半小时就没了。Modeling Mode 这套工具集的出现本质上就是冲着这个循环来的——它把大量原本必须在外部软件里完成的网格编辑操作直接搬进了引擎视口。“37”这个编号在官方文档体系里对应的是 Modeling Tools 与 Mesh Editing 这一整块内容涵盖 Modeling Mode 下的各类工具、动态网格编辑能力以及 Geometry Script 的联动机制。它不是一个单一功能而是一整套工作流的集合。核心价值可以概括成一句话让网格数据在引擎内保持可编辑状态减少跨软件往返把“改一个倒角”这种小事从十分钟压缩到十秒钟。这套东西适合谁如果你是从美术转技术美术的或者做关卡白盒、程序化生成、快速原型迭代的Modeling Mode 基本是绕不开的。纯做材质和灯光的朋友可能用得少但只要涉及“这个模型我想在引擎里直接改一下”它就有用。新手也不用怕它的很多工具操作逻辑和 Blender、Max 的建模模式是相通的上手门槛比想象中低。我自己的使用场景主要是两块一是关卡白盒阶段的快速搭建和修改二是配合 Geometry Script 做程序化的批量网格处理。前者是手动操作后者是脚本驱动两者共享同一套底层网格数据结构这也是为什么标题里把“动态网格编辑”和“Geometry Script 联动”放在一起讲——它们本来就是一件事的两面。2. Modeling Mode 工具集的核心架构与选型逻辑2.1 为什么是“模式”而不是“插件”很多人第一次接触 Modeling Mode 会以为它是个插件其实它是引擎内置的一套编辑模式和 Landscape、Foliage 这些模式是平级的。这个设计选择很关键。如果做成插件它和引擎的网格管线之间就多了一层隔阂动态网格的更新、撤销重做、和 Actor 系统的交互都会变得别扭。做成内置模式意味着它可以直接操作引擎的 Dynamic Mesh 数据结构编辑结果能实时反映到渲染和碰撞上。进入方式很简单视口左上角的模式下拉菜单里选 Modeling或者用快捷键 Shift5。进去之后你会发现左侧多了一排工具面板右侧是属性细节视口里选中网格就能直接操作。这个布局和传统建模软件不太一样它更偏向“选中对象再选工具”的逻辑而不是“先选工具再画”。刚上手可能会不习惯但用久了会发现这种逻辑更适合引擎内的场景化编辑——你通常是对着场景里已有的东西改而不是从零开始画。2.2 Dynamic Mesh一切编辑能力的底座Modeling Mode 所有工具能生效的前提是目标网格被转换成了 Dynamic Mesh。普通 Static Mesh 是只读的烘焙数据你不能直接改它的顶点。Dynamic Mesh 则是一套运行时可编辑的网格表示支持顶点、边、面、UV、法线、材质槽的实时修改。转换是自动的当你用 Modeling 工具点选一个 Static Mesh 时引擎会在后台创建一个 Dynamic Mesh 副本。这里有个细节值得注意编辑结果默认不会自动写回原始资产你需要手动用“Accept”或者“Output”把结果保存成新的 Static Mesh 资产。这个设计是故意的防止你误操作把原始资产改坏。我踩过的坑就是改了半天忘了输出关掉编辑器全没了所以养成习惯改完立刻点 Accept。Dynamic Mesh 的性能特征和 Static Mesh 不同。它没有经过完整的静态光照烘焙优化顶点数据是动态的所以不适合直接拿来做最终场景的大批量静态物件。合理的做法是用 Modeling Mode 快速迭代出满意的造型输出成 Static Mesh再放回场景做正式使用。这个“编辑态”和“运行态”的分离是理解整套工具的关键。2.3 Geometry Script 的定位把手动操作变成可复用的程序Geometry Script 是 UE5 提供的一套蓝图和 Python 可调用的网格操作 API。它和 Modeling Mode 共享同一套底层函数库——你在 Modeling Mode 里手动点的每一个操作背后几乎都对应一个 Geometry Script 函数。这个联动的意义在于手动操作解决的是“一次性”问题Geometry Script 解决的是“批量”和“可复用”问题。比如你要给一百个道具加倒角手动一个个点不现实写个 Geometry Script 循环处理就是几行代码的事。反过来你在写脚本之前可以先用 Modeling Mode 手动试出正确的参数组合再把对应的函数调用抄进脚本里这个“手动探索、脚本固化”的工作流非常高效。蓝图里通过“Dynamic Mesh”相关的节点就能调用Python 则通过 unreal.GeometryScript 库。两者能力基本对等选哪个取决于你的项目管线。如果团队里美术多蓝图更友好如果是技术美术主导的批处理管线Python 更顺手。3. 核心工具拆解与实操要点3.1 选择与编辑类工具从“选中”到“改对”Modeling Mode 左侧工具面板里最上面一排是选择类工具。别小看选择它是所有编辑的前提。默认的框选、刷选、套索选都有但真正影响效率的是“选择过滤器”——你可以限定只选顶点、只选边、只选面或者按材质槽、按 UV 岛来选。我常用的一个组合是先用“Select by Material”选中某个材质槽对应的所有面再用“PolyGroup Edit”做局部挤出或倒角。这个流程在做建筑模块化的时候特别快比如一栋楼的窗户框材质槽分好后选中窗框材质直接挤出厚度不用一个个面去点。这里有个容易忽略的点Dynamic Mesh 的面选择是基于 PolyGroup 的。PolyGroup 是引擎内部对网格面的一种分组方式默认按连通性和角度自动生成。如果你发现选面的时候选不中想要的那一块大概率是 PolyGroup 的划分不符合预期这时候可以用“PolyGroup Edit”工具里的“Generate PolyGroups”重新生成调整角度阈值。3.2 网格编辑类工具倒角、挤出、布尔、简化这是 Modeling Mode 最核心的一批工具也是替代外部 DCC 软件的主力。倒角Bevel是我用得最多的。参数就三个倒角距离、分段数、倒角类型。距离决定切进去多深分段数决定圆滑程度。实测下来做硬表面道具距离给 0.5 到 2 厘米按引擎单位分段 2 到 3 段出来的效果最自然。分段给多了面数暴涨给少了看着像切角。这里有个技巧先给一个粗略的距离看效果再用“Preview”模式微调不要一上来就输精确数值因为 Dynamic Mesh 的实时预览有延迟数值改太快反而看不清。挤出Extrude分两种面挤出和边挤出。面挤出沿法线方向推边挤出沿边方向拉。做管道、栏杆这类线性结构边挤出比面挤出好用因为它能保持截面形状。注意挤出后新生成的面会继承原面的材质槽如果你需要不同材质挤出后要手动指定。布尔Boolean在 Modeling Mode 里是实时预览的支持并集、交集、差集。这个功能做硬表面开洞特别方便比如在一块板上挖几个圆孔。但布尔有个经典问题运算后拓扑会变乱产生大量三角面和细碎边。我的经验是布尔只用于“最终造型确定后”的操作不要在中间过程反复布尔否则网格会越来越脏。布尔完记得用“Simplify”或者“Remesh”清理一下。简化Simplify和重网格Remesh是配套使用的。Simplify 按百分比减面Remesh 按目标边长重新生成均匀拓扑。做 LOD 或者优化碰撞体的时候这两个工具能省很多事。Remesh 的“Voxel Size”参数很关键给太小面数爆炸给太大细节丢失一般从 2 到 5 厘米开始试。3.3 变换与对齐类工具精确摆放的保障Modeling Mode 里的变换工具比普通 Actor 变换多了“网格吸附”和“对齐到网格”的能力。做模块化关卡的时候这个太重要了。你可以设置吸附步长比如 100 单位然后拖动网格时自动吸附保证模块之间严丝合缝。对齐工具里有个“Align”功能能把选中的面自动对齐到某个平面或者另一个网格的面。做墙面拼接、地板铺设的时候比手动调坐标快得多。还有一个“Snap to Grid”的顶点吸附做低模的时候用来对齐顶点位置避免出现微小的缝隙。注意变换工具操作的是 Dynamic Mesh 的顶点数据不是 Actor 的 Transform。也就是说你移动的是网格本身Actor 的位置不变。这个区别在后续输出资产的时候要留意别把网格移飞了。3.4 UV 与材质相关工具引擎内改 UV 的可行性Modeling Mode 提供了一套基础的 UV 编辑工具包括自动展开、UV 投影、UV 变换。说实话它的 UV 展开能力比不上专门的 DCC 软件但对于简单几何体或者快速原型来说够用了。“Auto UV”能根据网格的 PolyGroup 自动生成 UV 岛适合做程序化生成的物件。投影类工具平面投影、柱面投影、盒投影适合规则形状。如果你需要精细的 UV 排布还是建议回 DCC 软件做Modeling Mode 的 UV 工具更多是“应急”和“批量”用途。材质槽的管理倒是很方便。你可以直接在 Modeling Mode 里给选中的面指定材质槽或者把某个材质槽的面分离出来。做多材质物件的时候这个流程比在 DCC 里分 ID 再导入要直观。4. Geometry Script 联动实操从手动到自动的完整链路4.1 蓝图调用 Geometry Script 的基本结构在蓝图里使用 Geometry Script核心是三个东西Dynamic Mesh 组件、Geometry Script 函数库、以及一个用来承载结果的 Actor。典型流程是这样的创建一个 Actor 蓝图添加 Dynamic Mesh Component然后在 Construction Script 或者 Event Graph 里调用 Geometry Script 函数。函数库在“Geometry Script”分类下按功能分成 Mesh Queries、Mesh Edits、Mesh Booleans、Mesh Normals 等子类。一个最简单的例子从一个 Static Mesh 复制出 Dynamic Mesh做一次倒角再输出回 Static Mesh。蓝图节点大致是Copy Mesh From Static Mesh → Apply Mesh Bevel → Copy Mesh To Static Mesh。这三个节点串起来就是一个可复用的倒角工具。这里的关键理解是Geometry Script 的函数大多返回一个新的 Dynamic Mesh 或者修改传入的 Dynamic Mesh 引用。你要注意哪些函数是原地修改哪些是返回新对象。原地修改的函数通常带“In Out”前缀比如“In Out Bevel”。搞混了会导致结果不符合预期。4.2 Python 批处理的实操记录Python 在批处理上比蓝图更灵活尤其是需要遍历资产、读写文件的时候。下面是我实际用过的一个脚本结构用来批量给指定文件夹下的 Static Mesh 加倒角并输出新资产。import unreal # 配置参数 source_path /Game/Props/Source output_path /Game/Props/Beveled bevel_distance 1.5 bevel_segments 2 # 获取资产列表 asset_registry unreal.AssetRegistryHelpers.get_asset_registry() assets asset_registry.get_assets_by_path(source_path, recursiveTrue) for asset_data in assets: if asset_data.asset_class_path.asset_name StaticMesh: mesh unreal.EditorAssetLibrary.load_asset(asset_data.package_name) # 创建 Dynamic Mesh 并复制 dynamic_mesh unreal.DynamicMesh() unreal.GeometryScriptLibrary.copy_mesh_from_static_mesh( dynamic_mesh, mesh, unreal.GeometryScriptCopyMeshFromAssetOptions() ) # 应用倒角 bevel_options unreal.GeometryScriptMeshBevelOptions() bevel_options.distance bevel_distance bevel_options.segments bevel_segments unreal.GeometryScriptLibrary.apply_mesh_bevel(dynamic_mesh, bevel_options) # 输出回 Static Mesh new_mesh unreal.GeometryScriptLibrary.copy_mesh_to_static_mesh( dynamic_mesh, unreal.GeometryScriptCopyMeshToAssetOptions() ) # 保存资产 package_name asset_data.package_name.replace(source_path, output_path) unreal.EditorAssetLibrary.save_asset(package_name)这个脚本跑一遍一个文件夹的道具就全加好倒角了。实际用的时候要注意几点一是路径替换要处理好别覆盖原始资产二是倒角距离要根据模型尺寸调整统一数值可能对某些小物件过大三是脚本跑之前先在单个资产上测试确认参数无误再批量。4.3 动态网格编辑在运行时能做什么Dynamic Mesh 不只是编辑器里的工具它在运行时也能用。这意味着你可以做程序化的网格变形、破坏效果、甚至简单的建模玩法。比如做一款建造类游戏玩家放置的墙体需要根据相邻墙体自动调整形状这个逻辑就可以用 Geometry Script 在运行时实现。玩家放一块墙脚本检测周围有没有连接点有的话自动挤出连接段没有就保持原样。整个过程不需要预烘焙网格是实时生成的。性能上要注意运行时的 Dynamic Mesh 操作比静态网格开销大不适合每帧都做复杂运算。合理的做法是“事件驱动”——只在玩家操作时触发一次网格更新平时保持静态。另外Dynamic Mesh 的碰撞体生成也有开销如果物件多考虑用简单碰撞体代替复杂碰撞。5. 常见问题与排查技巧实录5.1 工具点了没反应或者报错这是新手最常见的问题。排查顺序是这样的第一确认目标是不是 Static Mesh。Modeling Mode 只能操作 Static Mesh 和 Dynamic Mesh如果你选的是 Skeletal Mesh 或者 Landscape工具是灰的。第二确认有没有进入 Modeling Mode。在普通模式下点工具面板是没用的必须切到 Modeling 模式。第三确认网格有没有被锁定。有些资产在编辑器里是只读的需要先“Make Editable”或者复制一份。第四看输出日志。Modeling Mode 的报错通常会在 Output Log 里显示比如“Mesh has no valid PolyGroups”或者“Dynamic Mesh conversion failed”根据提示对症下药。5.2 编辑后模型变黑或者法线乱了这是 Dynamic Mesh 编辑后的经典问题。原因通常是法线没有重新计算。解决办法是用“Recalculate Normals”工具或者检查“Flip Normals”有没有被误触。另一个可能是材质槽丢失。Dynamic Mesh 在转换过程中如果原始网格的材质槽索引有问题编辑后材质会错乱。预防办法是编辑前先确认材质槽是干净的编辑后用“Preview Material”检查一遍。5.3 布尔运算后网格破面布尔是重灾区。破面的原因一般是两个网格有共面或者极薄的相交区域。解决办法一是让两个网格稍微重叠一点不要刚好贴面二是布尔前先给两个网格做一次 Remesh让拓扑均匀一些三是布尔后用“Fill Holes”补一下破洞。如果布尔结果实在不理想可以考虑用“Mesh Boolean”的“Try Fix”选项或者干脆换一种建模思路用挤出和倒角代替布尔。5.4 Geometry Script 脚本报错排查Python 脚本报错信息通常比较明确常见的有报错信息原因解决Asset not found路径写错或资产未加载检查路径用 EditorAssetLibrary.load_asset 确认Invalid mesh传入的网格不是 Dynamic Mesh先做 Copy Mesh From Static MeshFunction not foundAPI 名称拼写错误或版本不匹配查官方 API 文档确认 UE 版本Out of memory批量处理太多资产分批处理及时释放不用的 Dynamic Mesh我踩过的一个坑是在循环里反复创建 Dynamic Mesh 对象没有手动释放跑几百个资产后内存爆了。后来改成每处理完一个就置空引用让 GC 回收问题解决。5.5 性能相关的注意事项Dynamic Mesh 的面数直接影响编辑流畅度。实测下来单个网格超过 5 万面实时预览就开始卡了。超过 20 万面基本没法交互。所以做复杂模型的时候建议分块处理或者先用低模定造型最后再细化。另一个性能点是撤销重做。Modeling Mode 的撤销栈是有限的操作太多之后早期步骤会丢失。重要节点记得手动 Accept 保存别指望撤销能救回来。6. 我个人的工作流与踩坑心得我现在做关卡白盒的流程基本是这样的先用基础几何体在引擎里搭出大致布局然后进 Modeling Mode 做细节调整——该倒角的倒角该挤出的挤出该布尔的布尔。造型满意后Accept 输出成 Static Mesh再替换掉原来的白盒。整个过程除了贴图基本不用开 DCC 软件。踩过的坑里印象最深的是早期不知道 Dynamic Mesh 和 Static Mesh 的区别改了半天发现原始资产没变以为工具坏了。后来才明白“编辑态”和“输出态”是分开的这个设计其实很合理只是需要适应。另一个坑是 PolyGroup 的问题。有次做一个复杂曲面选面怎么都选不中想要的那块折腾了半小时才发现是 PolyGroup 的自动划分把相邻面合并了。后来学会用“Generate PolyGroups”手动调整角度阈值问题就解决了。Geometry Script 方面最大的心得是先手动后脚本。不要一上来就写脚本先用 Modeling Mode 手动试出正确的参数和操作顺序再把对应的函数调用抄进脚本。这样成功率最高也最容易调试。最后分享一个小技巧Modeling Mode 里的很多工具支持“Ctrl点击”做反向操作比如挤出的时候按住 Ctrl 就是向内挤。这个在官方文档里没写是我自己试出来的能省不少切换工具的时间。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门