게임 개발/Unreal Engine 기본

[UE4] 문자열 다루기 - FName, FText, String

지노윈 2022. 2. 9. 00:58
반응형

FName

  • 정적이며 가장 가벼운 문자열 클래스 
  • 비교시 대소문자 구분하지 않음
  • 한 번만 저장하며 변경 및 조작 불가능
  • 찾기나 키로 FName에 접근하는 속도 빠름

문자열 비교

    FName Name1 = FName(TEXT("TestFName"));
    FName Name2 = FName(TEXT("TESTFNAME"));
    FName Name3 = FName(TEXT("TestFName3"));

    bool bCompare1 = (Name1 == Name2); // true, 대소문자 구분을 하지 않는다
    bool bCompare2 = (Name1 == Name3); // false
    
    UE_LOG(TestProject, Warning, TEXT("bCompare1=%d bCompare2=%d"), bCompare1, bCompare2);
    // 출력 : TestProject: Warning: bCompare1=1 bCompare2=0
    FName TestName1 = FName(TEXT("A"));
    FName TestName2 = FName(TEXT("f"));
    FName TestName3 = FName(TEXT("F"));
    FName TestName4 = FName(TEXT("K"));

    int32 Compare1 = TestName2.Compare(TestName1); // 양수
    int32 Compare2 = TestName2.Compare(TestName3); // 0
    int32 Compare3 = TestName2.Compare(TestName4); // 음수

    UE_LOG(TestProject, Warning, TEXT("Compare1=%d Compare2=%d Compare3=%d"), Compare1, Compare2, Compare3);
    // 출력 : TestProject: Warning: Compare1=5 Compare2=0 Compare3=-4

FText

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

지역화를 위한 매크로

NSLOCTEXT 네임스페이스, 키, 소스 스트링을 정의하는 텍스트 현지화 조각을 생성합니다.
LOCTEXT 키와 소스 스트링을 정의하고, 네임스페이스는 LOCTEXT_NAMESPACE 로 정의하는 현지화 텍스트 조각을 생성합니다.

 

    FText constFTextHelloWorld = NSLOCTEXT("MyNamespace", "HelloWorld", "Hello World!");

#define LOCTEXT_NAMESPACE "MyNamespace"
    FText constFTextGoodbyeWorld = LOCTEXT("GoodbyeWorld", "Goodbye World!");
#undef LOCTEXT_NAMESPACE

Format을 사용하여 생성

#define LOCTEXT_NAMESPACE "MyNamespace"
    int32 CurrentHealth = 100;
    FText text = FText::Format(LOCTEXT("ExampleFText", "You currently have {0} health left."), CurrentHealth);
#undef LOCTEXT_NAMESPACE

FString

  • FString 클래스는 FName이나 FText와는 달리 조작이 가능한 문자열 클래스
  • 대소문자 변환, 부분문자열 발췌, 역순 등 사용가능한 함수들이 많다.
  • FString 클래스는 검색, 변경 및 다른 스트링과의 비교 또한 가능하다

FString 생성

FString TestHUDString = FString(TEXT("This is my test FString."));

비교

  • 오버로딩된 == 연산자를 사용
  • FString 과 TCHAR*s 배열을 비교
  • FString::Equals() 사용
  • 대소문자를 무시 여부 설정 가능(ESearchCase::IgnoreCase, ESearchCase::CaseSensitive)
// 대소문자를 구분하여 문자열 비교합니다.
TestHUDString.Equals(TEXT("Test"), ESearchCase::CaseSensitive);

검색

  • FString::Contains()
    • 서브스트링을 찾은 경우 true 를, 아니면 false 를 반환합니다.
    • 검색 대상은 FString 거나 TCHAR* 의 서브스트링입니다. 
    • ESearchCase를 사용해서 검색시 대소문자를 무시 여부 결정, 기본값은 대소문자 무시
    • ESearchDir을 사용해서는 검색 방향을 지정,  기본값은 처음서부터 시작
TestHUDString.Contains(TEXT("Test"), ESearchCase::CaseSensitive, ESearchDir::FromEnd);
  • 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;
}

문자열 변환 관련에서는 다음 글을 참고해 주세요,.

[게임 개발/Unreal Engine 기본] - [UE4] 문자열 변환 - FName, FText, String


출처
https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/StringHandling/
https://docs.unrealengine.com/4.27/ko/ProductionPipelines/Localization/Formatting/
https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/StringHandling/FString/