【UE5C++】实现球形碰撞检测的两种个函数:SweepMultiByObjectType和SphereTraceMult
UKismetSystemLibrary::SphereTraceMultiForObjects函数
(官方蓝图里面使用的就是这个函数,推荐使用)
float SeekRadius = 100.0f;
TArray<FHitResult> HitResults2;
FVector BeginLocation = FollowCamera->GetComponentLocation();////起点位置
FVector EndLocation = BeginLocation + FollowCamera->GetForwardVector() * 1000;//终点位置
TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;
ObjectTypes.Add(EObjectTypeQuery::ObjectTypeQuery2);//Pawn
TArray<AActor* > IgnoreActors;
//参数列表场景可查看同名蓝图节点
bool bIsHit = UKismetSystemLibrary::SphereTraceMultiForObjects(GetWorld(), BeginLocation, EndLocation, SeekRadius, ObjectTypes, true, IgnoreActors, EDrawDebugTrace::ForDuration, HitResults2, true);
if (bIsHit)
{
for (FHitResult HitResult : HitResults2)
{
if (HitResult.GetActor() != NULL)
{
//对Actor们做的事情
}
}
}
SweepMultiByObjectType函数
TArray<FHitResult> HitResults;//检测结果合集
FVector LineStart = FollowCamera->GetComponentLocation();;//起点位置
FVector LineEnd = LineStart + FollowCamera->GetForwardVector() * 3000;//终点位置
FCollisionObjectQueryParams ObjectQueryParams;//碰撞对象查询参数
ObjectQueryParams.AddObjectTypesToQuery(ECC_Pawn); //添加检测对象
FCollisionShape Shape;//碰撞检测的形状,可以是盒子,圆柱体或者球体
Shape.MakeSphere(150.0f);
Shape.SetSphere(150.0f);//设置大小
FCollisionQueryParams Params;//碰撞对象查询参数
Params.AddIgnoredActor(this);//忽略自身
DrawDebugLine(GetWorld(), LineStart, LineEnd, FColor::Red, false, 2.0f, 0.0f, 2.0f);
//这个函数当遇到第一个碰撞的物体的时候就会停下,然后收集所有的重叠部分
//第四个参数是球体的旋转,但是查询中的旋转没有意义所以设置为空旋转
if (GetWorld()->SweepMultiByObjectType(HitResults, LineStart, LineEnd, FQuat::Identity, ObjectQueryParams, Shape, Params))
{
for (FHitResult Hit : HitResults)//创建单个碰撞结果集,对多对象碰撞结果集合进行遍历
{
AActor* HitActor = Hit.GetActor();
if (HitActor)
{
//对Actor们做的事情
UKismetSystemLibrary::PrintString(this, TEXT("Hit Succeed,HitActorName is :") + HitActor->GetName());
}
}
}