【UE5】FText::Formatで特定の文字を置き換える方法

プログラマーの尾関です。

今回は基本的な内容ですが、テキスト内の特定の文字列を置き換える方法について紹介します。

置き換えたいテキスト

例えば以下のテキストを置き換えたいとします。

{ITEM} を入手した

{ITEM} の部分が置き換えたい部分です。これをアイテム名を指定して置き換えます。

FFormatNamedArgumentsを使う

先ほどの "{名前}" という書式であれば、FFormatNamedArgumentsを使うことで置き換えることができます。

FFormatNamedArguments Args;
// 定義名を指定して置き換え文字列を設定する
Args.Add("ITEM", FText::FromString(TEXT("回復剤"))); // {ITEM} を置き換え.
// フォーマット実行.
FText formattedText = FText::Format(FText::FromString(TEXT("{ITEM} を入手した")), Args);

個人的に少し悩んだのが、似たような引数パラメータの指定方法である「FFormatOrderedArguments」の存在です。これは「追加した順番」で文字を置き換えるというものとなります。

FFormatOrderedArguments Args;
// 順番に置き換え文字列を設定する.
Args.Add(FText::FromString(TEXT("Hello")));
Args.Add(FText::AsNumber(123));
// 指定した順番で文字列フォーマットを行う.
FText formattedText = FText::Format(FText::FromString(TEXT("{0} {1}")), Args);

FFormatOrderedArgumentsは、{0}, {1}, {2}, ... という数字でパラメータを指定するもので、Add() の呼び出し順番でどの部分を置き換えるのかを決定します。

FFormatOrderedArgumentsとFFormatNamedArgumentsの使い分け

通常はおそらくFFormatNamedArguments を使うことになると思います。理由は順番に依存するテキストでは汎用的な処理を組みづらいという点が大きいと思います。これによってローカリゼーション (翻訳テキスト) に対応しやすくなります。

例えば置き換え文字が複数あり、言語によって順番が入れ替わるものです。

// 日本語テキスト.
"{0}を{1}個購入しました。"

// 英語テキスト.
"You bought {0} {1}."

このように翻訳テキストによってはパラメータの順番が異なるケースがあるので、通常は FFormatNamedArguments を使うべきです。何より {ITEM} や {QUANTITY} といった名前がついていた方がわかりやすい、という理由もあります。

では、FFormatOrderedArgumentsはどういうときに使うべきか、ですがデバッグ用途としてお手軽に使う場合は {0}や{1} がシンプルに書けて良いというメリットがあります。

void DebugLog(const FString& Message, int Value)
{
    FFormatOrderedArguments Args;
    Args.Add(FText::FromString(Message));
    Args.Add(FText::AsNumber(Value));
    
    UE_LOG(LogTemp, Log, TEXT("{0} : {1}"), Args);
}

\ 最新情報をチェック /