언리얼 C++ 기본 타입과 문자열
기본 타입
언리얼은 C++의 기본 타입을 사용하지 않는다.
ㄴ 다양한 기기에서 C++ 언어를 사용하여 게임이 개발되어 왔지만, 구현하는 방법들이 다른 문제가 있다.
boolean 같은 경우 데이터 타입 대신 byte 정보를 BitField라는 Operator를 사용하여 제한하고 사용한다.
ㄴ 헤더가 아닌 cpp 로직에서는 자유롭게 bool을 사용해도 무방하다.
문자열
언리얼 C++가 제공하는 다양한 문자열 처리 방법과 그 내부 구성의 이해
캐릭터는 TCHAR를 사용해야 한다.
ㄴ 유니코드 표준이 보급되기 전, 멀티바이트 문자율인 EUC-KR과 CP949가 확립되어 있었다. 90년도 후반에 들어서며 유니코드가 정착되었지만, 아직도 운영체제에는 기존의 잔재가 남아있어 우리는 문자열을 3종류 처리해야 한다. 언리얼은 이러한 상황을 심플하게 해결하기 위해 TCHAR라는 고유한 문자열 처리 방식을 제공하고 있다.
ㄴ 가급적이면 파일을 로드 할 때 UTF-16으로 통일해서 사용한다. (소스 코드의 경우 UTF-8을 권장)
문자열 로그 생성 실습
문자열을 다양하게 조작하고 싶다면 FString 클래스를 사용해야 한다.
TCHAR LogCharArray[] = TEXT("Hello Unreal");
FString LogCharString = LogCharArray;
UE_LOG(LogTemp, Log, TEXT("%s"), *LogCharString);
ㄴ FString은 캐릭터의 동적 배열을 소유하는 클래스의 형태이며, 그대로 쓰면 TCHAR 포인터가 반환이 되지 않기 떄문에 포인터 연산자를 지정 해 주어야 한다.
FString 유용한 함수
- FString::Printf
- FString::SanitizeFloat
- FString::FromInt
- FStroing::Atoi
- FStroing::Atof
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyGameInstance.h"
void UMyGameInstance::Init()
{
Super::Init();
// UE_LOG(LogTemp, Log, TEXT("%s"), TEXT("Hello Unreal!"));
TCHAR LogCharArray[] = TEXT("Hello Unreal");
FString LogCharString = LogCharArray;
UE_LOG(LogTemp, Log, TEXT("%s"), *LogCharString);
const TCHAR* LongCharPtr = *LogCharString;
TCHAR* LogCharDataPtr = LogCharString.GetCharArray().GetData();
TCHAR LogCharArrayWithSize[100];
FCString::Strcpy(LogCharArrayWithSize, LogCharString.Len(), *LogCharString);
if (LogCharString.Contains(TEXT("unreal"), ESearchCase::IgnoreCase))
{
int32 Index = LogCharString.Find(TEXT("unreal"), ESearchCase::IgnoreCase);
FString EndString = LogCharString.Mid(Index);
UE_LOG(LogTemp, Log, TEXT("Find Test: %s"), *EndString);
}
FString Left, Right;
if (LogCharString.Split(TEXT(" "), &Left, &Right))
{
UE_LOG(LogTemp, Log, TEXT("Split Test: %s 와 %s"), *Left, *Right);
}
int32 IntValue = 32;
float FloatValue = 3.141592;
FString FloatIntString = FString::Printf(TEXT("Int: %d Float: %f"), IntValue, FloatValue);
FString FloatString = FString::SanitizeFloat(FloatValue);
FString IntString = FString::FromInt(IntValue);
UE_LOG(LogTemp, Log, TEXT("%s"), *FloatIntString);
UE_LOG(LogTemp, Log, TEXT("Int: %s Float: %s"), *IntString , *FloatString);
int32 IntValueFromString = FCString::Atoi(*IntString);
float FloatValueFromString = FCString::Atof(*FloatString);
FString FloatIntString2 = FString::Printf(TEXT("Int: %d, Float: %f"), IntValueFromString, FloatValueFromString);
UE_LOG(LogTemp, Log, TEXT("%s"), *FloatIntString2);
}
FName의 활용
에셋 관리를 위해서 사용되는 문자열 체계. 에셋을 빠르게 찾을 수 있도록 내부적으로 해시값을 사용하는 클래스 구조로, 문자를 처리하기 위한 클래스 체계는 아니다. 대소문자 구분을 가지지 않으며, FString처럼 문자를 편집할 수 없다. FString 변환 시 데이터가 깨질 수 있다.
ㄴ FName은 문자열을 키로 변환한 다음 전역 풀에 있는지 조사하는 작업을 거치기 때문에 데이터를 구성하는 작업이 빈번하게 일어나면 오버헤드가 발생할 수 있다. 따라서 const로 처리하거나, static only once와 같은 처리를 해 주는 것이 좋다.
FName key1(TEXT("PELVIS"));
FName key2(TEXT("pelvis"));
UE_LOG(LogTemp, Log, TEXT("FName 비교 결과 : %s"), key1 == key2 ? TEXT("같음") : TEXT("다름"));
for (int i = 0; i < 10000; ++i)
{
FName SearchInNamePool = FName(TEXT("pelvis"));
const static FName StaticOnlyOnce(TEXT("pelvis"));
}
FText : UI에서 다국어 지원을 할 때 필요한 문자열 관리 체계
'스터디' 카테고리의 다른 글
이득우의 언리얼 프로그래밍 스터디 기록 - 4회차 : Unreal Object Reflection System (0) | 2025.02.19 |
---|---|
이득우의 언리얼 프로그래밍 스터디 기록 - 3회차 : Unreal Object (0) | 2025.02.11 |
이득우의 언리얼 프로그래밍 스터디 기록 - 1회차 : 개발 환경 세팅, 언리얼 C++ 코딩 표준의 이해 (0) | 2025.02.05 |
[특강] 전투 기획 - 싸움의 기술 (0) | 2024.10.05 |
[청강대 2023 ARVR Festa] 공모전 출품작 - VR 슈팅게임 Project: P 플레이 영상 2차 개발 (0) | 2023.10.21 |