게임 개발 (언리얼 엔진)

UE4 생존게임 제작 - 8 (시작 화면 UI 제작)

언린이 2020. 11. 6. 14:54

1. Start 레벨 생성

 

 

Start 레벨을 생성해주고 프로젝트 세팅의 맵&모드에서 에디터 시작 맵과 게임 기본 맵을 Start 레벨로 설정하였습니다.

 

 

2. 위젯 블루프린트 제작

 

 

위젯 블루프린트를 만들고 캔버스 패널 안에 이미지와 버튼 2개를 넣었습니다.

그리고 이미지를 캔버스 패널 크기로 설정하여 전체 화면에 꽉 차도록 만들었습니다.

 

 

 

버튼은 Style 카테고리를 통해 버튼에 이미지를 입히고 사운드를 적용할 수 있습니다.

 

 

 

전체 캔버스 패널의 모습입니다.

 

 

3. C++ 위젯 클래스 제작

 

위젯 블루프린트의 부모 클래스로 줄 C++ 위젯 클래스를 생성하였습니다. C++ 위젯 클래스를 만드는 이유는 버튼을 눌렀을 때의 동작을 코드로 지정해주기 위함입니다.

 

 

protected:
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	class UButton* StartButton;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	class UButton* EndButton;

 

private:
	// 버튼을 눌렀을 때, 호출될 델리게이트에 등록할 함수
	UFUNCTION(BlueprintCallable)
	void StartButtonCallback();

	UFUNCTION(BlueprintCallable)
	void EndButtonCallback();

 

먼저 클래스가 버튼 두개를 가지고 있도록 선언해주었고, 각각의 버튼이 눌렸을 때, 호출될 델리게이트에 등록할 함수를 선언해주었습니다.

 

 

// 위젯 클래스의 생성자
void UStartLevelWidget::NativeConstruct()
{
	Super::NativeConstruct();

	// 위젯 블루프린트의 버튼을 이름을 통해 가져온다
	StartButton = Cast<UButton>(GetWidgetFromName(TEXT("StartButton")));
	EndButton = Cast<UButton>(GetWidgetFromName(TEXT("EndButton")));

	// 버튼 클릭시 호출될 델리게이트에 함수를 등록한다
	StartButton->OnClicked.AddDynamic(this, &UStartLevelWidget::StartButtonCallback);
	EndButton->OnClicked.AddDynamic(this, &UStartLevelWidget::EndButtonCallback);
}

 

NativeConstruct 함수는 위젯 클래스에서 생성자 역할을 하는 함수입니다. 이 함수를 사용해 선언해두었던 버튼 두개를 GetWidgetFromName 함수를 이용해 위젯 블루프린트의 버튼을 이름을 통해 불러왔습니다.

그리고 나서 버튼이 눌렸을 시에 호출될 델리게이트에 선언해두었던 함수를 등록하였습니다. 이제 버튼이 눌리면 자동으로 함수가 실행될 것입니다.

 

 

// Start 버튼 클릭시 실행될 함수
void UStartLevelWidget::StartButtonCallback()
{
	// 레벨을 바꿔주는 함수
	UGameplayStatics::OpenLevel(GetWorld(), TEXT("Africa"));
}

// End 버튼 클릭시 실행될 함수
void UStartLevelWidget::EndButtonCallback()
{
	// 게임 종료 함수
	UKismetSystemLibrary::QuitGame(GetWorld(), GetWorld()->GetFirstPlayerController() , EQuitPreference::Quit, true);
}

 

델리게이트에 등록한 두 함수의 정의 부분입니다.

StartButtonCallback 함수에서는 레벨을 바꿔주는 함수를 호출하여 다음 레벨로 이동할 수 있도록 하였습니다. 이 함수를 사용하면 다음으로 실행되어야 할 레벨의 이름을 통해 불러줄 수 있습니다.

EndButtonCallback 함수에서는 게임을 강제 종료시키는 함수를 호출하여 게임을 종료시켜주었습니다.

 

 

4. Start 레벨에 적용할 게임 모드 제작

 

 

Game Mode Base를 상속받는 C++ 클래스를 제작하고 Start 레벨의 월드 세팅에서 해당 클래스를 적용하였습니다.

 

 

private:
	TSubclassOf<UUserWidget> StartLevelWidgetClass;
	class UStartLevelWidget* StartLevelWidget;

 

만들어 놓은 위젯을 실행시킬 수 있도록 StartGameMode 클래스가 StartLevelWidget 클래스를 변수로 가지도록 선언해주었습니다.

 

 

AStartGameMode::AStartGameMode()
{
	static ConstructorHelpers::FClassFinder<UStartLevelWidget> StartWidgetClass(TEXT("WidgetBlueprint'/Game/UI/UI_StartLevel.UI_StartLevel_C'"));

	if (StartWidgetClass.Succeeded())
		StartLevelWidgetClass = StartWidgetClass.Class;
}

 

생성자에서 만들어 놓은 위젯 블루프린트 클래스를 불러왔습니다.

 

 

// 프로그램이 시작하면 호출되는 함수
void AStartGameMode::BeginPlay()
{
	Super::BeginPlay();

	if (IsValid(StartLevelWidgetClass))
	{
		// 위젯을 생성한다
		StartLevelWidget = Cast<UStartLevelWidget>(CreateWidget(GetWorld(), StartLevelWidgetClass));

		if (IsValid(StartLevelWidget))
		{
			// 위젯을 뷰포트에 추가한다
			StartLevelWidget->AddToViewport();
		}
	}
}

 

BeginPlay 함수에서 CreateWidget 함수를 이용해 위젯을 생성해주었습니다.

그리고 나서 생성한 위젯을 뷰포트에 추가하였습니다.

 

 

 

이제 게임을 실행하면 Start 레벨 위젯이 나오는 모습을 확인할 수 있습니다.

 

 

 

그리고 Start 버튼을 누르면 다음 레벨로 이동하는 모습 또한 확인할 수 있습니다.

 

 

다음에 해야할 일

 

플레이어 원거리 공격 제작