虚幻引擎 Multi Line Trace by Channel 节点

一、节点概述

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 步:创建追踪执行环境

  1. 打开任意蓝图(如角色蓝图、Actor 蓝图或关卡蓝图)

  2. 在事件图表中,从 Event BeginPlay 或 Event Tick(或自定义事件)拖出执行线

第 2 步:添加 Multi Line Trace by Channel 节点

  1. 在图表中右键搜索 Multi Line Trace by Channel,添加该节点

  2. 将事件执行线连接到该节点的 In 引脚

第 3 步:配置追踪起点和终点

  • Start:通常使用 Get Actor Location 或自定义向量

  • End:计算终点位置,例如 Start + (方向向量 × 追踪距离)

第 4 步:设置追踪通道

  • Trace Channel:选择需要的通道(通常选择 Visibility 或 Camera

第 5 步:处理所有命中结果(核心步骤)

  1. 从 Out Hits 引脚拖出,添加 ForEachLoop 节点

  2. 从 ForEachLoop 的 Array Element 引脚拖出,添加 Break Hit Result 节点

  3. 从 Break Hit Result 的 Hit Actor 引脚可以获取每个被命中的 Actor

第 6 步:添加调试可视化(推荐)

  • 将 Draw Debug Type 设置为 For One Frame 或 For Duration

  • 这样可以在场景中直观看到追踪线的走向


四、完整使用案例(打印所有命中 Actor 名称)

这是官方文档中的标准示例

text
[Event BeginPlay] 
    → [Multi Line Trace by Channel] 
        → (Out Hits) → [ForEachLoop] 
            → (Array Element) → [Break Hit Result] 
                → (Hit Actor) → [Get Display Name] → [Print String]

具体连线操作

  1. 从 Multi Line Trace by Channel 的 Out Hits 拖出 → 搜索添加 ForEachLoop

  2. 从 ForEachLoop 的 Array Element 拖出 → 搜索添加 Break Hit Result

  3. 从 Break Hit Result 的 Hit Actor 拖出 → 搜索添加 Get Display Name(或 Get Actor Name

  4. 从 Get Display Name 的输出 → 连接到 Print String 节点的 In String 引脚

  5. 将 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:自定义追踪通道

  1. 进入 项目设置(Project Settings)> 碰撞(Collision)> 追踪通道(Trace Channels),添加自定义通道(如 WeaponTrace

  2. 将需要检测的物体碰撞预设设为 Custom,并将该通道的响应设为 Block 或 Overlap

  3. 在节点中选择该自定义通道进行检测


六、常见问题与注意事项

⚠️ 问题 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 数组
典型场景 准星瞄准、单发射击 穿透检测、霰弹枪、扫描

核心要点

  1. 理解”首个阻挡即停止” 是使用该节点的关键

  2. Out Hits 数组需要用 ForEachLoop 遍历处理

  3. 阻挡命中(Block)永远是数组最后一个元素

  4. 配合碰撞通道(Overlap / Block)设置可以实现丰富的穿透逻辑

感谢您的来访,获取更多精彩文章请收藏本站。

THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容