.h
UFUNCTION() void StartLineTrace(); UPROPERTY() AActor* RootActor; };
.cpp
// Called when the game starts
void ULineTraceComponent::BeginPlay()
{
Super::BeginPlay();
// 绑定射线检测事件
if (RootActor==nullptr)
{
RootActor = GetAttachmentRootActor();
}
if (RootActor!=nullptr)
{
if (RootActor->InputComponent==nullptr)
{
RootActor->EnableInput(UGameplayStatics::GetPlayerController(GWorld,0));
}
UE_LOG(LogTemp, Warning, TEXT("bind StartTraceLine successfully"));
RootActor->InputComponent->BindAction("LeftMouse", EInputEvent::IE_Pressed, this, &ULineTraceComponent::StartLineTrace);
}
// 显示鼠标
UGameplayStatics::GetPlayerController(GWorld, 0)->bShowMouseCursor = true;
}
void ULineTraceComponent::StartLineTrace()
{
UKismetSystemLibrary::PrintString(GWorld, "Click Left Mouse");
// 碰撞参数
FCollisionQueryParams CollisonQueryParams(TEXT("QueryParams"), true, NULL);
CollisonQueryParams.bTraceComplex = true;
CollisonQueryParams.bReturnPhysicalMaterial = false;
CollisonQueryParams.AddIgnoredActor(RootActor);
// 获取PlayerController
APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GWorld, 0);
// 得到摄像机的位置和旋转
FVector CamPos;
FRotator CamRot;
PlayerController->GetPlayerViewPoint(CamPos, CamRot);
//获取鼠标的位置和方向
FVector MousePos, MouseDir;
PlayerController->DeprojectMousePositionToWorld(MousePos, MouseDir);
//输出摄像机,鼠标位置信息
//UKismetSystemLibrary::PrintString(GWorld, FString::Printf(TEXT("CamPos:%snCamRot:%snMousePos:%snMouseDir:%s"), *CamPos.ToString(), *CamRot.ToString(),*MousePos.ToString(),*MouseDir.ToString()));
// 起始点和检测结果
// 起始点:摄像机坐标
// 结束点:摄像机到鼠标的射线
FVector LineStart = CamPos;
FVector LineEnd = CamPos + MouseDir * 1000;
FHitResult HitResult;
//射线检测
GetWorld()->LineTraceSingleByChannel(HitResult, LineStart, LineEnd, ECollisionChannel::ECC_Visibility, CollisonQueryParams);
if (HitResult.GetActor())
{
UE_LOG(LogTemp, Warning, TEXT("hit %s"), *HitResult.GetActor()->GetName());
}
//射线绘制
UKismetSystemLibrary::DrawDebugLine(GetWorld(), LineStart, LineEnd, FLinearColor::Red, 10.f, 10.f);
}



