언리얼/언리얼 C++

언리얼 C++ - 언리얼의 문자열

monstro 2024. 6. 24. 01:51
728x90
반응형

현대의 컴퓨터에서 문자열을 처리하는 방식은 

MBCS(Multi Byte Character Set)과 WBCS(Wide Byte Character Set)로 나뉘어 있는 유니코드 방식입니다

 

그 중에서도 언리얼 엔진에서는 후자인 UTF-16을 사용합니다.

 

이때 언리얼 엔진에서는 편의성과 일관성을 유지하기 위해 문자열에 대해 다음과 같은 특징을 갖고 있습니다.

 

1) 언리얼 엔진에서의 문자열의 특징

  • 2byte의 균일한 사이즈로 문자를 처리하는 UTF-16을 사용
  • 문자열은 반드시 TEXT 매크로를 사용해 지정
  • 문자열을 다루기 위한 클래스로 FString을 제공

언리얼 엔진에서의 문자열의 특징은 간단하게 위와 같이 정리가 가능합니다.

 

위와 같은 상황에서 문자열보다 더 깊게 파고들어 단일문자로 들어가게 될 경우,

언리얼 엔진은 유니코드를 위한 자체적인 표준 캐릭터(단일문자) 타입을 제공하는데, 그것이 바로 TCHAR입니다.

 

이때 위의 특징을 TCHAR로 다시 정리하자면 다음과 같습니다.

  • TEXT 매크로 : 문자열을 TCHAR 형태의 배열로 저장
  • FString : TCHAR 배열을 포함하는 헬퍼 클래스

TEXT매크로-TCHAR 배열-FString의 관계

 

2) 언리얼이 제공하는 다양한 문자열의 처리

(1) FName : 에셋 관리를 위한 문자열 체계

FName의 특징은 다음과 같습니다.

  • 대소문자의 구분이 없음 (예시) HELLO == hello
  • 한번 선언되면 바꿀 수 없음
  • 문자를 표현하는 용도가 아닌, 에셋의 키를 지정하는 용도로 사용됨
  • 위와 같은 용도로 인해 빌드 시에는 해시 값으로 전환되고 따라서 가볍고 빠름

(2) FText : 다국어를 지원하는 문자열 관리 체계

FText의 특징은 다음과 같습니다.

  • 해시값을 추출해 키를 생성하고 이 키로 작용함
  • 별도의 문자열 테이블 정보가 추가로 요구
  • 게임이 빌드되면 자동으로 다양한 국가별 언어로 변환
  • 언리얼이 제공하는 Global Pool 자료구조에서 생성된 키로 원하는 자료(=언어)를 검색해 반환(=변환)
  • FName과 마찬가지로 대소문자의 구분이 없음

 

3) 간단한 코드로 보는 언리얼 엔진의 문자열 처리

 

컨텐츠를 담은 어플리케이션의 뼈대인 GameInstance로부터 상속된 MyGameInstance를 통해

언리얼의 문자열 처리 방법을 간략한 코드로 사용해보았습니다.

 

UMyGameInstance::UMyGameInstance()
{
	// TCHAR 배열로 문자열 만들기
	TCHAR TcharText[] = TEXT("TCHAR로 만든 문자열");

	// FString으로 문자열 만들기
	FString StringText = TEXT("FString으로 만든 문자열");

	// 문자열에 인자가 포함되었는지를 bool 형태로 리턴(대소문자의 구별은 하지 않음)
	if (false == StringText.Contains(TEXT("TCHAR"), ESearchCase::IgnoreCase))
	{
		UE_LOG(LogTemp, Warning, TEXT("TCHAR는 포함되어있지 않습니다."));
	}
	else
	{
		UE_LOG(LogTemp, Warning, TEXT("TCHAR는 포함되어있습니다."));
	}

	// 문자열에 인자가 포함되었는지를 확인하고 존재하면 인덱스를 리턴(대소문자의 구별은 하지 않음)
	int32 index = StringText.Find(TEXT("FString"), ESearchCase::IgnoreCase);
	UE_LOG(LogTemp, Warning, TEXT("FString이 포함된 인덱스는 %d입니다"), index);


	// 문자열을 인자를 기준으로 분리하고 결과를 bool로 리턴
	FString Left, Right;
	if (StringText.Split(TEXT(" "), &Left, &Right))
	{
		UE_LOG(LogTemp, Warning, TEXT("인자를 기준으로 잘린 문자열은 '%s' 와 '%s' 입니다"), *Left, *Right);
	}

	FName Name1(TEXT("KIM"));
	FName Name2(TEXT("kim"));

	// FName의 비교연산
	UE_LOG(LogTemp, Warning, TEXT("FName끼리의 비교 연산은 %s 입니다"), Name1 == Name2 ? TEXT("'같음'") : TEXT("'다름'"));
}

 

실행 결과는 다음과 같습니다.

 

 

이렇게 언리얼 엔진에서 문자열을 어떻게 처리하고 어떤 방식으로 다루는 지 알아보았습니다.

이외에도 다양한 문자열 처리 방법이 존재하므로 궁금하시다면 아래의 공식문서를 확인해주시면 되겠습니다.

 

https://dev.epicgames.com/documentation/en-us/unreal-engine/fstring-in-unreal-engine?application_version=5.4

728x90
반응형