언리얼 엔진에서 사용가능한 스트링 클래스는 FName, FText, FString로 3가지가 존재합니다.
콘텐츠 브라우저에서 새 애셋 이름을 지을때, 다이내믹 머터리얼 인스턴스의 파라미터를 변경할때, 스켈레탈 메시에서 본에 접근할때, 모두 FName을 사용합니다.
FName은 문자열 사용에 있어서 초경량 시스템을 제공하는데, 주어진 문자열이 사용된다 해도 데이터 테이블에 한번만 저장되는 것입니다.
또한, FName은 대소문자를 구분하지 않고 변경도 불가능하여, 조작할 수 없습니다.
이처럼 FName의 정적인 속성과 저장 시스템 덕에 키 값으로 FName에 접근하는 속도가 굉장히 빠릅니다.
FName 서브시스템의 또 다른 특징은 스트링에서 FName 변환이 해시 테이블을 사용해서 빠르다는 점입니다.
FName myFName = FName(TEXT("myFNameTest"));
단순히 FName 클래스로의 타입 변환으로 FName 타입의 객체를 생성할 수 있습니다.
== 연산
Compare 함수
FName oneFName = FName(TEXT("MyoneFName"));
FName twoFName = FName(TEXT("MyoneFName"));
FName threeFName = FName(TEXT("MythreeFName"));
bool Compare1 = (oneFName == twoFName); // true 리턴
bool Compare2 = (twoFName == threeFName); // false 리턴
bool Compare3 = oneFName.Compare(twoFName); //0 리턴
FName::Compare 함수의 경우 현재 객체가 파라미터로 넘겨주는 객체의 값보다 크면 양수, 같으면 0, 작으면 음수를 반환합니다.
텍스트 지역화(localization)를 위해 사용하는 클래스
사용자에게 보여지는 텍스트는 지역화를 지연해야 하늪로 FText를 사용합니다.
- 지역화된 텍스트 리터럴을 생성
- 텍스트 서식(자리 표시자 패턴에서 텍스트)를 생성
- 숫자에서 텍스트를 생성
- 날짜와 시간에서 텍스트를 생성
- 텍스트를 상위 또는 소문자로 만드는 것과 같은 파생된 텍스트를 생성
int32 CurrentHealth = 100;
FText text = FText::Format(LOCTEXT("ExampleFText", "You currently have {0} health left."), CurrentHealth);
FText 객체는 FText::Format 함수를 사용하여 생성할 수 있습니다.
위 예제 코드에서 CurrentHealth라는 변수를 사용하여 FText 객체를 생성하였는데, 해당 변수는 {0}의 위치에 들어가게 됩니다. 더 많은 변수를 텍스트에 추가하고 싶다면, {1}, {2} ~ 이런식으로 텍스트에 추가해준 후 해당 위치에 들어갈 변수들을 뒤쪽에 추가해주면 됩니다.
FText 클래스는 단순한 문자열보다 복잡하기 때문에 오버로드된 연산자 비교를 지원하지 않습니다.
대신 포함된 미묘한 데이터를 인식하는 비교를 수행하는 여러 기능들을 제공합니다.
bool Compare1 = oneFName.EqualTo(twoFName); // 대소문자를 구분하며 같은지 다른지를 비교, true나 false 반환
bool Compare2 = oneFName.EqualToCaseIgnored(twoFName); // 대소문자를 구분하지 않으며 같은지 다른지를 비교, true나 false 반환
int32 iCompare1 = oneFName.CompareTo(twoFName); // 대소문자를 구분하며 TestName 객체가 크다면 양수, 같다면 0, 작다면 음수 값을 반환
int32 iCompare2 = oneFName.CompareToCaseIgnored(twoFName); // 대소문자를 구분하지 않으며 TestName 객체가 크다면 양수, 같다면 0, 작다면 음수 값을 반환
- FString 클래스는 FName이나 FText와는 달리 조작이 가능한 문자열 클래스입니다.
- 대소문자 변환, 부분문자열 발췌, 역순 등 사용가능한 함수들이 많습니다.
- FString 클래스는 검색, 변경 및 다른 스트링과의 비교 또한 가능합니다.
FString TestString = FString(TEXT("TestString"));
bool Compare1 = TestString.Equals(OtherString, ESearchCase::IgnoreCase); // 대소문자 구분하지 않음
bool Compare2 = TestString.Equals(OtherString, ESearchCase::CaseSensitive); // 대소문자 구분
//두 FString 객체가 같다면 true를, 다르다면 false를 반환합니다.
bool Compare = TestString.Contains(OtherString, ESearchCase::CaseSensitive, ESearchDir::FromEnd);
int32 iCompare = TestString.Find(OtherString, ESearchCase::CaseSensitive, ESearchDir::FromStart, 10);
연산자 | 설명 | 사용법 |
---|---|---|
+= | 제공된 스트링을 FString 오브젝트에 덧붙입니다. | StringResult += AddedString; |
+ | 새 FString 오브젝트를 만들어 제공된 스트링을 덧붙입니다. | TwoString = OneString + AddedString; |
FString AShooterHUD::GetTimeString(float TimeSeconds)
{
// 분과 초만 관련이 있습니다.
const int32 TotalSeconds = FMath::Max(0, FMath::TruncToInt(TimeSeconds) % 3600);
const int32 NumMinutes = TotalSeconds / 60;
const int32 NumSeconds = TotalSeconds % 60;
const FString TimeDesc = FString::Printf(TEXT("%02d:%02d"), NumMinutes, NumSeconds);
return TimeDesc;
}
각각의 클래스 타입에서 다른 클래스 타입으로 변환하는 방법에 대해 소개하겠습니다.
From | To | 사용법 |
---|---|---|
FName | FString | TestString = TestName.ToString(); |
FName | FText | TestText = FText::FromName(TestName); |
FString | FName | TestName = FName(*TestString); |
FString | FText | TestText = FText::FromString(TestString); |
FText | FString | TestString = TestText.ToString(); |
FText | FName | FText -> FString -> FName |