언리얼엔진/네트워크

UMG 셋팅하고 적용하기

엘피오 2019. 4. 11. 20:19

프로젝트 파일로 가서 source -> 프로젝트이름 폴더 -> 프로젝트이름 .build.cs 라는 c#문서를 열어서 UMG를

추가해준다.

 

에디터에서 마우스오른클 ->유저 인터페이스 -> 위젯 블루프린트를 만들고 대충 저런 모양 나오게 

셋팅한다 (c++보는사람은 블루프린트 이미 알고있을거라 생각하니 사용법은 생략)

 

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "PuzzlePlatformsGameInstance.generated.h"

/**
 * 
 */
UCLASS()
class TEST_API UPuzzlePlatformsGameInstance : public UGameInstance
{
	GENERATED_BODY()
		//c++ 생성자 단에서 초기화 
		UPuzzlePlatformsGameInstance(const FObjectInitializer& ObjectInitializer);
	
public:

	//언리얼 게임인스턴스 단에서 초기화 
	virtual  void Init();

	UFUNCTION(Exec)
		void Host(); //호스트

	UFUNCTION(Exec) //조인 + 접속아이피
		void Join(const FString& Address);

	UFUNCTION(BlueprintCallable)//메뉴불러오는 함수
		void LoadMenu();

private:
	//위젯가져오기
	TSubclassOf<class UUserWidget> MenuClass;
	//메인메뉴 클래스 포인터
	class UMainMenu* Menu;
	
};

위젯을 다룰 인스턴스 소스의헤더파일에 블루프린트에서 사용할수있도록 위와같이 함수선언 +

위젯클래스를 가져올수 있도록 해준다.

 

void UPuzzlePlatformsGameInstance::LoadMenu()
{
	if (!ensure(MenuClass != nullptr)) return;

	UUserWidget* Menu = CreateWidget<UUserWidget>(this, MenuClass);
	if (!ensure(Menu != nullptr)) return;

	Menu->AddToViewport(); //뷰포트에 나타내기
}

그리고 cpp파일에서 이렇게 코딩해준후 

 

레벨블루프린트에서 다음과 같이 스크립트를 짜준다.

 

게임화면이 이같이 뷰포트에 덮어씌워진다.

 

 

위와같이 나오는데. 캐릭터 asdw로 움직이고 회전 그대로되면서 

 

버튼을 누르고싶은데 마우스커서가 안나옴.

 

그러니까 포커스가 위젯에 맞춰져야한다.

 

블루프린트로는 이런거.

 

 

그러니까 다음과같이 코딩.

 

void UPuzzlePlatformsGameInstance::LoadMenu()
{
	if (!ensure(MenuClass != nullptr)) return;

	UUserWidget* Menu = CreateWidget<UUserWidget>(this, MenuClass);
	if (!ensure(Menu != nullptr)) return;

	Menu->AddToViewport(); //뷰포트에 나타내기

	//현제 이용중인 플레이어 컨트롤러를 얻어옴.
	APlayerController* PlayerController = GetFirstLocalPlayerController();
	if (!ensure(PlayerController != nullptr)) return;

	//사용자 입력을 처리해줄 라이브러리
	FInputModeUIOnly InputModeData;
	//사용랗 위젯을 지정
	InputModeData.SetWidgetToFocus(Menu->TakeWidget());
	//마우스를 뷰포트에 고정할건지 자유롭게 놔둘건지 지정
	InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);

	//위에서 구현한사항을 플레이어 컨트롤러에서 지정
	PlayerController->SetInputMode(InputModeData);
	//마우스커서 보이게하기
	PlayerController->bShowMouseCursor = true;
}

이렇게하고 컴파일하면 키보드입력이 안먹고 마우스커서가 나타나서 버튼을 누를 수 있게된다.

 

그러나 아직 버튼을 눌러도 아무 동작을 하지 않는다 

 

당연히 바인딩을 안해줬으니까.

 

 

준비물.

 

 

usetWidget을 부모로한 c++클래스를 

다음과같은 이름으로 생성해준다.

 

 

 

 

 

 

 

 

 

 

저번에 만든 umg에서 

1.그래프탭 선택.

2.클래스세팅

3.부모클래스를 아까 만든 c++클래스로 설정해준다.

헤더파일에 바인딩할 버튼들을 스샷처럼 코딩하는 방식.

 

주의. 이름똑같이 해줄것

 

mainmenu의 헤더파일

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"

#include "MainMenu.generated.h"


/**
 * 
 */
UCLASS()
class TEST_API UMainMenu : public UUserWidget
{
	GENERATED_BODY()

public:
	
protected:
	//초기화 + 유무를 검출하기위해 bool반환
	virtual bool Initialize();

	



private:

	//UMG의 버튼과 코드를 바인딩하기위한 버튼선언.

	UPROPERTY(meta = (BindWidget))
		class UButton* Host;

	UPROPERTY(meta = (BindWidget))
		class UButton* Join;

	UFUNCTION() // 호스트가 되는 함수
		void HostServer();

	
};

 

mainmenu의 소스파일.

bool UMainMenu::Initialize()
{
	bool Success = Super::Initialize();
	if (!Success) return false;

	if (!ensure(Host != nullptr)) return false;

	UE_LOG(LogTemp, Warning, TEXT("succecess!!!"));
	//호스트 버튼이 눌렸을때 HostSever 함수가 호출되도록 바인딩.
	Host->OnClicked.AddDynamic(this, &UMainMenu::HostServer);

	return true;
}

void UMainMenu::HostServer()
{
	UE_LOG(LogTemp, Warning, TEXT("I'm gonna host a server!"));

	
}

 

이제 호스트 버튼을 누를때마다 로그가 뜨는것을 확인 할 수있다.