/**
默认 TraceTypeQuery1 —— Visibility
默认 TraceTypeQuery2 —— Camera
*/
void ATraceCharacter::traceByChannel() {
//获取该组件的拥有者
AActor* MyOwner = GetOwner();
//射线的开始位置和结束位置
FVector Start;
FRotator StartRotation;
MyOwner->GetActorEyesViewPoint(Start, StartRotation);
//Start = Mesh1P->GetComponentLocation();
FVector End = Start + StartRotation.Vector() * 1000.0f;
FHitResult Hit;
//根据通道查询 在这里需要注意AddIgnoredActor添加了该射线忽略的Actor,不然会造成检测错误
FCollisionQueryParams QueryParams;
QueryParams.AddIgnoredActor(MyOwner);
/**
* 参数类型
*Hit碰撞信息 起始点、结束点、碰撞通道、查询参数
*/
bool BIsTraced = GetWorld()->LineTraceSingleByChannel(Hit, Start, End, ECollisionChannel::ECC_Visibility, QueryParams);
if (BIsTraced) {
UKismetSystemLibrary::PrintString(GetWorld(), FString::Printf(TEXT("LineTraceSingleByChannel : %s"), *Hit.Actor->GetName()));
}
}
/**
默认 ObjectTypeQuery1 —— WorldStatic
默认 ObjectTypeQuery2 —— WorldDynamic
默认 ObjectTypeQuery3 —— Oawn
默认 ObjectTypeQuery4 —— PhysicasBody
默认 ObjectTypeQuery5 —— Vehicle
默认 ObjectTypeQuery6 —— Destructible
*/
void ATraceCharacter::traceByObjType() {
//获取该组件的拥有者
AActor* MyOwner = GetOwner();
//射线的开始位置和结束位置
FVector Start;
FRotator StartRotation;
MyOwner->GetActorEyesViewPoint(Start, StartRotation);
FVector End = Start + StartRotation.Vector() * 4000;
//碰撞对象查询
FCollisionObjectQueryParams ObjectQueryParams;
ObjectQueryParams.AddObjectTypesToQuery(ECollisionChannel::ECC_WorldStatic);
//单通道射线根据对象类型检测
FHitResult Hit;
/**
* 参数类型
* Hit碰撞信息、起始点、结束点、对象检测参数。
*/
bool BIsTraced = GetWorld()->LineTraceSingleByObjectType(Hit, Start, End, ObjectQueryParams);
if (BIsTraced) {
UKismetSystemLibrary::PrintString(GetWorld(), FString::Printf(TEXT("LineTraceSingleByObjectType : %s"), *Hit.Actor->GetName()));
}
}
以下是不常用
void ATraceCharacter::traceHit() {
AMainPlayerController* PC = Cast<AMainPlayerController>(UGameplayStatics::GetPlayerController(GetWorld(), 0));
//获取屏幕宽高
int32 width = 0;
int32 height = 0;
PC->GetViewportSize(width, height);
//将屏幕位置投影到世界
FVector STMPos;
FVector STMDir;
//宽高/2就是屏幕中心点
PC->DeprojectScreenPositionToWorld(width / 2, height / 2, STMPos, STMDir);
FVector CameraPos = PC->PlayerCameraManager->GetCameraLocation();
FVector CameraDir = PC->PlayerCameraManager->GetActorForwardVector() * 300;
FHitResult Hit;
//摄像机发射射线,单射线检查,只有一个目标
//Start:CameraPos + CameraDir
//End: CameraPos + STMDir * 5000 ,相机位置往世界方向发射一条5000长的射线
if (GetWorld()->LineTraceSingleByChannel(Hit, CameraPos + CameraDir, CameraPos + STMDir * 5000, ECC_Camera)) {
FString msg = Hit.GetActor()->GetName();
GEngine->AddOnScreenDebugMessage(-1, 2.0, FColor::Red, msg + TEXT(" hitting..."));
UTraceInterface* trace = Cast<UTraceInterface>(Hit.Actor);
if (trace) {
UE_LOG(LogTemp, Warning, TEXT("**************"));
}
}
}
void ATraceCharacter::traceFire() {
AMainPlayerController* PC = Cast<AMainPlayerController>(UGameplayStatics::GetPlayerController(GetWorld(), 0));
FVector FireStart, FireEnd;
FireStart = FirstPersonCameraComponent->GetComponentLocation() + FirstPersonCameraComponent->GetForwardVector();
FireEnd = FirstPersonCameraComponent->GetForwardVector() * 1500 + FireStart;
FHitResult OutHit;
TArray<AActor*> ActorsToIgnotre;
UKismetSystemLibrary::LineTraceSingle(this, FireStart, FireEnd, ETraceTypeQuery::TraceTypeQuery1, false, ActorsToIgnotre, EDrawDebugTrace::ForDuration, OutHit, true);
UTraceInterface* trace = Cast<UTraceInterface>(OutHit.Actor);
if (trace) {
FString msg = OutHit.GetActor()->GetName();
GEngine->AddOnScreenDebugMessage(-1, 2.0, FColor::Red, msg + TEXT(" hitting..."));
}
}
void ATraceCharacter::traceFire2() {
FRotator cameraRotator = FirstPersonCameraComponent->GetComponentRotation();
//相机向前的方向
FVector cameraForward = UKismetMathLibrary::GetForwardVector(cameraRotator);
UE_LOG(LogTemp, Warning, TEXT("cameraForward: (X:%f,Y:%f,Z:%f)"), cameraForward.X, cameraForward.Y, cameraForward.Z);
//相机的位置 向量的取值范围在 -1 ~ 1之间
FVector cameraLocation = FirstPersonCameraComponent->GetComponentLocation();
UE_LOG(LogTemp, Warning, TEXT("cameraLocation: (X:%f,Y:%f,Z:%f)"), cameraLocation.X, cameraLocation.Y, cameraLocation.Z);
//射线结束位置
FVector endLocation = cameraLocation + cameraForward * 1500;
UE_LOG(LogTemp, Warning, TEXT("endLocation: (X:%f,Y:%f,Z:%f)"), endLocation.X, endLocation.Y, endLocation.Z);
FHitResult hitResult;
TArray<AActor*>ignoreArray;
bool bHit = UKismetSystemLibrary::LineTraceSingle(GetWorld(), cameraLocation, endLocation
, ETraceTypeQuery::TraceTypeQuery1, false, ignoreArray, EDrawDebugTrace::Persistent
, hitResult, true/*, FLinearColor::Red, FLinearColor::Green, 2.0*/);
if (bHit){
UKismetSystemLibrary::PrintString(GetWorld(),FString::Printf(TEXT("Name:%s"), *hitResult.Actor->GetName()));
}
}
void ATraceCharacter::traceByChannelDraw() {
// 碰撞参数
FCollisionQueryParams CollisonQueryParams(TEXT("QueryParams"), true, NULL);
CollisonQueryParams.bTraceComplex = true;
CollisonQueryParams.bReturnPhysicalMaterial = false;
CollisonQueryParams.AddIgnoredActor(this);
// 起始点和检测结果
FVector BeginLoc = GetActorLocation();
FVector EndLoc = BeginLoc + GetActorForwardVector() * 4000;
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());
}
}
aaa