1. 先对齐进度:第一部分留下的场景底子与第二部分要攻克的三个目标
这篇文章本来没打算写,实在是最近被几个做数字孪生的朋友问得有点多——项目做到一半,角色从楼板掉下去了,或者场景里导入了一批建筑白模之后,人物直接穿模掉到万丈深渊。而我正好在第二部分这个阶段把所有这类问题都过了一遍,就把过程整理出来。
在开始之前,先交代一下前提。这篇是“第二部分”,默认你已经跟着第一部分把UE5的基础数字孪生场景搭出来了——也就是:用Quixel Bridge或者CityEngine导入了园区/建筑的白模,地形和道路至少有个雏形,Lumen全局光照已经能在夜间模式里看到窗户透光,Nanite也正确应用到了高模建筑上。如果你的项目还停在大世界空白场景刷地形阶段,建议先回第一部分把场景地基补上,否则这篇里讲的很多逻辑会没有落点。
我这里说的“数字孪生”,不是那种纯展示用的沙盘漫游,而是带数据交互的园区级场景——UE5只是渲染壳,背后还得实时接设备状态、传感器数据、人员定位信息,角色在场景里的每一次走位都对应着真实空间里的某个坐标。所以第二部分的核心,不是“让画面更好看”,而是要解决三件事:
- 解决人物在数字孪生场景里“站得住”的问题,也就是运行人物掉落、穿模、物理异常;
- 解决角色在场景里“走得出”的问题,也就是动线、导航、漫游路径可控;
- 解决场景与外部数据“对得上”的问题,也就是把外部系统实时数据接到场景里并驱动视觉表现。
这三个目标如果只靠UE5自带的模板工程跑,一个都完不成。下面我按实际开发顺序,把这部分踩坑和落地的细节全部展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 人物“穿模掉落”的根因:碰撞、移动模式与楼板网格体的三方博弈
先说最让人头疼的“运行人物掉落”。不少人在交流群里问“为什么我的角色走着走着就掉下去了”,这个现象在UE5里其实很少是单一原因,绝大多数是碰撞体系、移动模式、网格体物理属性三方互相扯皮的结果。
2.1 最常见的掉落原因排序
我把手头碰到过的项目案例和网上看到的现象梳理了一下,掉落原因按出现频率排大概是这样一个顺序:
- 楼板/地面网格体没有碰撞预设——从外部DCC软件(Blender、3ds Max、SketchUp)导入的模型,导入设置里碰撞复杂度是默认值,但没有自动生成碰撞体,结果就是一整栋楼都是“虚”的,角色直接穿过去。
- 碰撞预设与移动模式不匹配——角色明明是Pawn默认的飞行/无碰撞模式,或者CollisionPreset设成了OverlapAll,地面再实也接不住。
- 移动模式用了SetActorLocation或直接改Transform——尤其是我看到不少数字孪生项目为了让角色按算法算出的人流动线走,直接每帧SetActorLocation,这样会绕过CharacterMovement的碰撞检测,角色直接“瞬移”进地板再被挤出来,表现就是抖动、穿模、掉出世界。
- World Partition或HLOD层级的碰撞没加载——大世界场景里,角色跑到某个区域时,高精度网格体还在异步加载,只有低模HLOD代理,而这个代理没有开启碰撞。
这个排序很重要。因为很多人一看“掉落了”就先去调物理材质、加碰撞体,方向就偏了。我建议拿到问题先按这个表从头排查,成本最低。
2.2 碰撞预设与楼板网格体的匹配关系
先说从外部导入的网格体。以SketchUp导出的FBX楼板为例,FBX导入UE5后,默认的碰撞生成方式是“复杂碰撞作为简单碰撞”——听起来很安全,但实际上如果你的楼板是个带玻璃幕墙和高差细节的复杂网格体,UE5默认生成凸包分解时可能把楼板拆成十几个碎片,凸包之间留下细缝,角色的胶囊体正好卡进缝里,然后被“挤”出去。
我的做法是:楼板、地面、道路这类底面结构,导入时把碰撞生成方式选成“包谷(Bounding Box)”或者“凸包分解(Convex Hull)”,但凸包分解的Maximum Hull Vextex数要设置合理——我一般压到16以内,再多就容易出问题。对于大面积平坦地面,最好的方案是单独拉一个简单的BlockingVolume垫底,而不是依赖模型自带的碰撞。
这里还有个容易忽略的点:碰撞预设里Render Custom Depth和Collision Enabled不要一起开。有些项目为了做透视高亮效果,把楼板的碰撞预设改成了“OverlapAllDynamic”,方便鼠标点选,结果角色站上去就沉底。正确的做法是:角色可站立的表面保持Blocking,射线拾取的高亮检测单独用TraceChannel处理,不要和物理碰撞共用一套预设。
