You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
210 lines
11 KiB
Plaintext
210 lines
11 KiB
Plaintext
INTSourceChangelist:2374181
|
|
Availability: Public
|
|
Title:FString
|
|
Crumbs:%ROOT%, Programming, Programming/UnrealArchitecture/Reference, Programming/UnrealArchitecture/Reference/Properties, Programming/UnrealArchitecture/StringHandling
|
|
Description:
|
|
Version: 4.5
|
|
|
|
[TOC (start:2 end:3)]
|
|
|
|
## 개요
|
|
|
|
[EXCERPT:Overview]
|
|
FName 이나 FText 와는 달리, FString 은 조작이 가능한 유일한 스트링 클래스입니다. 대소문자 변환, 부분문자열 발췌, 역순 등 사용가능한 메소드는 많습니다.
|
|
FString 은 검색, 변경에 다른 스트링과의 비교도 가능합니다. 그러나 바로 그것이 FString 이 다른 불변의 스트링 클래스보다 비싸지는 이유입니다.
|
|
[/EXCERPT:Overview]
|
|
|
|
## FString 만들기
|
|
|
|
FString TestHUDString = FString(TEXT("This is my test FString."));
|
|
|
|
|
|
## 변환
|
|
|
|
### String 변수
|
|
|
|
#### From FString
|
|
|
|
|에서 | 으로 | 예제 |
|
|
|---|------|---------|
|
|
%Programming/UnrealArchitecture/StringHandling:fstringtofname%
|
|
%Programming/UnrealArchitecture/StringHandling:fstringtoftext%
|
|
|
|
#### To FString
|
|
|
|
|에서 | 으로 | 예제 |
|
|
|---|------|---------|
|
|
%Programming/UnrealArchitecture/StringHandling:fnametofstring%
|
|
%Programming/UnrealArchitecture/StringHandling:ftexttofstring%
|
|
|
|
### 숫자 및 기타 변수
|
|
|
|
#### FString 에서
|
|
| 변수 유형 | 스트링으로의 변환 | 스트링 포맷 |
|
|
| ------------- | -------------------- | --------------|
|
|
| float | `FString::SanitizeFloat(FloatVariable);`| |
|
|
| int | `FString::FromInt(IntVariable);` | |
|
|
| bool | `InBool ? TEXT("true") : TEXT("false"); ` | 'true' 거나 'false' 거나 |
|
|
| FVector | `VectorVariable.ToString();` | 'X= Y= Z=' |
|
|
| FVector2D | `Vector2DVariable.ToString();` | 'X= Y=' |
|
|
| FRotator | `RotatorVariable.ToString();` | 'P= Y= R=' |
|
|
| FLinearColor | `LinearColorVariable.ToString();` | '(R=,G=,B=,A=)' |
|
|
| UObject | `(InObj != NULL) ? InObj->GetName() : FString(TEXT("None"));` | UObject 의 FName |
|
|
|
|
다른 숫자 변환의 경우, `FString::Printf()` 함수에 적합한 인수를 곁들어 사용하면 됩니다.
|
|
|
|
#### FString 으로
|
|
|
|
`FString` 에서 `int` 나 `float` 숫자 변수로의 변환은 물론, 불리언 변수로의 변환도 존재합니다.
|
|
|
|
| 변수 유형 | 스트링으로의 변환 | 참고 |
|
|
| ------------- | -------------------- | --------------|
|
|
|bool | `TestHUDString.ToBool();` | %doxygen:FString::ToBool%|
|
|
| int | `FCString::Atoi(*TestHUDString);` | |
|
|
| float | `FCString::Atof(*TestHUDString);` | |
|
|
|
|
## 비교
|
|
|
|
오버로딩된 `==` 연산자를 사용해서 두 FString 을 비교하거나, 하나의 FString 과 TCHAR*s 배열을 비교할 수 있습니다. `FString::Equals()` 메소드도 있는데, 검사 대상
|
|
FString 과, 비교시 대소문자를 무시할 것인지를 나타내는 `ESearchCase` 열거형을 받습니다. 대소문자 상관없는 비교를 하려는 경우 `ESearchCase::IgnoreCase` 를,
|
|
아닌 경우 `ESearchCase::CaseSensitive` 를 사용합니다..
|
|
|
|
TestHUDString.Equals(TEXT("Test"), ESearchCase::CaseSensitive);
|
|
|
|
|
|
## 검색
|
|
|
|
FString 안에서 검색을 할 때는, 두 가지 검색 유형이 있습니다. 첫째, `FString::Contains()` 는 서브스트링을 찾은 경우 _true_ 를, 아니면 _false_ 를 반환합니다. `FString::Contains()` 의 검색 대상은
|
|
`FString` 거나 `TCHAR*` 의 서브스트링입니다. `ESearchCase` 열거형을 사용해서 검색시 대소문자를 무시할 것인지를 지정할 수 있습니다. 또한, `ESearchDir` 열거형을 사용해서는
|
|
검색 방향을 지정할 수 있습니다. 검색 기본값은 대소문자 무시이며, 처음서부터 시작합니다.
|
|
|
|
TestHUDString.Contains(TEXT("Test"), ESearchCase::CaseSensitive, ESearchDir::FromEnd);
|
|
|
|
둘째, `FString::Find()` 는 처음 찾은 서브스트링 인스턴스의 인덱스를 반환합니다. `FString::Find()` 의 검색 대상은 `FString` 또는 `TCHAR*` 의 서브스트링입니다. `FString::Contains()` 와 마찬가지로,
|
|
대소문자 구분 여부와 검색 방향을 지정할 수 있으며, 기본값은 대소문자 무시에 처음서부터 검색입니다. 또다른 옵션으로는,
|
|
스트링 안에서 검색을 시작할 인덱스를 지정할 수도 있습니다. `FString::Find()` 이 서브스트링을 찾지 못하는 경우, -1 을 반환합니다.
|
|
|
|
TestHUDString.Find(TEXT("test"), ESearchCase::CaseSensitive, ESearchDir::FromEnd, 10);
|
|
|
|
|
|
|
|
|
|
## FString 조립하기
|
|
|
|
서브스트링이나 다른 변수 유형으로부터 스트링을 조립하는 메소드는 두 가지 있습니다. 첫째, 접합(concatenation)은 FString 만을 인수로 받습니다. 다른 변수 유형은 FString 으로 변환을 해 줘야
|
|
접합시킬 수 있습니다. 둘째, `Printf` 는 int 나 float 같은 숫자 입력을 받을 수 있으며, 스트링에 추가시킬 입력 형식을 설정할 수도 있습니다.
|
|
|
|
|
|
### 접합
|
|
스트링 접합 연산자는 두 가지입니다:
|
|
|
|
| 연산자 | 설명 | 사용법 |
|
|
| -------- | ----------- | ----- |
|
|
| `+=` | 제공된 스트링을 FString 오브젝트에 덧붙입니다. | `StringResult += AddedString;` |
|
|
| `+` | 새 FString 오브젝트를 만들어 제공된 스트링을 덧붙입니다. | |
|
|
|
|
|
|
|
|
### 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;
|
|
}
|
|
|
|
[REGION:tip]
|
|
FString 포함을 위해 `%s` 파라미터를 사용하는 경우, 반드시 * 연산자를 사용해 줘야 %s 파라미터에 필요한 TCHAR* 가 반환됩니다.
|
|
[/REGION]
|
|
|
|
## FString 조작하기
|
|
|
|
스트링 조작을 위한 함수는 여러가지 있습니다. 여기서는 일부만 다루겠으며, 사용가능한 FString 함수 전체 목록은 `UnrealString.h` 또는 FString 관련 API 문서를 참고해 주시기 바랍니다.
|
|
스트링 서브섹션 복사를 위한 함수는 `Left`, `Right`, `Mid` 가 있습니다. 지정된 서브섹션 위치를 기준으로 스트링을 둘로 분할시킬 수 있습니다.
|
|
그 작업은 `Split` 메소드를 통해 이루어집니다. 스트링 분할을 위한 또다른 메소드는 `ParseIntoArray` 로, 스트링을 지정된 구분자마다 스트링 배열에 분할시킵니다.
|
|
대소문자 변환은 `ToUpper`, `ToLower` 를 통해 이루어지며, 각각 스트링을 대문자, 소문자로 변환시킵니다.
|
|
|
|
## HUD 의 FString
|
|
|
|
### 캔버스
|
|
|
|
[캔버스](Gameplay/Framework\UIAndHUD#캔버스) 를 사용해서 HUD 에 FString 을 표시하려면, `FCanvas::DrawText()` 함수를 호출합니다:
|
|
|
|
Canvas->DrawText(BigFont, TestHUDString, 110.0f,110.0f);
|
|
|
|
[REGION:note]
|
|
`DrawText()` 함수의 호출은 HUD 클래스의 `DrawHUD()` 함수 안에서, 또는 `DrawHUD()` 로 시작하는 함수 체인에서 해 줘야 합니다.
|
|
[/REGION]
|
|
|
|
## 디버그 메시징
|
|
|
|
FString 은 **뷰포트** 에 출력할 수도, 디버깅 용으로 **출력 로그** 에 출력할 수도 있습니다.
|
|
|
|
### 뷰포트에 출력
|
|
|
|

|
|
|
|
디버그 메시지를 **뷰포트** 에 출력하려면 `UEngine::AddOnScreenDebugMessage()` 를 사용합니다. 이 함수는 다음의 네 파라미터를 (순서대로) 받습니다:
|
|
|
|
| 파라미터 이름 | 파라미터 유형 | 설명 |
|
|
| -------------- | ---------------| ------------|
|
|
| Key | int | 같은 메시지가 여러번 추가되지 않도록 하기 위한 고유 키입니다. 디버그 메시지를 트랜션트(휘발성으)로 만들려면 키 값을 -1 로 사용합니다. |
|
|
| TimeToDisplay | float | 메시지를 얼마나 오래 표시할 것인지, 초 단위입니다. |
|
|
| DisplayColor | FColor | 표시되는 텍스트의 색입니다. |
|
|
| DebugMessage | FString | 표시할 메시지 (FString) 입니다. |
|
|
|
|
**예:**
|
|
|
|
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TestHUDString);
|
|
|
|
### 출력 로그에 출력
|
|
|
|

|
|
|
|
`UE_LOG` 는 파라미터에 `printf` 마크업을 사용합니다.
|
|
|
|
UE_LOG(LogClass, Log, TEXT("This is a testing statement. %s"), *TestHUDString);
|
|
|
|
* `LogClass` 는 로그 카테고리입니다. (`OutputDevices.h` 에 `DECLARE_LOG_CATEGORY_EXTERN` 으로 설정된) 기존 카테고리를 사용할 수도, DEFINE_LOG_CATEGORY_STATIC 을 사용해서 자체적으로 정의할 수도 있습니다.
|
|
* `Log` 는 상세도입니다. 상세도는 `ELogVerbosity` 열거형에 정의됩니다. 가능한 값은 `Fatal`, `Error`, `Warning`, `Display`, `Log`, `Verbose`, `VeryVerbose` 입니다.
|
|
* 다음 인수는 출력하고자 하는 텍스트로, 파라미터 마크업 포함입니다.
|
|
|
|
[REGION:tip]
|
|
이 예제에서는 `%s` 파라미터를 사용하기에, `%s` 파라미터에 필요한 `TCHAR*` 반환에 `*` 연산자가 사용되었습니다.
|
|
[/REGION]
|
|
|
|
`UE_LOG` 로 출력된 메시지는 **출력 로그** (언리얼 에디터에서 **창 > 출력 로그**) 에서 확인할 수 있습니다.
|
|
|
|
## 인코딩 변환 매크로
|
|
FString 클래스는 TCHAR 의 TArray 로 만들어져 있습니다. 응용 스트링 (TCHAR*) 을 ANSI 또는 UNICODE 캐릭터 세트로 변환하거나, 그 반대로 변환하는 매크로는 여럿 있습니다.
|
|
매크로 정의는 `Engine\Source\Runtime\Core\Public\Containers\StringConv.h` 에서 찾을 수 있습니다.
|
|
|
|
상대적으로 작은 스트링이라면, 할당은 변환 클래스의 일환으로 스택에서 이루어지나, 큰 스트링이라면 임시 버퍼 할당에 힙이 사용됩니다. 어느 크기까지 스택을 사용할지는 템플릿 파라미터로 결정되므로,
|
|
알맞게 조정해 주면 됩니다. 클래스 영역은 스택 할당에서 팝핑되므로 루프 안에서는 안전합니다.
|
|
|
|
자주 쓰이는 변환 매크로는 다음과 같습니다:
|
|
|
|
* `TCHAR_TO_ANSI` - 엔진 스트링 (TCHAR*) 을 ANSI 로 변환합니다.
|
|
|
|
* `ANSI_TO_TCHAR` - ANSI 스트링을 엔진 스트링 (TCHAR*) 으로 변환합니다.
|
|
|
|
[REGION:note]
|
|
이 매크로에 선언되는 오브젝트는 수명이 매우 짧습니다. 함수의 파라미터용으로 쓰라고 만든 것이기 때문입니다. 변환된 스트링에 변수를 할당할 수는 없는데,
|
|
오브젝트가 영역을 벗어나므로 스트링이 해제(release)되기 때문입니다.
|
|
[/REGION]
|
|
[REGION:warning]
|
|
전달하는 파라미터는 적합한 스트링이어야 하는데, 파라미터는 포인터로의 형 변환이기 때문입니다. TCHAR* 대신 TCHAR 를 전달한다면, 컴파일은 되어도 실행시간에 크래시가 날 것입니다.
|
|
|
|
사용법: `SomeApi(TCHAR_TO_ANSI(SomeUnicodeString));`
|
|
|
|
[/REGION]
|
|
|