ぼっちプログラマのメモ

UE4とかUE5とかについて書いたり書かなかったり。

【UE4・UE5】StringTableに項目を追加・削除・リセットするBPノードの作り方

はじめに

小ネタですが、EUWなどからStringTableに項目を追加したり、項目を削除・リセットする必要が出てきたのでそのメモを


StringTableって何って方はこちらの記事をどうぞ。非常によくまとまっていてオススメです!(いつもありがとうございます!)
qiita.com

上記の記事にある通り、エディタ上での操作であったり、CSVファイルをインポートすることでStringTableの各項目を編集することができます。また、TableIDとKeyからSoruceStringを取得したりもできます。
しかし、動的に項目を追加・削除するBPノードは用意されていません。そのため、CSVファイルを事前に用意 または 動的生成してインポートするという少し手間が発生します。

ということで、BPからStringTableを自由自在に編集できるように Add, Remove, Reset用のBPノードを作ってみました。といっても、既存のC++側にある関数を呼び出してるだけなのでかんたんです。

各コード

事前準備

#include "Internationalization/StringTable.h"
#include "Internationalization/StringTableCore.h"
#include "Internationalization/StringTableRegistry.h"

StringTableに要素を追加

void UMyBlueprintFunctionLibrary::AddSourceStringToStringTable(const FName TableId, FString Key,
	FString NewSourceString)
{
	UStringTable* StringTable = FStringTableRegistry::Get().FindStringTableAsset(TableId);
	if (StringTable)
	{
		StringTable->Modify();
		StringTable->GetMutableStringTable()->SetSourceString(Key, NewSourceString);
	}
}

StringTableの要素を削除

void UMyBlueprintFunctionLibrary::AddSourceStringToStringTable(const FName TableId, FString Key,)
{
	UStringTable* StringTable = FStringTableRegistry::Get().FindStringTableAsset(TableId);
	if (StringTable)
	{
		StringTable->Modify();
		StringTable->GetMutableStringTable()->RemoveSourceString(Key);
	}
}

StringTableの全要素を削除(リセット)

void UMyBlueprintFunctionLibrary::ResetStringTable(const FName TableId)
{
	UStringTable* StringTable = FStringTableRegistry::Get().FindStringTableAsset(TableId);
	if (StringTable)
	{
		StringTable->Modify();
		StringTable->GetMutableStringTable()->EnumerateKeysAndSourceStrings
		([&](const FTextKey& InKey, const FString& InSourceString) -> bool
		{
			StringTable->GetMutableStringTable()->RemoveSourceString(InKey);
			return true; // continue enumeration
		});
	}
}

さいごに

上記処理はShippingを含むパッケージでも動作するので、ゲーム実行中に外部(ローカルのファイルやGoogleスプレッドシートなど)から取得したデータを動的に反映したりもできます。StringTableのSourceStringに英語や日本語などの実際にゲーム中使用する言語を設定している場合はかなり便利かなと思います。デフォルト言語を使用しない言語にしている場合はちょっと微妙ですが…。
(↑の内容がよくわからん!という方はこちらの記事・資料をどうぞ)
UE4 ローカライゼーションダッシュボードを試してみる - Qiita
最新UE4タイトルでのローカライズ事例 【UE4 Localization Deep Dive 2019】 | ドクセル

おしまい