#pragma once
include “CoreMinimal.h”
include “InputActionValue.h”
include “GameFramework/PlayerController.h”
include “DocPlayerController.generated.h”
class UInputMappingContext;
class UInputAction;
struct FInputActionValue;
class IEnemyInterface;
/**
*
*/
UCLASS()
class MYSTERYDARKEPIDEMIC_API ADocPlayerController : public APlayerController
{
GENERATED_BODY()
public:
ADocPlayerController();
virtual void PlayerTick(float DeltaTime) override;
protected:
virtual void BeginPlay() override;
virtual void SetupInputComponent() override;
private:
UPROPERTY(EditAnywhere, Category=“Input”)
TObjectPtr DocContext;
UPROPERTY(EditAnywhere,Category="Input")
TObjectPtr<UInputAction> MoveAction;
void Move(const struct FInputActionValue& InputActionValue);
void CursorTrace();
IEnemyInterface* LastActor;
IEnemyInterface* ThisActor;
};
include “Player/DocPlayerController.h”
include “EnhancedInputSubsystems.h”
include “EnhancedInputComponent.h”
include “Interaction/EnemyInterface.h”
ADocPlayerController::ADocPlayerController()
{
bReplicates = true;
}
void ADocPlayerController::PlayerTick(float DeltaTime)
{
Super::PlayerTick(DeltaTime);
CursorTrace();
}
void ADocPlayerController::CursorTrace()
{
FHitResult CursorHit;
GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);
if (!CursorHit.bBlockingHit) return;
LastActor = ThisActor;
ThisActor = Cast<IEnemyInterface>(CursorHit.GetActor());
if (LastActor == nullptr)
{
if (ThisActor != nullptr)
{
// Case B
ThisActor->HighlightActor();
}
else
{
// Case A - both are null, do nothing
}
}
else // LastActor is valid
{
if (ThisActor == nullptr)
{
// Case C
LastActor->UnHighlightActor();
}
else // both actors are valid
{
if (LastActor != ThisActor)
{
// Case D
LastActor->UnHighlightActor();
ThisActor->HighlightActor();
}
else
{
// Case E - do nothing
}
}
}
}
void ADocPlayerController::BeginPlay()
{
Super::BeginPlay();
check(DocContext);
UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer());
check(Subsystem);
Subsystem->AddMappingContext(DocContext, 0);
bShowMouseCursor = true;
DefaultMouseCursor = EMouseCursor::Default;
FInputModeGameAndUI InputModeData;
InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
InputModeData.SetHideCursorDuringCapture(false);
SetInputMode(InputModeData);
}
void ADocPlayerController::SetupInputComponent()
{
Super::SetupInputComponent();
UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(InputComponent);
EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &ADocPlayerController::Move);
}
void ADocPlayerController::Move(const FInputActionValue& InputActionValue)
{
const FVector2d InputAxisVector = InputActionValue.Get();
const FRotator Rotation = GetControlRotation();
const FRotator YawRotation(0.f, Rotation.Yaw, 0.f);
const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
if (APawn* ControlledPAwn = GetPawn<APawn>())
{
ControlledPAwn->AddMovementInput(ForwardDirection, InputAxisVector.Y);
ControlledPAwn->AddMovementInput(RightDirection, InputAxisVector.X);
}
}