UE Mantle System 的墙体判定巧思
版本:UE 5.8

核心思路
一个"墙"其实是一个剖面:既要判高度,又要判厚度,还得知道墙后面是什么。本系统的巧思是:不直接测量墙,而是用两次向下的竖直采样取到墙的剖面两点,再用两个布尔量把整面墙归类成 4 种可翻越场景。
巧思一:把 3D 墙面问题降维成"两点剖面测量"
- Trace1 从角色前方命中墙面,拿到
WallLocation+WallNormal,作为参考系。 - 沿墙面法线反方向(往墙里钻)退 10cm、50cm 两个位置,各向下打一条竖直射线:
- 近侧(退 10)→ 近端顶面
WallTopHegihtNear - 远侧(退 50)→ 墙远端后面的物体
WallTopHeightFar
- 近侧(退 10)→ 近端顶面
巧思二:不测宽度,用"近远顶高差"推断厚度
|
|
- 远端采样落在宽平台顶面 → 高差 ≈ 0 → 厚墙(可站立)
- 远端采样落到墙后地面(薄墙)→ 高差大 → 薄墙(翻过去/跳下去)
“退 50cm"的采样距离本身就是厚度阈值 —— 阈值被物理编码进射线偏移里,30cm 只是吸收远端边缘坡度的容差。
巧思三:高度 × 厚度 组成 2×2 决策矩阵
| 薄墙(远端无顶) | 厚墙(顶面平坦) | |
|---|---|---|
| 矮(≤80) | Vault 翻越 | GettingUp 迈上去 |
| 高(>80) | Climb → JumpingDownFromWall | Climb 爬上去站立 |
高度由 (WallTopHegihtNear - WallLocation).Z > 80 判定。2 次采样 + 2 个布尔量归整面墙,决策极简。
巧思四:全程用"差值"而非绝对坐标
所有判定基于高度差,墙在任意海拔/层高下都成立。
巧思五:采样点"嵌进墙里”,避开墙檐毛边
近侧采样在 WallLocation + 法线反方向*10(墙体内侧而非外沿),向下打线不会在边缘处漏检。
巧思六:失败即跳跃,闸门防重入
- 检测未命中 → 不做失败处理,直接
Jump贴近墙,失败路径本身就是行为。 - 事件开头
CanMantleTrigger先置 false、末尾才复位。
巧思七:攀爬前"头顶预检"
从 ActorLocation + (0,0,200) 向前打线,头顶有遮挡就放弃攀爬、只跳一下;确认净空才进动画。
动画期间的"接管"套路
SetIgnoreMoveInput(true) → Capsule NoCollision → SetMovementMode(Flying) → 动画播完后统一恢复(碰撞 QueryAndPhysics → Walking → 解禁输入 → 复位闸门)。