欢迎光临散文网 会员登陆 & 注册

【UE5C++】实现球形碰撞检测的两种个函数:SweepMultiByObjectType和SphereTraceMult

2023-03-27 16:56 作者:一只箱君  | 我要投稿

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());

}

}

}



【UE5C++】实现球形碰撞检测的两种个函数:SweepMultiByObjectType和SphereTraceMult的评论 (共 条)

分享到微博请遵守国家法律