I followed the code exactly and I am still getting this result:
.CPP
#include "Battle_Tank.h"
#include "Runtime/Engine/Classes/Engine/World.h"
#include "TankPlayerController.h"
void ATankPlayerController::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
AimTowardsCrosshair();
}
void ATankPlayerController::BeginPlay()
{
Super::BeginPlay();
auto ControlledTank = GetControlledTank();
if (!ControlledTank)
{
UE_LOG(LogTemp, Warning, TEXT("Player Controller not possessing Tank"));
}
else
{
UE_LOG(LogTemp, Warning, TEXT("Player Controller possessing: %s"), *(ControlledTank->GetName()));
}
}
ATank* ATankPlayerController::GetControlledTank() const
{
return Cast<ATank>(GetPawn());
}
void ATankPlayerController::AimTowardsCrosshair()
{
if (!GetControlledTank()) { return; }
FVector OutHitLocation;
if(GetSightRayHitLocation(OutHitLocation))
{
//Get World location of linetrace through Crosshair
//If it hits the landscape
//Tell Controlled tank to aim at this point
FVector HitLocation;//Out Parameter
}
}
bool ATankPlayerController::GetSightRayHitLocation(FVector& HitLocation) const
{
//Set the Crosshair position
int32 ViewportSizeX, ViewportSizeY;
GetViewportSize(ViewportSizeX, ViewportSizeY);
auto ScreenLocation = FVector2D(ViewportSizeX * CrosshairXLocation, ViewportSizeY * CrosshairYLocation );
//UE_LOG(LogTemp, Warning, TEXT("Screen Location: %s"), *ScreenLocation.ToString());
FVector LookDirection;
if (GetLookDirection(ScreenLocation, LookDirection))
{
//Line Trace along look direction and see what it hits up to a max range
//UE_LOG(LogTemp, Warning, TEXT("Look Direction: %s"), *LookDirection.ToString());
GetLookVectorHitLocation(LookDirection, HitLocation);
}
return true;
}
bool ATankPlayerController::GetLookVectorHitLocation(FVector LookDirection, FVector& HitLocation) const
{
FHitResult HitResult;
auto StartLocation = PlayerCameraManager->GetCameraLocation();
auto EndLocation = StartLocation + (LookDirection * LineTraceRange);
static FName TraceTag = TEXT("TraceTag");
FCollisionQueryParams Params(TraceTag);
GetWorld()->DebugDrawTraceTag = TraceTag;
if (GetWorld()->LineTraceSingleByChannel(
HitResult,
StartLocation,
EndLocation,
ECollisionChannel::ECC_Visibility)
)
{
HitLocation = HitResult.Location;
UE_LOG(LogTemp, Warning, TEXT("Hit Location: %s"), *HitLocation.ToString());
return true;
}
HitLocation = FVector(0);
return false; // Line trace didn't succeed
}
bool ATankPlayerController::GetLookDirection(FVector2D ScreenLocation, FVector& LookDirection) const
{
//de-project the screen position of the crosshair to a world direction
FVector CameraWorldLocation;
return DeprojectScreenPositionToWorld(
ScreenLocation.X,
ScreenLocation.Y,
CameraWorldLocation,
LookDirection
);
}```
.H
#pragma once
#include "CoreMinimal.h"
#include "Camera/PlayerCameraManager.h"
#include "GameFramework\PlayerController.h"
#include "Tank.h"
#include "TankPlayerController.generated.h"
/**
*
*/
UCLASS()
class BATTLE_TANK_API ATankPlayerController : public APlayerController
{
GENERATED_BODY()
public:
ATank* GetControlledTank() const;
void BeginPlay();
virtual void Tick(float DeltaTime) override;
private:
void AimTowardsCrosshair();
bool GetSightRayHitLocation(FVector& HitLocation) const;
bool GetLookDirection(FVector2D ScreenLocation, FVector& LookDirection)const;
bool GetLookVectorHitLocation(FVector LookDirection, FVector& HitLocation) const;
UPROPERTY(EditAnywhere)
float CrosshairXLocation = 0.5;
UPROPERTY(EditAnywhere)
float CrosshairYLocation = 0.3333;
UPROPERTY(EditAnywhere)
float LineTraceRange = 1000000;
};
Can anyone see where I may be going wrong? Using UE 4.24