KoreanFoodie's Study

언리얼 스트링 테이블에서 텍스트 조회 / 텍스트 값으로 테이블 조회하기 본문

Game Dev/Unreal C++ : Dev Log

언리얼 스트링 테이블에서 텍스트 조회 / 텍스트 값으로 테이블 조회하기

GoldGiver 2023. 1. 5. 18:19

텍스트 조회

보통 프로젝트 규모가 커지게 되면, 각종 스트링들을 스트링 테이블에 넣어서 사용할 것이다.

이때 스트링 테이블은 Namespace 와 키 값 두 개가 있고, 원하는 Namespace 에서 키를 대입해 원하는 텍스트를 찾게 된다.

Namespace 는 간단히 말해 스트링 테이블 파일의 이름이라고 보면 된다.

실제로 C++ 코드로 짜면, 다음과 같다 :

FText findText;
FText::FindText(TEXT("your_namespace"), TEXT("your_key"), findText);

your_namespace 와 your_key 에 적합한 값을 주면, 원하는 값이 findText 에 들어갈 것이다.

아참, 스트링 테이블을 만든 다음, 상단의 '네임스페이스' 를 제대로 설정해 주어야 한다! 

이걸 설정안하면 코드에서 찾을 수가 없다

 

아, 참고로 '이름 : {0}, 나이 : {1}' 이런 식으로 소스 스트링을 설정할 수 있는데, 다음과 같은 방식으로 FText::Format 을 활용하면 포맷된 텍스트를 만들 수 있다 :

// "이름 : {0}, 나이 {1}" 를 찾을 것임
FText findText;
FText::FindText(TEXT(), TEXT(), findText);

FText name = FText::FromString("Tony");
FText age = FText::FromString(FString::FromInt(20));

FText formattedString = FText::Format(findText, name, age);

 

 

텍스트 데이터를 이용해 테이블과 키값 조회

반대로, 텍스트 데이터를 이용해 테이블과 키값을 알고 싶을 때는 어떻게 할까?

먼저, 로컬라이제이션을 사용한다면, Contents\Localization\ko\Game.archive 등의 파일에서 원하는 키값을 검색하면 된다!

위 방식이 제일 빠르고 권장된다.

 

하지만 만약 부득이하게 런타임에서 이걸 검색해야 한다면.. UKismetTextLibrary 에서 제공하는 다음 함수를 사용하자.

// KismetTextLibrary 임포트
#include "Kismet/KismetTextLibrary.h"

// 디버깅용 (반드시 삭제) -> UI 텍스트가 어떤 테이블에 속해있는지 파악
const FText targetText = FText::FromString("찾으려는 텍스트");
FName outTableId;
FString outKey;
UKismetTextLibrary::StringTableIdAndKeyFromText(targetText, outTableId, outKey);
GSLOG(Warning, TEXT("타겟 메시지 '%s' 는 '%s' 테이블의 '%s' 키를 갖고 있음"),
    *targetText.ToString(), *outTableId.ToString(), *outKey);

이 함수는 블루프린트에서도 사용할 수 있다!

 

참고 : 언리얼 공식 문서(C++, 블루프린트)
Comments