【UE5C++】實(shí)現(xiàn)球形碰撞檢測(cè)的兩種個(gè)函數(shù):SweepMultiByObjectType和SphereTraceMult
UKismetSystemLibrary::SphereTraceMultiForObjects函數(shù)
(官方藍(lán)圖里面使用的就是這個(gè)函數(shù),推薦使用)
float SeekRadius = 100.0f;
TArray<FHitResult> HitResults2;
FVector BeginLocation = FollowCamera->GetComponentLocation();////起點(diǎn)位置
FVector EndLocation = BeginLocation + FollowCamera->GetForwardVector() * 1000;//終點(diǎn)位置
TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;
ObjectTypes.Add(EObjectTypeQuery::ObjectTypeQuery2);//Pawn
TArray<AActor* > IgnoreActors;
//參數(shù)列表場(chǎng)景可查看同名藍(lán)圖節(jié)點(diǎn)
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)
{
//對(duì)Actor們做的事情
}
}
}
SweepMultiByObjectType函數(shù)
TArray<FHitResult> HitResults;//檢測(cè)結(jié)果合集
FVector LineStart = FollowCamera->GetComponentLocation();;//起點(diǎn)位置
FVector LineEnd = LineStart + FollowCamera->GetForwardVector() * 3000;//終點(diǎn)位置
FCollisionObjectQueryParams ObjectQueryParams;//碰撞對(duì)象查詢參數(shù)
ObjectQueryParams.AddObjectTypesToQuery(ECC_Pawn); //添加檢測(cè)對(duì)象
FCollisionShape Shape;//碰撞檢測(cè)的形狀,可以是盒子,圓柱體或者球體
Shape.MakeSphere(150.0f);
Shape.SetSphere(150.0f);//設(shè)置大小
FCollisionQueryParams Params;//碰撞對(duì)象查詢參數(shù)
Params.AddIgnoredActor(this);//忽略自身
DrawDebugLine(GetWorld(), LineStart, LineEnd, FColor::Red, false, 2.0f, 0.0f, 2.0f);
//這個(gè)函數(shù)當(dāng)遇到第一個(gè)碰撞的物體的時(shí)候就會(huì)停下,然后收集所有的重疊部分
//第四個(gè)參數(shù)是球體的旋轉(zhuǎn),但是查詢中的旋轉(zhuǎn)沒有意義所以設(shè)置為空旋轉(zhuǎn)
if (GetWorld()->SweepMultiByObjectType(HitResults, LineStart, LineEnd, FQuat::Identity, ObjectQueryParams, Shape, Params))
{
for (FHitResult Hit : HitResults)//創(chuàng)建單個(gè)碰撞結(jié)果集,對(duì)多對(duì)象碰撞結(jié)果集合進(jìn)行遍歷
{
AActor* HitActor = Hit.GetActor();
if (HitActor)
{
//對(duì)Actor們做的事情
UKismetSystemLibrary::PrintString(this, TEXT("Hit Succeed,HitActorName is :") + HitActor->GetName());
}
}
}