World.h 库里的 Trace API

  • Trace模式

    • TraceSingle 单个结果
    • TraceMulti 多个结果
  • Trace 的检测依据
    • ByChanne
    • ByObjectType
    • ByProfile

LineTraceSingleByChannel

由于一般不使用 World 里的Trace API,故本小结只举 LineTraceSingleByChannel 一个例子

  • Syntax

    bool LineTraceSingleByChannel(
    struct FHitResult& OutHit,
    const FVector& Start,
    const FVector& End,
    ECollisionChannel TraceChannel,
    const FCollisionQueryParams& Params = FCollisionQueryParams::DefaultQueryParam,
    const FCollisionResponseParams& ResponseParam = FCollisionResponseParams::DefaultResponseParam
    ) const;
  • 代码实现

    // 碰撞参数
    FCollisionQueryParams CollisonQueryParams(TEXT("QueryParams"),true,NULL);
    CollisonQueryParams.bTraceComplex = true;
    CollisonQueryParams.bReturnPhysicalMaterial = false;
    CollisonQueryParams.AddIgnoredActor(this); // 起始点和检测结果
    FVector BeginLoc = GetActorLocation();
    FVector EndLoc = BeginLoc + GetActorForwardVector() * 1000;
    FHitResult HitResult; // 射线检测
    GetWorld()->LineTraceSingleByChannel(HitResult, BeginLoc, EndLoc, ECollisionChannel::ECC_Visibility, CollisonQueryParams);
    // 绘制射线
    DrawDebugLine(GetWorld(), BeginLoc, HitResult.GetActor() ? HitResult.Location : EndLoc, FColor::Red, false, 1.0f);
    if (HitResult.GetActor())
    {
    UKismetSystemLibrary::PrintString(GetWorld(), HitResult.GetActor()->GetName());
    }

UKismetSystemLibrary 库里的 Trace API

  • 与蓝图使用的 Trace 节点对应,

  • 实际调用的是 World.h 里的 Trace 函数

LineTrace

LineTraceSingle

根据 Channel 检测单个物体

  • Syntax

    static bool LineTraceSingle(
    const UObject* WorldContextObject,
    const FVector Start,
    const FVector End,
    ETraceTypeQuery TraceChannel,
    bool bTraceComplex,
    const TArray<AActor*>& ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult& OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor = FLinearColor::Red,
    FLinearColor TraceHitColor = FLinearColor::Green,
    float DrawTime = 5.0f
    );
  • ETraceTypeQuery 说明

    • 默认 TraceTypeQuery1 —— Visibility
    • 默认 TraceTypeQuery2 —— Camera
    • 可在 ProjectSettings->Engine->Collision->Trace Channels 添加自定义
  • 代码实现

    // 起始点和检测结果
    FVector BeginLoc = GetActorLocation();
    FVector EndLoc = BeginLoc + GetActorForwardVector() * 1000;
    FHitResult HitResult; // 要忽略的物体
    TArray<AActor*> IgnoreActors; // 射线检测
    bool bIsHit = UKismetSystemLibrary::LineTraceSingle(GetWorld(), BeginLoc, EndLoc, TraceTypeQuery1, false, IgnoreActors, EDrawDebugTrace::ForDuration, HitResult, true);
    if (bIsHit)
    {
    UKismetSystemLibrary::PrintString(GetWorld(), HitResult.GetActor()->GetName());
    }

LineTraceSingleForObjects

根据 Object Type 检测单个物体

  • Syntax

    static bool LineTraceSingleForObjects(
    const UObject* WorldContextObject,
    const FVector Start,
    const FVector End,
    const TArray<TEnumAsByte<EObjectTypeQuery> > & ObjectTypes,
    bool bTraceComplex,
    const TArray<AActor*>& ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult& OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor = FLinearColor::Red,
    FLinearColor TraceHitColor = FLinearColor::Green,
    float DrawTime = 5.0f
    );
  • EObjectTypeQuery 对应 ObjectType

    • 默认 ObjectTypeQuery1 —— WorldStatic
    • 默认 ObjectTypeQuery2 —— WorldDynamic
    • 默认 ObjectTypeQuery3 —— Oawn
    • 默认 ObjectTypeQuery4 —— PhysicasBody
    • 默认 ObjectTypeQuery5 —— Vehicle
    • 默认 ObjectTypeQuery6 —— Destructible
    • 可以再 ProjectSettings->Engine->Collision->Object Channels 添加自定义
  • 代码实现

    // 设置要检测的 Object Type
    TArray<TEnumAsByte<EObjectTypeQuery> > ObjectTypes;
    ObjectTypes.Add(EObjectTypeQuery::ObjectTypeQuery1); //开始检测
    bool bIsHit = UKismetSystemLibrary::LineTraceSingleForObjects(GetWorld(), BeginLoc, EndLoc, ObjectTypes, false, IgnoreActors, EDrawDebugTrace::ForDuration, HitResult, true);
    if (bIsHit)
    {
    UKismetSystemLibrary::PrintString(GetWorld(), HitResult.GetActor()->GetName());
    }

LineTraceSingleByProfile

根据 Collision Preset 检测单个物体

  • Syntax

    static bool LineTraceSingleByProfile(
    const UObject* WorldContextObject,
    const FVector Start,
    const FVector End,
    FName ProfileName,
    bool bTraceComplex,
    const TArray<AActor*>& ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult& OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor = FLinearColor::Red,
    FLinearColor TraceHitColor = FLinearColor::Green,
    float DrawTime = 5.0f
    );
  • ProfileName 对应 Collision Preset 的名称

  • 代码实现

    bool bIsHit = UKismetSystemLibrary::LineTraceSingleByProfile(GetWorld(), BeginLoc, EndLoc,TEXT("BlockAll"), false, IgnoreActors, EDrawDebugTrace::ForDuration, HitResult, true);
    if (bIsHit)
    {
    UKismetSystemLibrary::PrintString(GetWorld(), HitResult.GetActor()->GetName());
    }

LineTraceMulti

根据 Channel 检测多个物体,输出 TArray&

  • Syntax

    static bool LineTraceMulti(
    const UObject* WorldContextObject,
    const FVector Start,
    const FVector End,
    ETraceTypeQuery TraceChannel,
    bool bTraceComplex,
    const TArray<AActor*>& ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray<FHitResult>& OutHits,
    bool bIgnoreSelf,
    FLinearColor TraceColor = FLinearColor::Red,
    FLinearColor TraceHitColor = FLinearColor::Green,
    float DrawTime = 5.0f
    );

LineTraceMultiForObjects

根据 Object Type 检测多个物体,输出 TArray&

  • Syntax

    static bool LineTraceMultiForObjects(
    const UObject* WorldContextObject,
    const FVector Start,
    const FVector End,
    const TArray<TEnumAsByte<EObjectTypeQuery> > & ObjectTypes,
    bool bTraceComplex,
    const TArray<AActor*>& ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray<FHitResult>& OutHits,
    bool bIgnoreSelf, FLinearColor TraceColor = FLinearColor::Red,
    FLinearColor TraceHitColor = FLinearColor::Green,
    float DrawTime = 5.0f
    );

LineTraceMultiByProfile

根据 Collision Preset 检测多个物体,输出 TArray&

  • Syntax

    static bool LineTraceMultiByProfile
    (
    const UObject* WorldContextObject,
    const FVector Start,
    const FVector End,
    FName ProfileName,
    bool bTraceComplex,
    const TArray<AActor*>& ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray<FHitResult>& OutHits,
    bool bIgnoreSelf,
    FLinearColor TraceColor = FLinearColor::Red,
    FLinearColor TraceHitColor = FLinearColor::Green,
    float DrawTime = 5.0f
    );

BoxTrace

  • BoxTraceSingle

    static bool BoxTraceSingle
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    const FVector HalfSize,
    const FRotator Orientation,
    ETraceTypeQuery TraceChannel,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult & OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • BoxTraceMulti

    static bool BoxTraceMulti
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    FVector HalfSize,
    const FRotator Orientation,
    ETraceTypeQuery TraceChannel,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray < FHitResult > & OutHits,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • BoxTraceSingleForObjects

    static bool BoxTraceSingleForObjects
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    const FVector HalfSize,
    const FRotator Orientation,
    const TArray < TEnumAsByte < EObjectTypeQuery > > & ObjectTypes,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult & OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • BoxTraceMultiForObjects

    static bool BoxTraceMultiForObjects
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    const FVector HalfSize,
    const FRotator Orientation,
    const TArray < TEnumAsByte < EObjectTypeQuery > > & ObjectTypes,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray < FHitResult > & OutHits,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • BoxTraceSingleByProfile

    static bool BoxTraceSingleByProfile
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    const FVector HalfSize,
    const FRotator Orientation,
    FName ProfileName,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult & OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • BoxTraceMultiByProfile

    static bool BoxTraceMultiByProfile
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    FVector HalfSize,
    const FRotator Orientation,
    FName ProfileName,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray < FHitResult > & OutHits,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )

SphereTrace

  • SphereTraceSingle

    static bool SphereTraceSingle
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    ETraceTypeQuery TraceChannel,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult & OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • SphereTraceMulti

    static bool SphereTraceMulti
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    ETraceTypeQuery TraceChannel,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray < FHitResult > & OutHits,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • SphereTraceSingleForObjects

    static bool SphereTraceSingleForObjects
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    const TArray < TEnumAsByte < EObjectTypeQuery > > & ObjectTypes,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult & OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • SphereTraceMultiForObjects

    static bool SphereTraceMultiForObjects
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    const TArray < TEnumAsByte < EObjectTypeQuery > > & ObjectTypes,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray < FHitResult > & OutHits,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • SphereTraceSingleByProfile

    static bool SphereTraceSingleByProfile
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    FName ProfileName,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult & OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • SphereTraceMultiByProfile

    static bool SphereTraceMultiByProfile
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    FName ProfileName,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray < FHitResult > & OutHits,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )

CapsuleTrace

  • CapsuleTraceSingle

    static bool CapsuleTraceSingle
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    float HalfHeight,
    ETraceTypeQuery TraceChannel,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult & OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • CapsuleTraceMulti

    static bool CapsuleTraceMulti
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    float HalfHeight,
    ETraceTypeQuery TraceChannel,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray < FHitResult > & OutHits,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • CapsuleTraceSingleForObjects

    static bool CapsuleTraceSingleForObjects
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    float HalfHeight,
    const TArray < TEnumAsByte < EObjectTypeQuery > > & ObjectTypes,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult & OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • CapsuleTraceMultiForObjects

    static bool CapsuleTraceMultiForObjects
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    float HalfHeight,
    const TArray < TEnumAsByte < EObjectTypeQuery > > & ObjectTypes,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray < FHitResult > & OutHits,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • CapsuleTraceSingleByProfile

    static bool CapsuleTraceSingleByProfile
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    float HalfHeight,
    FName ProfileName,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    FHitResult & OutHit,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )
  • CapsuleTraceMultiByProfile

    static bool CapsuleTraceMultiByProfile
    (
    const UObject * WorldContextObject,
    const FVector Start,
    const FVector End,
    float Radius,
    float HalfHeight,
    FName ProfileName,
    bool bTraceComplex,
    const TArray < AActor * > & ActorsToIgnore,
    EDrawDebugTrace::Type DrawDebugType,
    TArray < FHitResult > & OutHits,
    bool bIgnoreSelf,
    FLinearColor TraceColor,
    FLinearColor TraceHitColor,
    float DrawTime
    )

参考

【UE4 C++】 射线检测 LineTrace 及 BoxTrace、SphereTrace、CapsuleTrace API的更多相关文章

  1. 【Unity3D】枪战游戏—发射子弹、射线检测

    一.子弹的碰撞检测: 因为子弹的移动速度非常的快,那么如果为子弹添加一个collider,就有可能检测不到了. 因为collider是每一帧在执行,第一帧子弹可能在100米处,那么下一帧就在900米处 ...

  2. Unity3D 之射线检测

    这里来记录下射线检测的相关内容: 射线检测故名就是通过射线去检测是否和碰撞器产生了交集,和碰撞器与碰撞器发生交集一样,会返回一个真. 射线的用法很多:比如检测是否跳跃,通过向地面投射射线控制在地面时候 ...

  3. Unity3D 5.0简单的射线检测实现跳跃功能

    这里是一个简单的跳跃,5.0和其他版本貌似不一样,并且,再起跳功能做的不完全. 不过一个基本的思路在这里. 1.首先,射线检测,这里是利用一个空对象,放到主角对象的下面 2.然后调节射线的位置,在主角 ...

  4. UGUI射线检测

    1.Graphic Raycaster 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上). Ignor ...

  5. Unity射线检测的用法总结

    RayCast 射线检测 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...

  6. U3D学习10——关节和射线检测

    1.弹簧  2.铰链  3.固定关节  4.角色关节  5.自定义关节  6.raycast和raycasthit 射线有位移参数,可以设定只触发某一层的. 7.射线检测用于高速和精确 update是 ...

  7. Layabox 3D游戏开发学习笔记---射线检测,鼠标控制物体运动

    核心要点:3D物体碰撞是靠射线检测,射线与碰撞器相撞获取对应的碰撞点信息. class RayPicking03 { private ray: Laya.Ray; private point: Lay ...

  8. 【转】 [UnityUI]UGUI射线检测

    http://blog.csdn.net/lyh916/article/details/50947026 1.Graphic Raycaster 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂 ...

  9. Unity - Raycast 射线检测

    本文简要分析了Unity中射线检测的基本原理及用法,包括: Ray 射线 RaycastHit 光线投射碰撞信息 Raycast 光线投射 SphereCast 球体投射 OverlapSphere ...

随机推荐

  1. RabbitMQ-如何保证消息在99.99%的情况下不丢失

    1. 简介 MQ虽然帮我们解决了很多问题,但是也带来了很多问题,其中最麻烦的就是,如何保证消息的可靠性传输. 我们在聊如何保证消息的可靠性传输之前,先考虑下哪些情况下会出现消息丢失的情况. 首先,上图 ...

  2. 完蛋,公司被一条 update 语句干趴了!

    大家好,我是小林. 昨晚在群划水的时候,看到有位读者说了这么一件事. 在这里插入图片描述 大概就是,在线上执行一条 update 语句修改数据库数据的时候,where 条件没有带上索引,导致业务直接崩 ...

  3. JDK7u21反序列化详解

    目录 前言 环境 倒序分析 TemplatesImpl AnnotationInvocationHandler HashMap 总结 前言 听说jdk7u21的反序列化涉及的知识量很多,很难啃,具体来 ...

  4. 前缀树及其Java实现

    前缀树 基础知识 Trie树.又称之为单词查找树或者键树,是一种树形结构.应用于统计和排序大量的字符串.常被搜索引擎系统用于文本词频统计.它的优点:能够最大限度的减少无谓的字符串比较,查询效率比哈希表 ...

  5. Linux上项目部署在home目录中无法访问的问题

    在Linux上开发一个Web项目,使用nginx作为Web服务器.在nginx的配置文件中添加一个server,root路径写的是放在home目录中的项目目录的路径.打开浏览器访问,提示错误:403 ...

  6. Android使用百度语音识别api代码实现。

    第一步 ① 创建平台应用 点击百度智能云进入,没有账号的可以先注册账号,这里默认都有账号了,然后登录. 然后左侧导航栏点击找到语音技术 然后会进入一个应用总览页面, 然后点击创建应用 立即创建 点击查 ...

  7. SQLmap的基本命令

    Sqlmap sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入.目前支持的数据库有MySql.Oracle.Access.PostageSQL.SQL  ...

  8. Android实现自动登录和记住密码

    效果图: 在勾选自动登录后下次打开软件会直接跳过登录界面 代码: protected void onCreate(Bundle savedInstanceState) { super.onCreate ...

  9. 一、java基础补充

    1.java执行流程 源文件由编译器编译成字节码(ByteCode),也就是.class文件 字节码由java虚拟机解释运行 通过命令行操作java程序: javac test.java java t ...

  10. Batch Size对神经网络训练的影响

    ​ 前言 这篇文章非常全面细致地介绍了Batch Size的相关问题.结合一些理论知识,通过大量实验,文章探讨了Batch Size的大小对模型性能的影响.如何影响以及如何缩小影响等有关内容. 本文来 ...