[Part1] 3. 언리얼 C++ 기본 타입과 문자열UE5/이득우의 언리얼 프로그래밍 공부 노트2023. 10. 29. 00:19
Table of Contents
🚩강의 목표
- 언리얼 환경에서 알아두어야 할 기본 타입과 고려할 점
- 캐릭터(Char) 인코딩 시스템에 대한 이해
- 언리얼 C++이 제공하는 다양한 문자열 처리 방법과 내부 구성 이해
기본 타입
왜 언리얼은 기본 타입을 따로 지정하는가?
- 1970년대에 개발되서 아직도 사용 중인 C++ 언어
- 시대에 따라 발전한 하드웨어 사양
- 플랫폼 파편화(Platform Fragmentation)
- C++ 최신 규약에서
int
는 최소 32비트를 보장하도록 규정되어 있음.- 특정 플랫폼에서는
64bit
로 해석될 수 있음. - 따라서 데이터를 저장할 때
int
타입의 크기를 확신할 수 없음 - 후발 언어 C#의 경우 4바이트(32비트)인
int32
로 명확히 정의돼있음
- 특정 플랫폼에서는
- 게임 제작의 특징
- 데이터 정보가 명확해야 한다.
- 단일 컴퓨터에서 최대 퍼포먼스를 뽑아내야 한다.
- 네트워크 상에서 데이터 통신이 효율적이고 안정적이어야 한다.
bool 타입의 선언
bool
은 크기가 명확하지 않음.- 헤더에는 가급적
bool
대신uint8
타입을 사용하되Bit Field
오퍼레이터를 사용.- 예시 →
uint8 bIsBoolen:1;
- 예시 →
- 일반
uint8
과의 구분을 위해 b접두사를 사용. - Cpp 로직에서는 자유롭게
bool
을 사용.
캐릭터(Char) 인코딩
왜 언리얼은 문자열을 따로 지정하는가?
- 1990년대 후반에 이르러서야 표준화된 아시안 문자욜 표준 (한, 중, 일)
- 하지만 컴퓨터는 그전에도 사용했었다.
- 문자열 처리의 종류
- Single byte(
ANSI
,ASCII
): 컴퓨터 초창기 - Multi byte(
EUC-KR
,CP949
): 컴퓨터 보급기 (1990년대 초중반) - Unicode(
UTF-8
,UTF-16
): 국제 표준 정착기 (1990년대 후반)
- Single byte(
- 하지만 이 모든 문자열은 아직도 사용되고 있음
- C++ STL은
ASCII
,UTF-8
,UTF-16
만 지원함. - Windows 10은 Multi byte를 지원함. 하지만 다른 운영체제는 지원하지 않음.
- C++ STL은
- 🔗언리얼 엔진 캐릭터 인코딩 문서 링크
TCHAR와 FString
복잡한 문자열 처리를 하나로.
- 유니코드를 사용해 문자열 처리를 통일
- 이 중에서 2byte로 사이즈가 균일한
UTF-16
을 사용 - 유니코드를 위한 언리얼 표준 캐릭터 타입:
TCHAR
- 이 중에서 2byte로 사이즈가 균일한
- 문자열은 언제나
TEXT
매크로를 사용해 지정.TEXT
매크로로 감싼 문자열은TCHAR
배열로 지정됨.
- 문자열을 다루는 클래스로
FString
을 제공함FString
은TCHAR
배열을 포함하는 헬퍼 클래스- 🔗FString 클래스 문서
FString의 구조와 활용
- 다른 타입에서 FString으로의 변환
FString::Printf
FString::SanitizeFloat
→ float to stringFString::FromInt
→ int to string
- C런타임 수준에서 문자열을 처리하는 클래스
FCString
- 예) 문자열을 찾는
strstr
을 사용
- 예) 문자열을 찾는
- FString에서 다른 타입으로의 변환 (안전하진 않으므로 주의)
FCString::Atoi
→ ASCII to intFCString::Atof
→ ASCII to float
FName의 활용
언리얼이 제공하는 다양한 문자열 처리
- FName: 에셋 관리를 위해 사양되는 문자열 체계.
- 대소문가 구분 없음
- 한번 선언되면 바꿀 수 없음
- 가볍고 빠름
- 문자를 표현하는 용도가 아닌 에셋 키를 지정하는 용도로 사용 ⇒ 빌드시 해시값으로 변한됨
- 🔗FName 클래스 문서 링크
- FText: 다국어 진원을 위한 문자열 관리 체계.
- 일종의 키로 작용함
- 별도의 문자열 테이블 정보가 추가로 요구됨
- 게임 빌드 시 자동으로 다양한 국가별 언어로 변환됨
FName의 구조와 활용
- 언리얼은 FName과 관련된 글로벌 Pool 자료구조를 가지고 있음
- FName과 글로벌 Pool
- 문자열이 들어오면 해시 값을 추출해 키를 생성해 FName에서 보관
- FName 값에 저장된 값을 사용해 전역 Pool에서 원하는 자료를 검색해 반환
- 문자 정보는 대소문자를 구분하지 않고 저장함. (Ignore Case)
- FName의 형성
- 생성자에 문자열 정보를 넣으면 풀을 조사해 적당한 키로 변환하는 작업이 수반됨
- Find or Add
기타
이번강의에서 UE_LOG를 영상과 똑같이 입력 하면 UE_LOG 함수에 에러가난다.
TCHAR LogCharArray[] = TEXT("Hello Unreal"); UE_LOG(LogTemp, Log, LogCharArray);
해결법은
array
를static const
로 선언해주는것원인은 언리얼엔진 버전마다 UE_LOG 함수의 구현이 달라져서 매개변수 조건이 달라졌다고 한다.
강의는 언리얼 5.1버전 / 내 버전은 5.3.1
static const TCHAR LogCharArray[] = TEXT("Hello Unreal"); UE_LOG(LogTemp, Log, LogCharArray);
단축키
- Cpp파일 수정 후 코드 빌드 →
Ctrl + Alt + F11
- 에디터에서 눌러도되고, VS에도 눌러도 됨
- 헤더파일 수정 후 에디터 실행 →
Ctrl + F5
한글 출력
- 로그에 한글을 찍을려면 cpp파일을
UTF-8
인코딩으로 저장해야한다.
'UE5 > 이득우의 언리얼 프로그래밍 공부 노트' 카테고리의 다른 글
[Part1] 6.언리얼 오브젝트 리플렉션 시스템 2 (0) | 2023.11.12 |
---|---|
[Part1] 5.언리얼 오브젝트 리플렉션 시스템 1 (0) | 2023.11.05 |
[Part1] 4.언리얼 오브젝트 기초 (1) | 2023.11.04 |
[Part1] 2. 언리얼 C++ 코딩 표준 (0) | 2023.10.26 |
[Part1] 1.헬로 언리얼! (0) | 2023.10.24 |