- UE4内置的函数:UWorld::LineTraceSingleByChannel
该线轨迹将光线射入空间,并根据选定的轨迹通道进行碰撞
void AFirstPawn::lineTraceSingleByChannel() {
FHitResult HitResult;
FVector Start = GetActorLocation() /*+ FVector(0.f, 0.f, 75.f)*/;
FVector End = Start + GetActorForwardVector() * 500.f;
FCollisionQueryParams CollisionQueryParams;
CollisionQueryParams.AddIgnoredActor(this);
GetWorld()->LineTraceSingleByChannel(HitResult, Start, End, ECollisionChannel::ECC_Visibility, CollisionQueryParams);
if (HitResult.bBlockingHit) {
//DrawDebugSphere(GetWorld(), HitResult.Location, 15.f, 12, FColor::Red, false, 5.f);
//DrawDebugLine(GetWorld(), Start, HitResult.Location, FColor::Red, true, 3.f);
DrawDebugPoint(GetWorld(), HitResult.Location, 5.f, FColor::Blue, false, 5.f);
}
}
最后一个参数:FCollisionQueryParams的对象作为可选参数,该参数可以指定有关冲突查询的详细信息,例如要忽略的参与者.
我们在场景中摆放三个立方体
第一个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【阻挡】
第二个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【重叠】
第三个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【忽略】
可以看到只有第一个设置【Visibility】->【阻挡】发生了作用
2. UWorld::LineTraceMultiByChannel
void AFirstPawn::lineTraceMultiByChannel() {
FHitResult HitResult;
FVector Start = GetActorLocation() /*+ FVector(0.f, 0.f, 75.f)*/;
FVector End = Start + GetActorForwardVector() * 1000.f;
FCollisionQueryParams CollisionQueryParams;
CollisionQueryParams.AddIgnoredActor(this);
TArray<FHitResult> HitResults;
GetWorld()->LineTraceMultiByChannel(HitResults, Start, End, ECollisionChannel::ECC_Visibility);
for (int32 i = 0; i < HitResults.Num(); i++) {
if (HitResults[i].bBlockingHit) {
FString ActorName = HitResults[i].Actor->GetName();
printf_k(i, "%d Actor Name: %s", i, *ActorName);
} else {
//printf_k(i, "%d Failed hit!", i);
FString ActorName = HitResults[i].Actor->GetName();
printf_k(i, "%d Failed hit: %s", i, *ActorName);
}
}
}
放置是三个立方体,从前往后设置参数:
第一个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【忽略】
第二个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【重叠】
第三个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【阻挡】
第一个立方体直接被忽略掉,第二个立方体检测到重叠但是没有检测到碰撞,第三个检测到了碰撞
3.UKismetSystemLibrary::BoxTraceSingleForObjects
/**
* ObjectTypeQuery1 : World Static
* ObjectTypeQuery2 : World Dynamic
* ObjectTypeQuery3 : Pawn
* ObjectTypeQuery4 : Physics Body
* ObjectTypeQuery5 : Destructible
* ObjectTypeQuery6 : First Custom Object Type
* ObjectTypeQuery7 : Second Custom Object Type
*/
void AFirstPawn::boxTraceSingleForObjects() {
FHitResult HitResult;
FVector Start = GetActorLocation() /*+ FVector(0.f, 0.f, 75.f)*/;
FVector End = Start + GetActorForwardVector() * 1000.f;
FCollisionQueryParams CollisionQueryParams;
CollisionQueryParams.AddIgnoredActor(this);
TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;
ObjectTypes.Add(EObjectTypeQuery::ObjectTypeQuery2);
TArray<AActor*> ActorsToIgnore;
ActorsToIgnore.Add(this);
FHitResult BoxTraceResult;
UKismetSystemLibrary::BoxTraceSingleForObjects(
GetWorld()//UWorld对象
, Start //跟踪的起始位置
, End //是跟踪的结束位置
, FVector(32.f, 32.f, 32.f) //跟踪盒子一半的大小
, FRotator() //跟踪盒子旋转方向
, ObjectTypes//是对象类型数组
, true //是否对复杂的几何图形进行跟踪
, ActorsToIgnore//要忽略数组的参与者
/**
* ForOneFrame:来绘制单个帧的跟踪
* ForDuration:使跟踪能够持续指定的时间
* None:示不绘制任何调试形状
* Persistent:表示调试形状将在世界中持续存在
*/
, EDrawDebugTrace::ForDuration
, BoxTraceResult //碰撞的结果
, true
, FColor::Red //跟踪颜色,它将用于绘制方框
, FColor::Blue//是跟踪命中颜色,用于显示命中的点
);
if (BoxTraceResult.bBlockingHit) {
print_k(1, "Blocking Hit!");
}
}
文章来源:https://www.toymoban.com/news/detail-460742.html
aaa文章来源地址https://www.toymoban.com/news/detail-460742.html
到了这里,关于UE4碰撞射线检测2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!