상세 컨텐츠

본문 제목

[언리얼 Tip] FName, FText, FString

Study/UnrealEngine4

by Arq.Dev5igner 2024. 1. 20. 22:50

본문

FName, FText, FString

1. FName

콘텐츠 브라우저에서 새 애셋 이름을 지을때, 다이내믹 머터리얼 인스턴스의 파라미터를 변경할때, 스켈레탈 메시에서 본에 접근할때, 모두 FName을 사용합니다.
FName은 문자열 사용에 있어서 초경량 시스템을 제공하는데, 주어진 문자열이 사용된다 해도 데이터 테이블에 한번만 저장되는 것입니다.
또한, FName은 대소문자를 구분하지 않고 변경도 불가능하여, 조작할 수 없습니다.
이처럼 FName의 정적인 속성과 저장 시스템 덕에 키 값으로 FName에 접근하는 속도가 굉장히 빠릅니다.
FName 서브시스템의 또 다른 특징은 스트링에서 FName 변환이 해시 테이블을 사용해서 빠르다는 점입니다.

  • FName 생성하기
FName myFName = FName(TEXT("myFNameTest"));

단순히 FName 클래스로의 타입 변환으로 FName 타입의 객체를 생성할 수 있습니다.


  • FName 클래스의 비교 기능
  1. == 연산
  2. 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, 작으면 음수를 반환합니다.


2. FText

텍스트 지역화(localization)를 위해 사용하는 클래스
사용자에게 보여지는 텍스트는 지역화를 지연해야 하늪로 FText를 사용합니다.

  • 지역화된 텍스트 리터럴을 생성
  • 텍스트 서식(자리 표시자 패턴에서 텍스트)를 생성
  • 숫자에서 텍스트를 생성
  • 날짜와 시간에서 텍스트를 생성
  • 텍스트를 상위 또는 소문자로 만드는 것과 같은 파생된 텍스트를 생성
  • 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 클래스의 비교 기능

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, 작다면 음수 값을 반환

3. FString

  • FString 클래스는 FName이나 FText와는 달리 조작이 가능한 문자열 클래스입니다.
  • 대소문자 변환, 부분문자열 발췌, 역순 등 사용가능한 함수들이 많습니다.
  • FString 클래스는 검색, 변경 및 다른 스트링과의 비교 또한 가능합니다.
  • FString 생성하기
FString TestString = FString(TEXT("TestString"));

  • FString 클래스의 비교 기능
  1. 오버로딩된 == 연산자를 사용
  2. FString 과 TCHAR*s 배열을 비교
  3. FString::Equals() 사용
    대소문자를 무시 여부 설정 가능(ESearchCase::IgnoreCase, ESearchCase::CaseSensitive)
bool Compare1 = TestString.Equals(OtherString, ESearchCase::IgnoreCase); // 대소문자 구분하지 않음
bool Compare2 = TestString.Equals(OtherString, ESearchCase::CaseSensitive); // 대소문자 구분
//두 FString 객체가 같다면 true를, 다르다면 false를 반환합니다.

  • FString 클래스의 검색 기능
  1. FString::Contains()
  • 서브스트링을 찾은 경우 true 를, 아니면 false 를 반환합니다.
  • 검색 대상은 FString 거나 TCHAR* 의 서브스트링입니다.
  • ESearchCase를 사용해서 검색시 대소문자를 무시 여부 결정, 기본값은 대소문자 무시합니다.
  • ESearchDir을 사용해서는 검색 방향을 지정, 기본값은 처음서부터 시작합니다.
bool Compare = TestString.Contains(OtherString, ESearchCase::CaseSensitive, ESearchDir::FromEnd);
  1. FString::Find()
  • 찾고자 하는 문자열의 처음 인덱스를 반환, 못 찾으면 -1을 반환합니다.
  • 검색 시작 인덱스를 지정할 수 있습니다.
  • FString::Contains() 함수와 동일하게 대소문자 비교 여부와 검색 방향을 지정 가능합니다.
int32 iCompare = TestString.Find(OtherString, ESearchCase::CaseSensitive, ESearchDir::FromStart, 10);

  • FString 클래스의 접합 기능

연산자설명사용법

+= 제공된 스트링을 FString 오브젝트에 덧붙입니다. StringResult += AddedString;
+ 새 FString 오브젝트를 만들어 제공된 스트링을 덧붙입니다. TwoString = OneString + AddedString;

  • Printf로 조립
    FString::Printf 로 조립된 FString은 FString에 저장 가능할 뿐만 아니라, UE_LOG 디버그 메시징으로 화면에 출력시킬 수도 있습니다. 형식 인수는 지정자는 아래 예제에서 볼 수 있듯이 C++ printf 함수와 같습니다.
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;
}

4. 스트링 변환

각각의 클래스 타입에서 다른 클래스 타입으로 변환하는 방법에 대해 소개하겠습니다.

FromTo사용법

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
  • FName은 대소문자를 구분하지 않기 때문에 FString->FName은 손실성 변환이라 위험합니다.
  • FText->FString은 언어 변환시 손실의 위험이 있어서 안전하지 않습니다.
  • FText에서 FName으로의 직접 변환은 없기때문에 FString으로 거쳐서 변환해야 합니다.
    이때 FName은 대소문자를 구분하지 않기 때문에 FText->FString->FName은 손실성 변환이라 위험합니다.

관련글 더보기