본문 바로가기
언리얼엔진 개발/Developing

[UnrealEngine5]로컬라이징( Feat. 영어, 한국어 설정하기)

by yeni_0224 2023. 7. 19.
728x90
반응형

게임의 언어를 설정해주는 작업이라고 들었다.

VR게임 Return 출시를 완료한 후 일부 수정하면서 영어/한국어를 선택하여 플레이 할 수 있도록 추가해주었다. 게임 메인 화면의 Settings 버튼을 누르면 영어와 한국어를 선택할 수 있다.

 

언어를 설정하는 것은 Game Mode Base에서 해주었다. 일단은 영어와 한국어만 설정하도록 했지만 추후에 다른 언어도 추가할 것이라는 가능성을 배제하지 않을 수 없었기 때문에, 이후에도 언어를 쉽게 추가할 수 있도록 작업했다. GameModeBase에서 언어를 선택했다는 Delegate 신호를 보내는 것으로 작업을 시작한다.

void 클래스 이름::ChangeLanguage(ELanguageSettings language)
{
	switch (language)
	{
	case  ELanguageSettings::ENGLISH:
		//영어인 경우
		screenWidget->switcher->SetActiveWidgetIndex(인덱스 번호);
		break;
	case  ELanguageSettings::KOREAN:
		//한글인 경우
		screenWidget->switcher->SetActiveWidgetIndex(인덱스 번호);
        break;
	}
}

영어로 설정할 때 영어가 적힌 위젯이 뜨도록, 한국어로 설정할 때 영어가 적힌 위젯이 뜨도록했다. 위젯으로 작업하지 않은 경우에도 동일하게 작업했다. 하지만 이렇게 쉽게 끝난다면 개발이라고 할 수 없지..

 

언어를 설정했음에도 불구하고 일부 적용되지 않는 경우들이 있었다. 여러 이유들이 있겠지만 함수의 생성 순서가 맞지 않았을 수도 있다. 그럴 때는 Game Mode Base에 만들어둔 delegate 함수와 해당 클래스를 연결해줘야한다. 이런 문제가 있는 클래스에 GameModeBase를 캐스팅해준 후, 언어를 바꿔주는 함수와 바인딩해준다.

gm->changeLanguageDele.AddUFunction(this, FName("ChangeLanguage"));

정말 익숙했던 Widget Component의 언어 설정 작업은 어느정도 잘 작업되었지만, 익숙하지 않은 새로운 형태가 등장한다. BillboardComponent이다. Billboard 컴포넌트는 간단하게 이해한 바로는 어떤 방향에 있던 이미지가 그 방향으로 회전하여 보이도록(?)하는 컴포넌트이다. 소위 "난 너만 바라봐" 인 것이다.

 

Billboard Component API

https://docs.unrealengine.com/4.26/en-US/API/Runtime/Engine/Components/UMaterialBillboardComponent/

 

UMaterialBillboardComponent

A 2d material that will be rendered always facing the camera.

docs.unrealengine.com

 

https://docs.unrealengine.com/4.27/en-US/Basics/Components/Rendering/

 

Rendering Components

Several different types of Rendering based Components are outlined, including ParticleSystemComponents, DecalComponets, and BillboardComponents to name a few.

docs.unrealengine.com

 

Billboard Component 안에 이미지를 등록할 수 있는데 넣기 위한 함수가 SetSprite인 것 같다.

어떤 언어일 때 SetSprite 할 수도 있지만 이것보다 더 간단하게, 쉽게 한번 해보자.

바로 Billboard Component를 영어용 하나, 한국어용 하나 만든 것이다.

	billboardEngComp = CreateDefaultSubobject<UBillboardComponent>(TEXT("billboardEngComp"));
	billboardEngComp->SetupAttachment(boxComp);
	billboardEngComp->SetRelativeLocation(FVector(40, -50, -100));
	billboardEngComp->SetVisibility(false);
	billboardEngComp->SetHiddenInGame(false);
	ConstructorHelpers::FObjectFinder<UTexture2D>tempBillEngIMG(TEXT("이미지 경로"));
    if (tempBillEngIMG.Succeeded())
    {
		billboardEngComp->SetSprite(tempBillEngIMG.Object);
		billboardEngComp->ScreenSize = 0.0025f;
    }

이렇게 만들어주었다. 항상 보이는 것이 아니라 일정 범위 안에 들어오면 보이도록 해야하기 때문에 일단 보이지 않도록 설정해주었다. 크기를 조정해보려고 했는데 ScreenSize으로 설정해보았지만 작동하지 않았다. 다른 부분의 크기를 조정하는 것 같다. 이 이미지 자체의 크기는 screen size가 아닌 원래 우리가 보통 크기 설정하는 곳에서 조정해주면 된다.

생성자에서 이렇게 만들어주고난 후 billboard이미지가 발생하는 순간 언어를 변경시키는 함수를 호출한다

위에 적힌 언어 설정하는 함수와 동일한 형태이다.

ChangeLanguage(gm->currentLanguageSetting);

이렇게 함수를 호출하고, 언어를 설정한다.

void 해당 클래스::ChangeLanguage(ELanguageSettings language)
{
	switch (language)
	{
	case ELanguageSettings::ENGLISH:
		billboardEngComp->SetVisibility(true);
		break;
	case ELanguageSettings::KOREAN:
		billboardComp->SetVisibility(true);
		break;
	}
}

영어일 때는 영어 billboard만 보이게 하고, 한국어일때는 한국어 billboard를 보이게 할 것이다.

 

일정 범위 안에 들어오면 이미지가 보이게 하고, 일정 범위 밖으로 벗어나면 이미지가 보이지 않게 해야한다.

일정 범위에서 벗어나면 endoverlap했을 때 billboard 이미지도 보이지 않도록 처리해준다.

		// 빌보드 끄기
		billboardComp->SetVisibility(false);
		billboardEngComp->SetVisibility(false);

 

이상!

728x90
반응형