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++实现

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

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

挡在前面的东西:

相关推荐
星火撩猿5 小时前
常见游戏引擎介绍与对比
unity·ue5·游戏引擎·godot
清流君6 小时前
【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
数据库·人工智能·笔记·mysql·ue5·数字孪生
Involuter17 小时前
UE5 Assimp 自用
ue5
电子云与长程纠缠19 小时前
Unreal Niagara制作SubUV贴图翻页动画
学习·ue5·编辑器·贴图·niagara
子燕若水1 天前
“Daz to Unreal”将 G8 角色(包括表情)从 daz3d 导入到 UE5。在 UE5 中,我发现使用某个表情并与闭眼混合后,上眼睑出现了问题
3d·ue5
半天法师1 天前
UE5.2+VarjoXR3,Lumen、GI、Nanite无效的两种解决方案
ue5·xr·vr
ue星空1 天前
UE5摄像机画面没有填充满屏幕有黑边
ue5
李詹2 天前
游戏开发核心技术解析——从引擎架构到攻防体系的完整技能树
架构·ue5·游戏引擎·游戏程序·3dsmax·虚幻
子燕若水2 天前
UE5的 Modify Curve 蓝图节点
ue5
人宅4 天前
UE5有些场景的导航生成失败解决方法
ue5