본문 바로가기

게임프로그래밍/실습1

[언리얼 실습] 75. HUD 세팅


목차

  1. 게임모드 블루프린트 클래스 만들기
  2. HUD 블루프린트 클래스 만들기
  3. C++ 부모 클래스 만들기

1. HUD 만들기

 

현재 위젯을 만들기는 했는데 이것을 화면에 보여줄 방법이 없다. HUD 클래스를 만들어서 이를 구현해 볼 것이다.

HUD 클래스를 만들고 적용하려면 게임모드가 있어야 한다.

 

 

 

게임모드베이스를 부모 클래스로 하고 블루프린트 클래스를 만들자.

 

 

월드 세팅에서 게임모드 오버라이드를 블루프린트 클래스로 바꿔주면 된다.


2. HUD 블루프린트 클래스 만들기

 

HUD 블루프린트 클래스를 만들자.

 

 

c++ 에서 구현하기 전에 먼저 블루프린트 클래스에서 해보려고  한다.

 

 

위와 같이 노드들을 연결해준다.

 

이제 이 블루프린트 클래스를 게임모드의 기본 HUD 클래스로 바꾸자.

 

 

게임을 시작하면 오버레이가 정상적으로 나오는 것을 볼 수 있다.


3. C++ 부모 클래스 만들기

 

이제 위에서 만든 블루프린트 클래스의 부모 클래스가 될 C++ 클래스를 만들어보자.

 

 

현재 블루프린트 클래스에서 Add to ViewPort를 하고 있는데 이 작업을 C++에서 해보도록 하자.

 

 

블루프린트에서 Create Widget을 하고 있고 그곳에 클래스를 입력했다. C++에서 변수로 추가해야한다.

 

UCLASS()
class PRACTICE_API ASlashHUD : public AHUD
{
	GENERATED_BODY()

private:
	UPROPERTY(EditDefaultsOnly, Category = "Slash")
	TSubclassOf<class USlashOverlay> SlashOverlay;
	
};

 

TSubclassOf 로 특정 클래스 타입을 지정해준다.

 

일단 컴파일 하고 확인을 하자.

 

에디터에 들어갔으면 블루프린트 HUD 클래스에 들어간다.

 

 

클래스 세팅에서 부모 클래스를 바꿔준다.

 

 

이제 BP_SlashHUD(self)를 누르고 디테일 패널을 보면 변수를 설정할 수 있는 것을 볼 수 있다.

 

이제 다시 비주얼 스튜디오로 돌아가 나머지 작업을 해보자.

 

프로텍티드 영역에서 BeginPlay 함수를 오버라이드 해준다.

 

블루프린트에서 위젯을 생성했던 것 처럼 C++에서도 함수로 만들 수 있다.

 

void ASlashHUD::BeginPlay()
{
	Super::BeginPlay();

	CreateWidget<USlashOverlay>()
}

 

이제 매개변수를 살펴보자.

OwnerType OwningObject 첫번째 매개변수는 이와 같은데 이는 플레이어 컨트롤러 라고 한다.

 

플레이어 컨트롤러를 얻을 방법을 알아보자.

 

APlayerController* Controller = World->GetFirstPlayerController();

 

다음과 같이 컨트롤러를 얻을 수 있다. 싱글 플레이 게임에서는 첫번째 플레이어 컨트롤러가 곧 플레이어의 컨트롤러이다.

 

void ASlashHUD::BeginPlay()
{
	Super::BeginPlay();

	UWorld* World = GetWorld();
	if (World)
	{
		APlayerController* Controller = World->GetFirstPlayerController();
		if (Controller && SlashOverlayClass)
		{
			USlashOverlay* SlashOverlay = CreateWidget<USlashOverlay>(Controller, SlashOverlayClass);
			SlashOverlay->AddToViewport();
		}
	}
}

나머지 변수들도 이렇게 채워주면 된다.

 

이제 컴파일하고 확인하면 블루프린트에서 사용했던 그대로 구현되는 것을 볼 수 있다.

 

마지막으로 SlashOveray를 현재 지역변수에 할당하였는데 해당 클래스에는 다양한 기능등이 있고 이것을 사용할 것이기 때문에 멤버변수로 저장하도록 하자.

 

USlashOverlay* SlashOverlay;

 

프라이빗 영역에 변수를 추가하고,

SlashOverlay = CreateWidget<USlashOverlay>(Controller, SlashOverlayClass);
SlashOverlay->AddToViewport();

 

구문만 살짝 바꾸면 된다.