Compare commits

..

3 Commits

Author SHA1 Message Date
bf043b91fd 사용자 지정 플레이어 컨트롤러 2025-05-09 00:08:39 +09:00
0ff8baf48f Pawn 죽음 다루기 2025-05-08 23:40:39 +09:00
c5f5288e96 Game Mode 클래스 2025-05-08 22:26:16 +09:00
17 changed files with 173 additions and 16 deletions

View File

@ -7,6 +7,7 @@ r.DefaultFeature.AutoExposure=False
[/Script/EngineSettings.GameMapsSettings]
EditorStartupMap=/Game/Maps/Main.Main
GameDefaultMap=/Game/Maps/Main.Main
GlobalDefaultGameMode=/Game/Blueprints/GameMode/BP_ToonTanksGameMode.BP_ToonTanksGameMode_C
[/Script/HardwareTargeting.HardwareTargetingSettings]
TargetedHardwareClass=Desktop
@ -71,3 +72,6 @@ ConnectionType=USBOnly
bUseManualIPAddress=False
ManualIPAddress=
[CoreRedirects]
+PropertyRedirects=(OldName="/Script/ToonTanks.Tank.PlayerControllerRef",NewName="/Script/ToonTanks.Tank.PlayerController")

Binary file not shown.

BIN
Content/Blueprints/GameMode/BP_ToonTanksGameMode.uasset (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
Content/Maps/Main.umap (Stored with Git LFS)

Binary file not shown.

View File

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

View File

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

View File

@ -3,6 +3,9 @@
#include "HealthComponent.h"
#include "ToonTanksGameMode.h"
#include "Kismet/GameplayStatics.h"
// Sets default values for this component's properties
UHealthComponent::UHealthComponent()
{
@ -20,6 +23,7 @@ void UHealthComponent::BeginPlay()
Super::BeginPlay();
Health = MaxHealth;
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)
{
if (Damage <= 0.0f)
if (Health <= 0.0f)
{
return;
}
Health -= Damage;
if (Health <= 0.0f && GameMode)
{
GameMode->ActorDied(DamagedActor);
}
UE_LOG(LogTemp, Warning, TEXT("Health: %f"), Health);
}

View File

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

View File

@ -3,6 +3,7 @@
#include "Tank.h"
#include "ToonTanksPlayerController.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "Kismet/GameplayStatics.h"
@ -29,30 +30,35 @@ void ATank::Tick(float DeltaTime)
Super::Tick(DeltaTime);
// Rotate Tank to Mouse Pointer Location
if (PlayerControllerRef)
if (PlayerController)
{
FHitResult HitResult;
PlayerControllerRef->GetHitResultUnderCursor(
PlayerController->GetHitResultUnderCursor(
ECollisionChannel::ECC_Visibility,
false,
HitResult
);
DrawDebugSphere(
GetWorld(),
HitResult.ImpactPoint,
25,
12,
FColor::Green
);
RotateTurret(HitResult.ImpactPoint);
}
}
void ATank::HandleDestruction()
{
Super::HandleDestruction();
SetActorHiddenInGame(true);
SetActorTickEnabled(false);
}
APlayerController* ATank::GetPlayerController() const
{
return this->PlayerController;
}
// Called when the game starts or when spawned
void ATank::BeginPlay()
{
Super::BeginPlay();
PlayerControllerRef = Cast<APlayerController>(GetController());
PlayerController = Cast<APlayerController>(GetController());
}
void ATank::Move(float Value)

View File

@ -22,6 +22,12 @@ public:
// Called every frame
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:
// Called when the game starts or when spawned
@ -46,7 +52,7 @@ private:
// PlayerController Pointer for Mouse Location Detection
UPROPERTY()
APlayerController* PlayerControllerRef;
APlayerController* PlayerController;
// Move operation through W/S key
void Move(float Value);

View File

@ -0,0 +1,31 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "ToonTanksGameMode.h"
#include "Tank.h"
#include "ToonTanksPlayerController.h"
#include "Tower.h"
#include "Kismet/GameplayStatics.h"
void AToonTanksGameMode::BeginPlay()
{
Super::BeginPlay();
Tank = Cast<ATank>(UGameplayStatics::GetPlayerPawn(this, 0));
PlayerController = Cast<AToonTanksPlayerController>(UGameplayStatics::GetPlayerController(this, 0));
}
void AToonTanksGameMode::ActorDied(AActor* DeadActor)
{
if (DeadActor == Tank)
{
Tank->HandleDestruction();
if (PlayerController)
{
PlayerController->SetPlayerEnabledState(false);
}
}
else if (ATower* DestroyedTower = Cast<ATower>(DeadActor))
{
DestroyedTower->HandleDestruction();
}
}

View File

@ -0,0 +1,33 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "ToonTanksGameMode.generated.h"
/**
*
*/
UCLASS()
class TOONTANKS_API AToonTanksGameMode : public AGameModeBase
{
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;
// ToonTanksPlayerController Pointer of player pawn.
UPROPERTY()
class AToonTanksPlayerController* PlayerController;
};

View File

@ -0,0 +1,17 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "ToonTanksPlayerController.h"
void AToonTanksPlayerController::SetPlayerEnabledState(bool bPlayerEnabled)
{
if (bPlayerEnabled)
{
GetPawn()->EnableInput(this);
}
else
{
GetPawn()->DisableInput(this);
}
bShowMouseCursor = bPlayerEnabled;
}

View File

@ -0,0 +1,21 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "ToonTanksPlayerController.generated.h"
/**
*
*/
UCLASS()
class TOONTANKS_API AToonTanksPlayerController : public APlayerController
{
GENERATED_BODY()
public:
// Set this controller to Enabled or Disabled.
void SetPlayerEnabledState(bool bPlayerEnabled);
};

View File

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

View File

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