FName
および FText
とは異なり、FString
は検索、変更、他の文字列との比較が可能です。ただしこれらの操作により、FStrings
は不変の文字列クラスよりもコストがかかる可能性があります。これは、FString
オブジェクトが独自の文字配列を格納するのに対し、FName
オブジェクトと FText
オブジェクトは共有する文字配列へのインデックスを格納し、このインデックス値のみに基づいて等価性を得る可能性があるためです。
FString を作成する
次の構文を使用して FString
を宣言できます。
FString TestHUDString = FString(TEXT("This is my test FString."));
変換
文字列変数
FString から
変換前 | 変更後 | 例 |
---|---|---|
FString | FName | TestHUDName = FName(*TestHUDString); |
FString | FText | TestHUDText = FText::FromString(TestHUDString); |
FString へ
変換前 | 変更後 | 例 |
---|---|---|
FText | FString | TestHUDString = TestHUDText.ToString(); |
FText | FString | TestHUDString = TestHUDText.ToString(); |
数値およびその他の変数
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 数値変数、および boolean 変数への変換も存在します。
変数の型 | 文字列からの変換 | 注 |
---|---|---|
bool | TestHUDString.ToBool(); |
|
int | FCString::Atoi(*TestHUDString); |
|
float | FCString::Atof(*TestHUDString); |
比較
オーバーロードされた == 演算子は、2 つの FString を比較したり、FString を TCHAR* の配列と比較したりするのに使用できます。FString::Equals() メソッドもあります。 これは、テスト対象の FString と、比較で大文字と小文字を区別するかどうかを引数として指定する ESearchCase 列挙型を受け取ります。大文字と小文字を区別せずに比較したい場合は、ESearchCase::IgnoreCase を使用します。 そうでない場合は、ESearchCase::CaseSensitive を使用します。
TestHUDString.Equals(TEXT("Test"), ESearchCase::CaseSensitive);
検索
FStrings 内で検索する場合、2 つの検索タイプがあります。1t つ目の FString::Contains() は、部分文字列が見つかった場合は true を返し、それ以外の場合は false を返します。FString::Contains() は、
FString または TCHAR* の部分文字列を検索できます。ESearchCase 列挙型を使用すると、検索で大文字と小文字を区別するかどうかを指定できます。また、ESearchDir
列挙型を使用して
検索の方向を指定することもできます。デフォルトでは大文字と小文字は区別されず、先頭から検索が行われます。
TestHUDString.Contains(TEXT("Test"), ESearchCase::CaseSensitive, ESearchDir::FromEnd);
2 つ目の FString::Find()
は、部分文字列の最初の見つかったインスタンスのインデックスを返します。FString::Find()
は、FString
または TCHAR*
の部分文字列を検索できます。これは、
FString::Contains()
と同様、大文字と小文字の区別と検索方向を指定できます。デフォルトでは、大文字と小文字は無視され、文字列の先頭から行われます。オプションで、
検索を開始する文字列内のインデックスを設定することもできます。FString::Find()
で部分文字列が見つからない場合、「-1」が返されます。
TestHUDString.Find(TEXT("test"), ESearchCase::CaseSensitive, ESearchDir::FromEnd, 10);
FStrings をビルドする
部分文字列または他の変数型から文字列をビルドするには、2 つのメソッドがあります。1 つ目は、連結が引数として FString のみを受け取ります。他のタイプの変数を連結する前に、
FString に変換する必要があります。2 番目の Printf
は、int や float などの数値入力を受け付けることができます。文字列に追加される入力の書式を設定することもできます。
結合
文字列を連結するための演算子は 2 つあります。
演算子 | ディスクリプション | 使用法 |
---|---|---|
+= |
指定された文字列を FString オブジェクトに追加します。 | StringResult += AddedString; |
+ |
新しい FString オブジェクトを作成し、指定された文字列を追加します。 |
Printf
FString::Printf でビルドされた FString は、FString に格納できるほか、UE_LOG デバッグ メッセージを使用して画面に表示することもできます。以下の例に示すように、 format 引数には 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;
}
%s パラメータを使用して FStrings を含める場合、*
演算子を使用して %s パラメータに必要な TCHAR* を返す必要があります。
FString を操作する
文字列を操作するための関数は多数あります。ここでいくつか説明しますが、使用可能な FString 関数の完全なリストについては、UnrealString.h または FString の API ドキュメントを参照してください。
文字列のサブセクションをコピーするための関数としては、Left、Right、Mid があります。見つかった部分文字列の位置で文字列を 2 つの文字列に分割できます。
これは Split
メソッドを使用して行います。文字列を分割する別のメソッドは ParseIntoArray です。これは、文字列を指定された区切り文字で区切られた文字列の配列に分割します。
大文字と小文字の変換には、ToUpper と ToLower を使用します。これにより、文字列をそれぞれ大文字と小文字に変換できます。
HUD の FStrings
Canvas
Canvas を使用して HUD に FString を表示するには、FCanvas::DrawText() 関数を呼び出します。
Canvas->DrawText(BigFont, TestHUDString, 110.0f,110.0f);
HUD クラスの DrawHUD() 関数内で DrawText() 関数を呼び出すか、DrawHUD() で始まる関数チェーン内で呼び出す必要があります。
デバッグ メッセージ
FStrings は、デバッグ目的で ビューポート と アウトプット ログ に出力できます。
ビューポートに出力する
デバッグ メッセージを ビューポート に出力するには、UEngine::AddOnScreenDebugMessage() を使用します。この関数は、次の 4 つのパラメータを (順番に) 受け取ります。
パラメータ名 | パラメータのタイプ | ディスクリプション |
---|---|---|
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 を使用して独自のカテゴリを定義することもできます。
- ログは使用する詳細レベルです。詳細度は ELogVerbosity 列挙型で定義されます。有効な値は、Fatal、Error、Warning、Display、Log、Verbose、VeryVerbose です。
- 次の引数は、パラメータのマークアップを含む、出力するテキストです。
この例では %s パラメータを使用しているため、*
演算子を使用して %s パラメータに必要な TCHAR* を返します。
UE_LOG で表示されたメッセージは、[Output Log (アウトプットログ)] (Unreal Editor の [Window] > [Output 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*) に変換します。
これらのマクロが宣言するオブジェクトの存続期間は非常に短くなります。これらは、関数のパラメータとして使用することを目的としています。オブジェクトがスコープ外になり、文字列が解放されるため、 変換された文字列の内容に変数を割り当てることはできません。
渡すパラメータはポインタに型キャストされるため、適切な文字列である必要があります。TCHAR ではなく TCHAR* を渡した場合、コンパイルされて実行時にクラッシュします。
使用方法:SomeApi(TCHAR_TO_ANSI(SomeUnicodeString));