1. 패배 이후 재시작 구현

(1) 5초 이후 재시작 - ShooterPlayerController

class SIMPLESHOOTER_API AShooterPlayerController : public APlayerController
{
	GENERATED_BODY()

public:
	virtual void GameHasEnded(AActor* EndGameFocus = nullptr, bool bIsWinner = false) override;

private:
	UPROPERTY(EditAnywhere)
	float RestartDelay = 5.f;

	FTimerHandle RestartTimer;
};
#include "ShooterPlayerController.h"
#include "TimerManager.h"

void AShooterPlayerController::GameHasEnded(AActor* EndGameFocus, bool bIsWinner)
{
    Super::GameHasEnded(EndGameFocus, bIsWinner);

    // 재시작
    GetWorldTimerManager().SetTimer(RestartTimer, this, &APlayerController::RestartLevel, RestartDelay);
}

Timer와 GameHasEnded 함수를 상속받아 게임 재시작을 구현한다.

5초 타이머를 위해 타이머 핸들을 만들고, 재시작 시간을 설정하기 위해 RestartDelay를 만든다.

 

 

(2) UI 위젯 표시

강의를 따라서 LoseScreen 위젯을 만들었다면 이제 플레이어 컨트롤러에서 해당 위젯을 불러오도록 처리할 것이다.

private:
	UPROPERTY(EditAnywhere)
	TSubclassOf<class UUserWidget> LoseScreenClass;

 

아래 헤더를 추가한다.

#include "Blueprint/UserWidget.h"
void AShooterPlayerController::GameHasEnded(AActor* EndGameFocus, bool bIsWinner)
{
    Super::GameHasEnded(EndGameFocus, bIsWinner);

    // UI 노출
    UUserWidget* LoseScreen = CreateWidget(this, LoseScreenClass);
    if (LoseScreen)
    {
        LoseScreen->AddToViewport();
    }

    // 재시작
    GetWorldTimerManager().SetTimer(RestartTimer, this, &APlayerController::RestartLevel, RestartDelay);

}

TSubclassOf 로 유저 위젯을 설정하여 LoseScreenClass를 블루프린트 에디터에서 선택할 때 쉽게 선택할 수 있도록 제한한다.

 

CreateWidget 함수의 첫번째 인자는 소유자, 두번째 인자는 노출할 위젯의 클래스를 넣는다.

NULL 체크 이후에 AddToViewport 함수를 사용하여 UI를 노출시킬 수 있다.

 

 

(3) 모듈 추가하기 - SimpleShooter.build.cs

위젯을 사용하기 위해 아래 코드를 수정한다.

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "GameplayTasks", "UMG" });

 

이후에 플레이어 컨트롤러로 이동해 LoseScreenClass를 설정한다.