欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > UE小:在Unreal Engine 5中实现多层静态网格体遮挡拾取

UE小:在Unreal Engine 5中实现多层静态网格体遮挡拾取

2025/6/7 23:15:33 来源:https://blog.csdn.net/zx1091515459/article/details/146946744  浏览:    关键词:UE小:在Unreal Engine 5中实现多层静态网格体遮挡拾取

问题描述

当需要拾取被多层静态网格体遮挡的对象时,若所有网格体碰撞预设为BlockAll,需要通过特殊配置实现穿透检测。


完整实现方案

1. 创建自定义追踪通道

  1. 进入 ​项目设置(Project Settings) > 碰撞(Collision)​
  2. 在 ​追踪通道(Trace Channels)​ 下添加新通道(如 MultiTrace

2. 调整静态网格体碰撞响应

  1. 将需要穿透的静态网格体碰撞预设改为 ​Custom
  2. 设置新建的 MultiTrace 通道响应为 ​Overlap
  3. 其他通道保持 ​Block 维持原有碰撞行为

3. 蓝图实现

项目设置初始化
  1. 项目设置 > 碰撞 > 添加追踪通道 “MultiTrace”
静态网格体配置
  1. 静态网格体属性 > 碰撞预设 > Custom
  2. MultiTrace 响应设置为 Overlap
  3. 其他通道保持 Block
射线检测逻辑
  1. Line Trace Multi by Channel (Trace Channel: MultiTrace, Start, End)
  2. 获取返回的 Out Hits 数组
  3. 使用数组节点获取 Last Element
  4. 处理 Last Hit 中的 Hit Actor

4. C++实现

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()按射线发射方向排序的最终命中对象

无论前面挡着多少东西也要检测到的对象:

在这里插入图片描述

挡在前面的东西:

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词