[UE5]툰 탱크-20

칼든개구리·2024년 12월 12일
0

[언리얼TO리얼]

목록 보기
28/42

The Game Mode

언리얼 엔진에는 AGameMode라는 클래스가 존재한다. AGameMode의 부모는 AGameModeBase이고
AGameMode보다 조금 더 기본적이다. 언리얼 엔진에서 게임 모드는 게임의 규칙을 다루는데 좋은 기능이다.

Actor Death

월드의 어떤 액터가 죽을 때 게임 모드가 대처할 수 있도록 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이면 죽는 판정을 하는 것을 넣어주었다

profile
메타쏭이

0개의 댓글