【UE4 C++】 射线检测 LineTrace 及 BoxTrace、SphereTrace、CapsuleTrace API
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的更多相关文章
- 【Unity3D】枪战游戏—发射子弹、射线检测
一.子弹的碰撞检测: 因为子弹的移动速度非常的快,那么如果为子弹添加一个collider,就有可能检测不到了. 因为collider是每一帧在执行,第一帧子弹可能在100米处,那么下一帧就在900米处 ...
- Unity3D 之射线检测
这里来记录下射线检测的相关内容: 射线检测故名就是通过射线去检测是否和碰撞器产生了交集,和碰撞器与碰撞器发生交集一样,会返回一个真. 射线的用法很多:比如检测是否跳跃,通过向地面投射射线控制在地面时候 ...
- Unity3D 5.0简单的射线检测实现跳跃功能
这里是一个简单的跳跃,5.0和其他版本貌似不一样,并且,再起跳功能做的不完全. 不过一个基本的思路在这里. 1.首先,射线检测,这里是利用一个空对象,放到主角对象的下面 2.然后调节射线的位置,在主角 ...
- UGUI射线检测
1.Graphic Raycaster 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上). Ignor ...
- Unity射线检测的用法总结
RayCast 射线检测 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...
- U3D学习10——关节和射线检测
1.弹簧 2.铰链 3.固定关节 4.角色关节 5.自定义关节 6.raycast和raycasthit 射线有位移参数,可以设定只触发某一层的. 7.射线检测用于高速和精确 update是 ...
- Layabox 3D游戏开发学习笔记---射线检测,鼠标控制物体运动
核心要点:3D物体碰撞是靠射线检测,射线与碰撞器相撞获取对应的碰撞点信息. class RayPicking03 { private ray: Laya.Ray; private point: Lay ...
- 【转】 [UnityUI]UGUI射线检测
http://blog.csdn.net/lyh916/article/details/50947026 1.Graphic Raycaster 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂 ...
- Unity - Raycast 射线检测
本文简要分析了Unity中射线检测的基本原理及用法,包括: Ray 射线 RaycastHit 光线投射碰撞信息 Raycast 光线投射 SphereCast 球体投射 OverlapSphere ...
随机推荐
- 剑指 Offer 14- II. 剪绳子 II
剑指 Offer 14- II. 剪绳子 II 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]... ...
- 使用 Dockerfile 自定义 Nginx 镜像
一般来说,自定义Nginx只需要把静态文件放到镜像里就可以了,不需要重写 CMD 与 ENTRYPOINT.但是,如果的确需要在 Nginx 启动前执行一些操作,就需要重写 CMD 了,如果写成下边就 ...
- 安全测试工具(1)- Burp Suite Pro的安装教程
啥是Burp Suite 用于攻击web 应用程序的集成平台 程序员必备技能,不仅可以拿来做渗透测试.漏洞挖掘还能帮助程序员调试程序 Bug 它包含了许多Burp工具,这些不同的burp工具通过协同工 ...
- C#中的“等待窗体”对话框
这篇文章向您展示了如何在c#.net Windows窗体应用程序中创建一个等待窗体对话框.创建一个新表单,然后输入您的表单名称为frmWaitForm.接下来,将Label,Progress Bar控 ...
- API:获取当前用户的公网IP
在vue项目根目录下" public " 文件夹中的index.html,也就是根节点所在的文件引入JS,vue项目中静态文件需要在这里引入,用 script 标签规避跨域 < ...
- IDE集成管理Tomcat的基本原理
知道IDE是怎样控制Tomcat的,对更清晰地理解Java Web的执行过程有帮助.在此以IntelliJ IDEA为例,简要描述一下IDE集成管理Tomcat的基本原理. 首先是两个重要的环境变量: ...
- Win8 iis 环境搭建
http://www.cnblogs.com/Joans/archive/2012/07/16/2593828.html 系统:win8 环境:vs2012 一:安装IIS 比较win7的安装来说,多 ...
- 洛谷P1308——单词统计
https://www.luogu.org/problem/show?pid=1308 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在 ...
- scrum项目冲刺_day05总结
摘要:今日完成任务. 1.语音识别完成 2.搜索功能实现了从数据库中的查询 总任务: 一.appUI页面(已完成) 二.首页功能: 1.图像识别功能(已完成) 2.语音识别功能(已完成) 3.垃圾搜索 ...
- css3 显示一行内容,多余的以省略号显示
overflow: hidden; white-space: nowrap; text-overflow: ellipsis; 代码如上