Pawn 죽음 다루기

This commit is contained in:
강민제 2025-05-08 23:40:39 +09:00
parent c5f5288e96
commit 0ff8baf48f
11 changed files with 96 additions and 5 deletions

View File

@ -72,3 +72,6 @@ ConnectionType=USBOnly
bUseManualIPAddress=False bUseManualIPAddress=False
ManualIPAddress= ManualIPAddress=
[CoreRedirects]
+PropertyRedirects=(OldName="/Script/ToonTanks.Tank.PlayerControllerRef",NewName="/Script/ToonTanks.Tank.PlayerController")

View File

@ -26,6 +26,12 @@ ABasePawn::ABasePawn()
ProjectileSpawnPoint->SetupAttachment(TurretMesh); ProjectileSpawnPoint->SetupAttachment(TurretMesh);
} }
void ABasePawn::HandleDestruction()
{
// TODO: Visual & Sound Effect Implementation
}
void ABasePawn::RotateTurret(FVector LookAtTarget) void ABasePawn::RotateTurret(FVector LookAtTarget)
{ {
FVector ToTarget = LookAtTarget - TurretMesh->GetComponentLocation(); FVector ToTarget = LookAtTarget - TurretMesh->GetComponentLocation();

View File

@ -15,6 +15,9 @@ public:
// Sets default values for this pawn's properties // Sets default values for this pawn's properties
ABasePawn(); ABasePawn();
// Handles Base Pawn destruction by Damage
virtual void HandleDestruction();
protected: protected:
// Rotate Turret to Target Location // Rotate Turret to Target Location
void RotateTurret(FVector LookAtTarget); void RotateTurret(FVector LookAtTarget);

View File

@ -3,6 +3,9 @@
#include "HealthComponent.h" #include "HealthComponent.h"
#include "ToonTanksGameMode.h"
#include "Kismet/GameplayStatics.h"
// Sets default values for this component's properties // Sets default values for this component's properties
UHealthComponent::UHealthComponent() UHealthComponent::UHealthComponent()
{ {
@ -20,6 +23,7 @@ void UHealthComponent::BeginPlay()
Super::BeginPlay(); Super::BeginPlay();
Health = MaxHealth; Health = MaxHealth;
GetOwner()->OnTakeAnyDamage.AddDynamic(this, &UHealthComponent::DamageTaken); GetOwner()->OnTakeAnyDamage.AddDynamic(this, &UHealthComponent::DamageTaken);
GameMode = Cast<AToonTanksGameMode>(UGameplayStatics::GetGameMode(this));
} }
@ -33,8 +37,14 @@ void UHealthComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActo
void UHealthComponent::DamageTaken(AActor* DamagedActor, float Damage, const UDamageType* DamageType, AController* Instigator, AActor* DamageCauser) void UHealthComponent::DamageTaken(AActor* DamagedActor, float Damage, const UDamageType* DamageType, AController* Instigator, AActor* DamageCauser)
{ {
if (Damage <= 0.0f) if (Health <= 0.0f)
{
return; return;
}
Health -= Damage; Health -= Damage;
if (Health <= 0.0f && GameMode)
{
GameMode->ActorDied(DamagedActor);
}
UE_LOG(LogTemp, Warning, TEXT("Health: %f"), Health); UE_LOG(LogTemp, Warning, TEXT("Health: %f"), Health);
} }

View File

@ -32,6 +32,10 @@ private:
UFUNCTION() UFUNCTION()
void DamageTaken(AActor* DamagedActor, float Damage, const UDamageType* DamageType, AController* Instigator, AActor* DamageCauser); void DamageTaken(AActor* DamagedActor, float Damage, const UDamageType* DamageType, AController* Instigator, AActor* DamageCauser);
// AToonTanksGameMode Pointer for Handling Dead Actor
UPROPERTY()
class AToonTanksGameMode* GameMode;
public: public:
// Called every frame // Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;

View File

@ -29,10 +29,10 @@ void ATank::Tick(float DeltaTime)
Super::Tick(DeltaTime); Super::Tick(DeltaTime);
// Rotate Tank to Mouse Pointer Location // Rotate Tank to Mouse Pointer Location
if (PlayerControllerRef) if (PlayerController)
{ {
FHitResult HitResult; FHitResult HitResult;
PlayerControllerRef->GetHitResultUnderCursor( PlayerController->GetHitResultUnderCursor(
ECollisionChannel::ECC_Visibility, ECollisionChannel::ECC_Visibility,
false, false,
HitResult HitResult
@ -48,11 +48,23 @@ void ATank::Tick(float DeltaTime)
} }
} }
void ATank::HandleDestruction()
{
Super::HandleDestruction();
SetActorHiddenInGame(true);
SetActorTickEnabled(false);
}
APlayerController* ATank::GetPlayerController() const
{
return this->PlayerController;
}
// Called when the game starts or when spawned // Called when the game starts or when spawned
void ATank::BeginPlay() void ATank::BeginPlay()
{ {
Super::BeginPlay(); Super::BeginPlay();
PlayerControllerRef = Cast<APlayerController>(GetController()); PlayerController = Cast<APlayerController>(GetController());
} }
void ATank::Move(float Value) void ATank::Move(float Value)

View File

@ -23,6 +23,12 @@ public:
// Called every frame // Called every frame
virtual void Tick(float DeltaTime) override; virtual void Tick(float DeltaTime) override;
// Handle's Tank Destruction by Damage
virtual void HandleDestruction() override;
// Get Current Player Controller Pointer
APlayerController* GetPlayerController() const;
protected: protected:
// Called when the game starts or when spawned // Called when the game starts or when spawned
virtual void BeginPlay() override; virtual void BeginPlay() override;
@ -46,7 +52,7 @@ private:
// PlayerController Pointer for Mouse Location Detection // PlayerController Pointer for Mouse Location Detection
UPROPERTY() UPROPERTY()
APlayerController* PlayerControllerRef; APlayerController* PlayerController;
// Move operation through W/S key // Move operation through W/S key
void Move(float Value); void Move(float Value);

View File

@ -2,4 +2,29 @@
#include "ToonTanksGameMode.h" #include "ToonTanksGameMode.h"
#include "Tank.h"
#include "Tower.h"
#include "Kismet/GameplayStatics.h"
void AToonTanksGameMode::BeginPlay()
{
Super::BeginPlay();
Tank = Cast<ATank>(UGameplayStatics::GetPlayerPawn(this, 0));
}
void AToonTanksGameMode::ActorDied(AActor* DeadActor)
{
if (DeadActor == Tank)
{
Tank->HandleDestruction();
if (Tank->GetPlayerController())
{
Tank->DisableInput(Tank->GetPlayerController());
Tank->GetPlayerController()->bShowMouseCursor = false;
}
}
else if (ATower* DestroyedTower = Cast<ATower>(DeadActor))
{
DestroyedTower->HandleDestruction();
}
}

View File

@ -14,4 +14,16 @@ class TOONTANKS_API AToonTanksGameMode : public AGameModeBase
{ {
GENERATED_BODY() GENERATED_BODY()
public:
// Handles input or something after Actor died.
void ActorDied(AActor* DeadActor);
protected:
virtual void BeginPlay() override;
private:
// Tank Pointer for DeadActor which is ATank.
UPROPERTY()
class ATank* Tank;
}; };

View File

@ -14,6 +14,12 @@ void ATower::Tick(float DeltaTime)
} }
} }
void ATower::HandleDestruction()
{
Super::HandleDestruction();
Destroy();
}
void ATower::BeginPlay() void ATower::BeginPlay()
{ {
Super::BeginPlay(); Super::BeginPlay();

View File

@ -17,11 +17,15 @@ class TOONTANKS_API ATower : public ABasePawn
public: public:
virtual void Tick(float DeltaTime) override; virtual void Tick(float DeltaTime) override;
// Handles Tower Destruction by Damage
virtual void HandleDestruction() override;
protected: protected:
virtual void BeginPlay() override; virtual void BeginPlay() override;
private: private:
// Tank Object Pointer which is target // Tank Object Pointer which is target
UPROPERTY()
class ATank* Tank; class ATank* Tank;
// Distance to Start Tracking the target // Distance to Start Tracking the target