Bool
언리얼에서 bool은 크기가 명확하지 않은 타입이다. 따라서 이를 확실하게 하며 데이터를 줄이기 위해 uint8을 사용한다.
여기에서 더 작은 크기를 사용하기 위해 Bit Field를 사용해서 1비트로 데이터를 제한할 수 있다.
UPROPERTY()
uint8 bNetTemporary:1;
단순히 Bool을 써도 되지만 굳이 이렇게 하는 이유는 언리얼 오브젝트의 프로퍼티를 데이터 통신 및 시리얼라이제이션 등에 사용 시 명확한 크기를 지정하기 위함이다. 그렇기에 비트필드는 UPROPERTY에 대해서만 사용한다. UPROPERTY가 아닌 경우에는 크기를 명확히 지정할 필요가 없기에, 비트필드가 아닌 bool을 사용하면 됩니다. 이 경우는 보통 하던 대로 헤더에서 초기화해 줄 수 있다.
UPROPERTY는 언리얼 오브젝트 메커니즘의 특성상 헤더파일이 아닌 생성자에서 초기화 해주어야 한다.
캐릭터 인코딩
언리얼 엔진의 모든 스트링은 FStrings 혹은 TCHAR 정렬 상태로 UTF-16 포맷 메모리에 저장됩니다.
유니코드를 사용하고 UTF-16으로 맞추되, 소스코드는 많이 사용되는 UTF-8을 가급적 사용합시다.
문자열을 쓸 때 주의사항!
- 유니코드를 사용해 문자열 처리를 통일.
- 이 중에서 2byte로 사이즈가 균일한 UTF-16을 사용
- 유니코드를 위한 언리얼 표준 캐릭터 타입 : TCHAR
- 문자열은 언제나 TEXT 매크로를 사용해 지정
- TEXT 매크로로 감싼 문자열은 TCHAR 배열로 저장됨
- 문자열을 다루는 클래스로 FString를 제공함
- FString은 TCHAR 배열을 포함하는 헬퍼 클래스
TCHAR와 FString
TCHAR
: 언리얼에서 사용하느 문자 배열입니다.
TEXT매크로의 반환값은 TCHAR의 배열이다.
TCHAR LogCharArray[] = TEXT("Hello Unreal");
UE_LOG(LogTemp, Log, LogCharArray);
FString
: 조작이 가능한 유일한 스트링 클래스입니다.
FString TestHUDString = FString(TEXT("This is my test FString."));
UE_LOG(LogTemp, Log, TEXT("%s"), *TestHUDString);
- 문자열을 만들때 TCHAR 배열만 들어가기 때문에 %s에 대응될 때는 포인터 어레이를 반환해 줘야 해서 포인터 연산자를 지정해 준다.
- FString에는 TArray(컨테이너 클래스)라고 하는 언리얼 엔진이 제공하는 동적 배열 클래스가 있다.
- FString은 FCString을 포함하고 있다.
- FCString : C라이브러리에서 제공하는 기본적인 스트링 관련 함수들을 포함하는 래퍼 클래스(Wrapper Class)
FString 함수
●다른 타입에서 FString으로의 변환
- FString::Printf
- FString::SanitizeFloat
- FString::FromInt
● C런타임 수준에서 문자열을 처리하는 클래스 FCString
- 예) 문자열을 찾는 strstr을 사용
● FString에서 다른 타입으로의 변환( 안전하진 않으므로 주의)
- FCString::Atoi
- ◎FCString::Atof
●FString 함수의 활용
// FString의 값을 바꿀 때
const TCHAR* LongCharPtr = *LogCharString;
TCHAR* LogCharDataPtr = LogCharString.GetCharArray().GetData();
// TCHAR의 내용을 복사할 때
TCHAR LogCharArrayWithSize[100];
FCString::Strcpy(LogCharArrayWithSize, LogCharString.Len(), *LogCharString);
// 문자열에 부분 문자열이 포함되어 있는지 여부를 반환합니다
FString.Contains(TEXT("unreal"), ESearchCase::IgnoreCase)
// 처음 발견된 인스턴스의 이 문자열로 인덱스를 반환합니다.
FString.Find(TEXT("unreal"), ESearchCase::IgnoreCase)
// 인덱스 5부터 끝까지 잘라줍니다.
FString.Mid(5)
// 단어를 기준으로 문자열을 나눠줍니다.
FString Left, Right;
LogCharString.Split(TEXT(" "), &Left, &Right)
FName
FName
: 애셋 관리를 위해 사용되는 문자열 체계
- 대소문자 구분 없음
- 한번 선언되면 바꿀 수 없음
- 가볍고 빠름
- 문자를 표현하는 용도가 아닌 애셋 키를 지정하는 용도로 사용. 빌드시 해시값으로 변환됨
- 언리얼은 FName과 관련된 글로벌 Pool 자료구조를 가지고 있음
FText
: 다국어 지원을 위한 문자열 관리 체계
- 일종의 키로 작용함
- 별도의 문자열 테이블 정보가 추가로 요구됨
- 게임 빌드 시 자동으로 다양한 국가별 언어로 변환됨
● FName과 글로벌 Pool
- 문자열이 들어오면 해시 값을 추출해 키를 생성해 FName에서 보관
- FName 값에 저장된 값을 사용해 전역 Pool에서 원하는 자료를 검색해 반환
- 문자 정보는 대소문자를 구분하지 않고 저장함. (Ignore Case)
● FName의 형성
- 생성자에 문자열 정보를 넣으면 풀을 조사해 적당한 키로 변환하는 작업이 수반됨
- Find or Add
FNamePool
: FName들을 보관하고 있는 글로벌 Pool을 가지고 있다. ( key = FName )
●FName을 쓸 때의 주의점
: 생성자를 사용할 때 동일한 key가 있는지 전수 조사하기 때문에, 자주 실행하는 함수에 작성 시 오버헤드가 발생할 수 있다.
'Unreal 공부' 카테고리의 다른 글
[UE] Breaking Down the Components of Gameplay (0) | 2023.11.27 |
---|---|
[UE] C++ for Blueprinters (0) | 2023.11.27 |
언리얼 엔진 코딩 표준 (0) | 2023.11.02 |
[Unreal] 오버랩 이벤트, 히트 이벤트 (1) | 2023.10.05 |
[Unreal] C++ 파일이 먹통이 됬을때 (and UE 인텔리센스 Fix 펌) (1) | 2023.10.03 |