void ASoftDesignTrainingPlayerController::OnTakeCoverPressed() { APawn* const Pawn = GetPawn(); if (Pawn) { FVector actorLocation = Pawn->GetActorLocation(); FRotator actorRotation = Pawn->GetActorRotation(); FVector coverTestStart = actorLocation; FVector coverTestEnd = actorLocation + 400.0f * actorRotation.Vector(); UWorld* currentWorld = GetWorld(); static FName InitialCoverSweepTestName = TEXT("InitialCoverSweepTest"); FHitResult hitResult; FQuat shapeRot = FQuat::Identity; FCollisionShape collShape = FCollisionShape::MakeSphere(Pawn->GetSimpleCollisionRadius()); FCollisionQueryParams collQueryParams(InitialCoverSweepTestName, false, Pawn); currentWorld->DebugDrawTraceTag = InitialCoverSweepTestName; FCollisionObjectQueryParams collObjQueryParams(ECC_WorldStatic); UDesignTrainingMovementComponent* charMovement = Cast<UDesignTrainingMovementComponent>(Pawn->GetMovementComponent()); if (currentWorld->SweepSingleByObjectType(hitResult, coverTestStart, coverTestEnd, shapeRot, collObjQueryParams, collShape, collQueryParams)) { if (charMovement->ValidateCover(hitResult)) { MoveToCoverDestination(hitResult.Location); } } } }
AEyeXActorBase* AEyeXPlayerController::FindBySweep(FHitResult& OutHit, const FSceneView* const View, const FVector2D& GazePoint, const FCollisionObjectQueryParams& ObjectParams, const FCollisionQueryParams& TraceParams) { if (SweepIntervals <= 1) { UE_LOG(LogEyeX, Warning, TEXT("Invalid value for SweepIntervals: %i. Must be greater than 0."), SweepIntervals); return nullptr; } UWorld* World = GetWorld(); if (!World) return nullptr; FVector Start, Direction; View->DeprojectFVector2D(GazePoint, Start, Direction); const float TanFOVScaled = GetTanOfFOVAngleScaled(); // Perform sweeps const float DeltaDistance = MaxDistance / SweepIntervals; const FVector DeltaDirection = DeltaDistance * Direction; float CurrentDistance = DeltaDistance / 2; FCollisionShape Shape; AEyeXActorBase* EyeXActor = nullptr; for (int i = 0; i < SweepIntervals; ++i) { const FVector End = Start + DeltaDirection; const float Radius = (i == 0) ? 0.0f : TanFOVScaled * CurrentDistance; // Depends on the view frustrum, size of the screen and the distance. Shape.SetSphere(Radius); if (World->SweepSingleByObjectType(OutHit, Start, End, FQuat::Identity, ObjectParams, Shape, TraceParams)) { EyeXActor = Cast<AEyeXActorBase>(OutHit.GetActor()); break; } Start = End; CurrentDistance += DeltaDistance; } VisualizeHit(bVisualizeDetection, World, OutHit, Shape.GetSphereRadius()); VisualizeGazePoint(bVisualizeDetection, World, Start); return EyeXActor; }