언리얼 C++은 C++과 다르다
게임 제작은 서로 다른 유저의 컴퓨터 환경에서 최대한 잘 돌아가게 만들어야 한다.
근데, 기존 C++은 상당히 오래된 언어로 int 같은 경우 어떤 경우에는 32bit, 64bit등 다양하게 해석되는데,
이건 게임 데이터 저장시 치명적인 오류가 생길 수 있다.
⇒ 플랫폼 파편화 : C++의 일부 함수가 플랫폼에 따라서 다르게 동작('여기서는 잘되는데 왜 여기선 잘안되는거지?' 이상황)
따라서, 캐시 히트율을 신경써서 자료구조를 만들어야하는 언리얼 엔진은 int가 아니라, int32처럼 확실하게 크기를 나눠둔 언리얼 C++을 사용한다.
⇒ 캐시 히트율 : 캐시된 데이터를 요청할 때 해당 키 값이 메모리에 존재하여 얼마만큼의 비율로 잘 찾았는지에 대한 여부
언리얼C++에서 자주 사용하는 기본타입
- int32 : int처럼 사용
- uint8 : 바이트 정보를 사용할 때 사용
- TCHAR : 문자열 의미
- float, double : 그대로 사용
※ Bool 타입 ※
- Bit Feild operator을 사용해서 bool 크기를 제한해서 사용 (bool 크기가 명확하지 않다고 판단했다고 함)
UPROPERTY()
uint8 bNetTemporary:1;
// 요런 식으로 비트 필드 설정
// bool형식으로 사용하는지 명시
언리얼C++ 문자열
- 언리얼C++에서는 문자열을 string이 아닌 TCHAR type으로 지정해두었다.
: 코드에서 영어 이외 다른나라 언어도 구현해야하는데 이걸 멀티바이트 체계 라고 부른다. 근데 언어가 한두개가 아니니 멀티바이트 체계가 다양해지고, 그럼 이 많은게 얼마나 큰지 파악해야하는데 너무 힘들다.
그래서, 언리얼에서는 유니코드를 사용해 문자열 처리를 통일했다. 유니코드 중에서도 2byte로 사이즈가 균일한 UTF-16을 사용한다. (UTF-8을 굳이 사용한다면 (한글이 꼭 필요하면) 처리 잘해야한다.)
그리고 이 UTF_16을 위한 언리얼 표준 캐릭터 타입이 TCHAR.
- 문자열은 언제나 TEXT 매크로를 사용해 구현한다.
: TEXT("여기"); 여기에 해당하는 문자열은 TCHAR 배열로 지정된다.
- 하지만, 한국어등 UTF-16이외의 다른걸 사용할 수 있잖아? 그래서 제공하는게 클래스 FString
: FString은 TCHAR배열을 포함하는 헬퍼 클래스이다.
FString은 언리얼에서 사용하기로 한 TCHAR을 감싸고 있는 TArray로,
TCHAR을 가지고는 있지만, TCHAR은 아니기에 더 자유롭게? 텍스트를 변환, 수정등을 할 수 있다.
그리고 이 과정에서 FCString을 사용한다.
다른 타입에서 FString으로 변환하기
- FString::Printf → 출력하기
- FString::SanitizeFloat → Float에서 문자열 전환
- FString::FromInt → Int에서 문자열 변환
FString에서 다른 타입으로 변환 (이건 안전하지 않으니 조심)
- FCSting::Atoi → 아스키코드에서 int로 변환
- FCString::Atof → 아스키코드에서 float로 변환
: 여기처럼 FCString 클래스로 함수를 불러와서 문자를 처리할 수 있다.
FString관련 함수
- Contains : 문자열에 해당 문자가 포함되어 있는지
- Find : 문자열에 해당 문자를 찾고, 문자의 시작 index 출력
- Mid : index에 해당하는 문자부터 끝까지 잘라냄
- Split : 문자열 나누기
FString : FName과 FText
앞서 봤듯이, FString은 문자열을 다양하게 처리할 수 있게 도와준다.(헬퍼 클래스)
그 중에서 FName과 FText 2가지가 더 독특한데,
1. FName
- 프로젝트에서 어떤 에셋을 찾아야 할때 Unity의 태그처럼 설정하는 것.
즉, 문자열을 찾기위한 용도(문자열 처리용도X) - 이 또한 이름표를 달아주는 거여서 string이지만, 내부적으로는 해시를 통해 탐색하기 때문에 가볍고 빠르다.
- Key - Value 쌍으로 제공된다. (때문에 한번 선언되면 바꿀 수 없다.)
- 대소문자 구분이 없다.
- 해시를 key값에 저장한다는 것 = 문자열 데이터 자체는 다른 곳에 저장한다는 것 = 가벼움, 빠름
※FName 사용시 주의 ※
게임처럼 프레임마다 함수가 호출되는 환경(Tick 함수)에서는, FName으로 같은 문자를 계속 넣어주는 상황이 발생할 수 있다.
그래서,
1. 위처럼 const static으로 선언해서 여러번 찾는 일이 없도록 지정
2. 가급적 미리 선언
2. FText
- UI에서 다국어를 설정할 때 필요하다.
'하고싶은거 > Unreal' 카테고리의 다른 글
Part1 05.06. 언리얼 리플렉션 시스템 (프로퍼티 시스템) (0) | 2024.03.08 |
---|---|
Part1 04. 언리얼 오브젝트 (0) | 2024.03.03 |
Part1 02. 언리얼C++ 코딩규칙 (2) | 2024.02.29 |
Part1 01. Hello Unreal! (0) | 2024.02.28 |
Part2 섹션1. 게임 콘텐츠의 기본 구조 (0) | 2024.02.13 |
#개발 #게임 #일상
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!