언리얼 엔진에는 AGameMode라는 클래스가 존재한다. AGameMode의 부모는 AGameModeBase이고
AGameMode보다 조금 더 기본적이다. 언리얼 엔진에서 게임 모드는 게임의 규칙을 다루는데 좋은 기능이다.
월드의 어떤 액터가 죽을 때 게임 모드가 대처할 수 있도록 ActorDied 함수가 필요하다.
일단 BasePawn함수의 헤더에 void HandleDestruction(); 함수를 추가 해둔 뒤
cpp 파일에서는 가볍게 상속을 위해서 적어준다
void ABasePawn::HandleDestruction()
{
//TODO: Visual/Sound Effects
}
다음은 Tower.cpp에 관련 함수를 적어둔다. 함수 선언은 해더파일에 해뒀다!
void ATower::HandleDestruction()
{
Super::HandleDestruction();
Destroy();
}
또한 Tank.cpp에 관련 함수를 적어둔다. 함수 선언은 해더파일에 해뒀다!
void ATank::HandleDestruction()
{
Super::HandleDestruction();
SetActorHiddenInGame(true);
SetActorTickEnabled(false);
}
이제 툰 탱크 게임 모드를 위한 첫번째 단계로 폰의 죽음에 대해서 먼저 적어준다
// 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:
void ActorDied(AActor* DeadActor);
protected:
virtual void BeginPlay();
private:
class ATank* Tank;
};
cpp파일도 아래와 같이 탱크 헤더와 타워 헤더를 들고와 컨트롤러를 인자로 넣어주기 위해 캐스팅을 실시한다
// Fill out your copyright notice in the Description page of Project Settings.
#include "ToonTanksGameMode.h"
#include "Kismet/GameplayStatics.h"
#include "Tank.h"
#include "Tower.h"
void AToonTanksGameMode::ActorDied(AActor* DeadActor)
{
if (DeadActor == Tank)
{
Tank->HandleDestruction();
if (Tank->GetTankPlayerController()) {
Tank->DisableInput(Tank->GetTankPlayerController());
Tank->GetTankPlayerController()->bShowMouseCursor = false;
}
}
else if (ATower* DestroyedTower= Cast<ATower>(DeadActor))
{
DestroyedTower->HandleDestruction();
}
}
void AToonTanksGameMode::BeginPlay()
{
Super::BeginPlay();
Tank = Cast<ATank>(UGameplayStatics::GetPlayerPawn(this, 0));
}
ActorDied 함수를 만들었고 그 함수 안에서 HandleDestruction 함수를 만들어준다.
현재 월드에 게임모드가 존재하는지 알기 위해서 UGameplaystatics::GetGameMode를 호출한 뒤 괄호 안에 월드의 객체인 this를 넣어준다
ToonTanksGameMode = UGameplayStatics::GetGameMode(this);
여기서 오류가 나타나게 되는데 GetGameMode는 GameModeBase를 반환하니까 AToonTanksGameMode라는 자식 클래스에 저장하려고 하고 있다. 이때는 캐스팅이 필요하다
ToonTanksGameMode = Cast<AToonTanksGameMode>(UGameplayStatics::GetGameMode(this));
이렇게 적어주면 AToonTankGameMode로 캐스팅이 완료되었다
마지막으로
void UHealthComponent::DamageTaken(AActor* DamagedActor, float Damage, const UDamageType* DamageType, AController* Instigator, AActor* DamageCauser)
{
if (Damage <= 0.f) return;
Health -= Damage;
if (Health <= 0.0f && ToonTanksGameMode)
{
ToonTanksGameMode->ActorDied(DamagedActor);
}
}
게임모드가 존재하고, 피가 0이면 죽는 판정을 하는 것을 넣어주었다