拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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,或者用快捷键 Shift+5。进去之后你会发现左侧多了一排工具面板,右侧是属性细节,视口里选中网格就能直接操作。这个布局和传统建模软件不太一样,它更偏向“选中对象再选工具”的逻辑,而不是“先选工具再画”。刚上手可能会不习惯,但用久了会发现这种逻辑更适合引擎内的场景化编辑——你通常是对着场景里已有的东西改,而不是从零开始画。

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, recursive=True) 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 Mesh
Function 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 就是向内挤。这个在官方文档里没写,是我自己试出来的,能省不少切换工具的时间。

返回列表