Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

3냥 집사이면서 게임 개발자입니다.

문자열 사용하기 본문

Unreal Engine 5/언리얼 C++

문자열 사용하기

훙이야 2023. 7. 20. 18:52

언리얼 환경에서 TCHAR, FString을 사용해 로그를 띄워봤습니다. 

 

HELLO UNREAL! 이라는 문자열은 기본적으로 TCHAR 형이라는 배열입니다. 

배열로 변수를 생성한 뒤 문자열을 출력할 수 있습니다. 

 

TCHAR 배열이 아닌 언리얼에서 제공하는 FString 자료형도 같이 사용해 문자열을 출력했습니다.

UE_LOG 매크로 세 번째 구문에는 항상 배열만 들어가기 때문에 FString을 사용할 수 없고, 

%s 에 대응될 때 TCHAR의 Pointer Array를 반환해줘야 하기 때문에 TCHAR* 을 반환하기 위해

FString 변수에 포인터 연산자를 전방에 붙임으로써 문자열 데이터를 가져올 수 있습니다. 

 

복잡한 문자열 처리를 하나로. 

- 유니코드를 사용해 문자열 처리를 통일합니다.

     - 이 중에서 2byte로 사이즈가 균일한 UTF-16을 사용합니다.

     - 유니코드를 위한 언리얼 표준 캐릭터 타입 : TCHAR

- 문자열은 언제나 TEXT 매크로를 사용해 지정합니다.

     - TEXT 매크로로 감싼 문자열은 TCHAR 배열로 지정됩니다. 

- 문자열을 다루는 클래스로 FString를 제공합니다. 

     - FString은 TCHAR 배열을 포함하는 헬퍼 클래스입니다. 

 

다양한 함수와 Printf 함수 등을 지원하며 Printf 의 경우 C++ 함수와 같습니다. 

 

FString의 구조와 활용

- 다른 타입에서 FString으로의 변환

     - FString::Printf

     - FString::SanitizeFloat

     - FString::FromInt

- C런타임 수준에서 문자열을 처리하는 클래스 FCString

     - 예) 문자열을 찾는 strstr을 사용

- FString에서 다른 타입으로의 변환 ( 안전하지 않으므로 주의 )

     - FCString::Atoi

     - FCString::Atof

 

FString 의 경우에는 TCHAR 의 배열로 만들어지는데, 생성할 때 TArray 방식으로 TCHAR 동적 배열로 보관됩니다.

전방에 포인터 연산자를 붙인다면 첫 번째 인자의 포인터를 가리킬 수 있습니다. 

 

FString 자체적으로 다양한 기능을 제공하기 때문에 안에 보관된 데이터를 이용해 자르거나 붙이는 등 연산을 할 수 있습니다.

내부적으로 FCString 이라는 클래스가 존재하는데

일종의 C 라이브러리에서 제공하는 String 함수들을 포함하고 있는 레퍼런스 클래스라고 이해하면 되겠습니다.

 

 

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

     FString 이 주체이며 아래 두 가지 방식으로 처리가 가능합니다. 

 

- FName : 애셋 관리를 위해 사용되는 문자열 체계입니다.

(문자열을 사용하지만 내부적으로는 해쉬값을 사용해 탐색이 빠른게 특징입니다. (해시 테이블 사용)

문자열을 해시 함수로 인덱스화해 키 값으로 사용합니다. 탐색 외에 사용을 권하지 않습니다.) 

     - 대소문자 구분이 없습니다.

     - 한번 선언되면 바꿀 수 없습니다. 

     - 가볍고 빠르다는 이점이 있습니다.

     - 문자를 표현하는 용도가 아닌 애셋 키를 지정하는 용도로 사용합니다. 빌드시 해시값으로 변환됩니다.

 

- FText : 다국어 지원을 위한 문자열 관리 체계 

     - 일종의 키로 작용합니다.

     - 별도의 문자열 테이블 정보가 추가로 요구됩니다.

     - 게임 빌드 시 자동으로 다양한 국가별 언어로 변환됩니다.

 

 

FName의 구조와 활용

- 언리얼은 FName과 관련된 글로벌 Pool 자료구조를 가지고 있습니다.

- FName과 글로벌 Pool

     - 문자열이 들어오면 해시 값을 추출해 키를 생성해 FName에서 보관합니다.

     - FName 값에 저장된 값을 사용해 전역 Pool에서 원하는 자료를 검색해 반환합니다.

     - 문자 정보는 대소문자를 구분하지 않고 저장합니다. (Ignore Case)

- FName의 형성

     - 생성자에 문자열 정보를 넣으면 풀을 조사해 적당한 키로 변환하는 작업이 수반됩니다.

     - Find or Add

 

 

FString 에 대한 몇가지 API를 적용한 결과입니다. 

본 코드는 rider를 사용해 작성했습니다.
출력 결과물

 

 

본 코드는 rider를 사용해 작성했습니다.
출력 결과물

 

 

 

FName은 해시 테이블 자료구조를 사용해 구현되었기 때문에 문자열을 해시 함수로 인덱스화 해, 주로 애셋을 탐색할 때 사용합니다. 

 

자주 실행되는 함수 안에서 (Tick() 함수와 같은) FName 변수를 탐색 후 참조하지 않도록 조심해야 합니다.

해당 키가 전역 Pool 에 있는지 계속해서 조사하기 때문에 오버헤드를 야기할 수 있습니다. 

결과적으로 FName 에 관련 Key값만 저장되면 되기 때문에, const static 으로 처음 초기화 때 데이터를 저장하고,
Local static 으로 저장했으니 그 다음부터 찾을 일이 없도록 하는 방식이 권장됩니다. 

 

 

 

참고 사이트 (언리얼 문서)

https://docs.unrealengine.com/5.1/ko/character-encoding-in-unreal-engine/

 

캐릭터 인코딩

언리얼 엔진 4 에 사용되는 캐릭터 인코딩에 대한 개요입니다.

docs.unrealengine.com

https://docs.unrealengine.com/5.1/ko/fstring-in-unreal-engine/

 

FString

 

docs.unrealengine.com

https://docs.unrealengine.com/5.1/ko/fname-in-unreal-engine/

 

FName

 

docs.unrealengine.com

 

'Unreal Engine 5 > 언리얼 C++' 카테고리의 다른 글

언리얼 오브젝트 리플렉션 시스템 1  (0) 2023.07.25
언리얼 오브젝트  (0) 2023.07.20
언리얼 C++ 의 이해  (0) 2023.07.19
언리얼 c++ 코딩 규칙  (0) 2023.07.19
언리얼 C++ 특징  (0) 2023.07.17