一、节点概述
Multi Line Trace by Channel(按通道多重线追踪)是一个沿给定线段执行碰撞检测的蓝图节点。与单线追踪(Line Trace by Channel)只返回第一个命中对象不同,多线追踪会返回线段上所有遇到的命中对象,直到并包含第一个阻挡命中(Block)。
简单理解:想象一颗子弹穿过一扇玻璃窗(重叠/Overlap),然后击中后面的墙壁(阻挡/Block)——这个节点会同时返回玻璃窗和墙壁的命中信息。但如果第一个碰到的是墙壁(阻挡),则只会返回墙壁这一条命中。
二、节点输入/输出参数详解
输入参数(Inputs)
| 参数名 | 类型 | 说明 |
|---|---|---|
| Start | Vector | 线段的起点(世界坐标) |
| End | Vector | 线段的终点(世界坐标) |
| Trace Channel | Enum | 要检测的追踪通道(如 Visibility、Camera 等) |
| Trace Complex | Boolean | true=检测复杂碰撞(精确到三角面),false=检测简化碰撞(性能更好) |
| Actors to Ignore | Array of Actors | 需要忽略的 Actor 列表 |
| Draw Debug Type | Enum | 调试可视化类型(None、For One Frame、For Duration、Persistent) |
| Ignore Self | Boolean | 是否忽略执行该节点的 Actor 自身 |
| Trace Color | LinearColor | 调试线的颜色(未命中时) |
| Trace Hit Color | LinearColor | 调试线的颜色(命中时) |
| Draw Time | Real | 调试线持续显示的时间(秒) |
输出参数(Outputs)
| 参数名 | 类型 | 说明 |
|---|---|---|
| Out Hits | Array of Hit Results | 所有命中结果的数组(按从起点到终点排序) |
| Return Value | Boolean | true=存在阻挡命中,false=无阻挡命中 |
注意:
Out Hits数组中,阻挡命中(Block)会是最后一个元素。
三、蓝图设置步骤
第 1 步:创建追踪执行环境
-
打开任意蓝图(如角色蓝图、Actor 蓝图或关卡蓝图)
-
在事件图表中,从 Event BeginPlay 或 Event Tick(或自定义事件)拖出执行线
第 2 步:添加 Multi Line Trace by Channel 节点
-
在图表中右键搜索
Multi Line Trace by Channel,添加该节点 -
将事件执行线连接到该节点的
In引脚
第 3 步:配置追踪起点和终点
-
Start:通常使用
Get Actor Location或自定义向量 -
End:计算终点位置,例如
Start + (方向向量 × 追踪距离)
第 4 步:设置追踪通道
-
Trace Channel:选择需要的通道(通常选择
Visibility或Camera)
第 5 步:处理所有命中结果(核心步骤)
-
从
Out Hits引脚拖出,添加ForEachLoop节点 -
从
ForEachLoop的Array Element引脚拖出,添加Break Hit Result节点 -
从
Break Hit Result的Hit Actor引脚可以获取每个被命中的 Actor
第 6 步:添加调试可视化(推荐)
-
将
Draw Debug Type设置为For One Frame或For Duration -
这样可以在场景中直观看到追踪线的走向
四、完整使用案例(打印所有命中 Actor 名称)
这是官方文档中的标准示例:
[Event BeginPlay]
→ [Multi Line Trace by Channel]
→ (Out Hits) → [ForEachLoop]
→ (Array Element) → [Break Hit Result]
→ (Hit Actor) → [Get Display Name] → [Print String]
具体连线操作:
-
从
Multi Line Trace by Channel的Out Hits拖出 → 搜索添加ForEachLoop -
从
ForEachLoop的Array Element拖出 → 搜索添加Break Hit Result -
从
Break Hit Result的Hit Actor拖出 → 搜索添加Get Display Name(或Get Actor Name) -
从
Get Display Name的输出 → 连接到Print String节点的In String引脚 -
将
ForEachLoop的Completed引脚连接后续逻辑
五、实用场景案例
案例 1:穿透子弹检测(射穿玻璃击中敌人)
场景:子弹穿过一扇玻璃窗,击中窗后的敌人。
设置方法:
-
玻璃窗的碰撞设置中,将 Visibility 通道的 Trace Response 设为
Overlap(重叠) -
敌人角色的碰撞设置中,将 Visibility 通道的 Trace Response 设为
Block(阻挡) -
使用
Multi Line Trace by Channel并选择Visibility通道
结果:Out Hits 数组中会同时包含玻璃窗和敌人的命中信息——玻璃窗在前(Overlap),敌人在后(Block,且为数组最后一个元素)。
案例 2:扇形范围检测(霰弹枪或激光扫描)
可以用 多个 Multi Line Trace 配合不同的起点/终点组合,模拟扇形或圆锥形检测区域。例如以玩家位置为起点,向多个方向发射追踪线,检测所有命中的敌人。
案例 3:自定义追踪通道
-
进入 项目设置(Project Settings)> 碰撞(Collision)> 追踪通道(Trace Channels),添加自定义通道(如
WeaponTrace) -
将需要检测的物体碰撞预设设为 Custom,并将该通道的响应设为
Block或Overlap -
在节点中选择该自定义通道进行检测
六、常见问题与注意事项
⚠️ 问题 1:为什么 Out Hits 只返回一个对象?
这是正常行为!Multi Line Trace by Channel 在遇到第一个阻挡命中(Block) 后会停止继续检测。所有在阻挡命中之前的重叠(Overlap)对象会被返回,但阻挡命中之后的对象不会被检测到。
如果需要返回所有命中对象(无视阻挡) ,请使用
Multi Line Trace by Object节点。
⚠️ 问题 2:追踪不到任何物体
-
检查物体的碰撞设置是否正确响应了所使用的 Trace Channel
-
检查起点和终点是否在合理范围内
-
开启 Draw Debug Type 可视化查看追踪线实际走向
⚠️ 问题 3:性能考虑
-
Trace Complex = true会检测复杂碰撞(三角面级别),性能开销较大,仅在需要精确检测时使用 -
尽量避免在 Event Tick 中每帧执行大量多线追踪
七、总结
| 对比项 | Single Line Trace | Multi Line Trace |
|---|---|---|
| 返回结果 | 仅第一个命中 | 所有命中(直到首个 Block) |
| 输出类型 | 单个 Hit Result | Hit Result 数组 |
| 典型场景 | 准星瞄准、单发射击 | 穿透检测、霰弹枪、扫描 |
核心要点:
-
理解”首个阻挡即停止” 是使用该节点的关键
-
Out Hits 数组需要用 ForEachLoop 遍历处理
-
阻挡命中(Block)永远是数组最后一个元素
-
配合碰撞通道(Overlap / Block)设置可以实现丰富的穿透逻辑
感谢您的来访,获取更多精彩文章请收藏本站。







暂无评论内容