问题描述
当需要拾取被多层静态网格体 遮挡的对象时,若所有网格体碰撞预设为BlockAll
,需要通过特殊配置实现穿透检测。
完整实现方案
1. 创建自定义追踪通道
- 进入 项目设置(Project Settings) > 碰撞(Collision)
- 在 追踪通道(Trace Channels) 下添加新通道(如
MultiTrace
)
2. 调整静态网格体碰撞响应
- 将需要穿透的静态网格体碰撞预设改为 Custom
- 设置新建的
MultiTrace
通道响应为 Overlap - 其他通道保持 Block 维持原有碰撞行为
3. 蓝图实现
项目设置初始化
- 项目设置 > 碰撞 > 添加追踪通道 "MultiTrace"
静态网格体配置
- 静态网格体属性 > 碰撞预设 > Custom
- MultiTrace 响应设置为 Overlap
- 其他通道保持 Block
射线检测逻辑
- Line Trace Multi by Channel (Trace Channel: MultiTrace, Start, End)
- 获取返回的 Out Hits 数组
- 使用数组节点获取 Last Element
- 处理 Last Hit 中的 Hit Actor
4. C++实现
cpp
void YourClass::PerformMultiTrace()
{
UWorld* World = GetWorld();
if (!World) return;
FVector Start = ...; // 射线起点
FVector End = ...; // 射线终点
TArray<FHitResult> Hits;
FCollisionQueryParams Params;
Params.bTraceComplex = true;
bool bHit = World->LineTraceMultiByChannel(
Hits,
Start,
End,
ECC_GameTraceChannel1, // 替换为自定义通道枚举
Params
);
if (bHit && Hits.Num() > 0)
{
FHitResult& LastHit = Hits.Last();
if (AActor* HitActor = LastHit.GetActor())
{
UE_LOG(LogTemp, Log, TEXT("Hit Actor: %s"), *HitActor->GetName());
}
}
}
参数说明表
参数/节点 | 作用 |
---|---|
LineTraceMultiByChannel |
穿透多层物体的射线检测方法 |
bTraceComplex |
启用三角面层级的精确碰撞检测 |
ECC_GameTraceChannel1 |
需替换为项目中实际的自定义通道枚举名 |
Hits.Last() |
按射线发射方向排序的最终命中对象 |
无论前面挡着多少东西也要检测到的对象:

挡在前面的东西:
