はじめに
Unreal Engine (UE) Advent Calendar 2025 シリーズ3の3日目の記事になります。
GameplayTagをC++上から参照する為に毎回C++で変数用意してBP上でTagの設定を行うのが手間なのと、タグをハードコードで扱うのも嫌だったので、
既に定義されてるGameplayTagをC++上で参照しやすい形にするツールをEUWを用いて作成したのでそちらのご紹介。
BPのみのプロジェクトにとっては有用な情報ではありません。
完成イメージ
EUWを実行すると.h .cppファイルに定義されているタグを全て書き出す

namespace::Tag の形で参照可能になり、
以下の様にC++上でわざわざ変数を用意せずともGameplayTagを扱えるようになる。
// 定義したタグをコンテナに追加
FGameplayTagContainer Container;
Container.AddTag(TestProjectGameplayTags::ObjectRoot_Effect_Ef0001);
Container.AddTag(TestProjectGameplayTags::ObjectRoot_Effect_Ef0002);
Container.AddTag(TestProjectGameplayTags::ObjectRoot_Effect_Ef0003);
// 定義したタグを使って比較
if(InItemID.MatchesTag(MastrobotGameplayTags::ObjectRoot_Item_Use))
{
// nop
}
環境
Windows11
UE5.6.0
実装概要
- EUWで特定のパスに存在する「GameplayTagTableRow」を行構造とするDTを取得
- DataTable内の「Tag」と「DevComment」を以下2つのマクロの引数に合うよう文字列を作成
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Test_A) // .hファイル
UE_DEFINE_GAMEPLAY_TAG_COMMENT(Test_A, "Test.A", "テスト用タグ) // .cppファイル
※C++からGameplayTagの定義を追加する為のマクロらしいです
「UE_DECLARE_GAMEPLAY_TAG_EXTERN」は.hファイルに、「UE_DEFINE_GAMEPLAY_TAG_COMMENT」はcppファイルに記述する
- 作成した文字列を「FFileHelper::SaveStringToFile」というヘルパー関数を使用して.h,.cppファイルを作成
実装詳細
EUWの作成
-
DataTableからFGameplayTagTableRowの情報を抜き取る
/// <summary>
/// 指定したDataTableからFGameplayTagTableRow配列を返す
/// </summary>
/// <param name="DataTable"> DataTable </param>
TArray<FGameplayTagTableRow> UEUWFunctionLibrary::GetData(const UDataTable* DataTable)
{
TArray<FGameplayTagTableRow> Data;
// チェック
if(!IsValid(DataTable))
{
return Data;
}
// 引数のDataTableからFGameplayTagTableRowのデータを纏めて返す
TArray<FGameplayTagTableRow*> OutData;
DataTable->GetAllRows<FGameplayTagTableRow>("",OutData);
for(const auto Row : OutData)
{
FGameplayTagTableRow RowData
{
Row->Tag,
Row->DevComment
};
Data.Add(RowData);
}
return Data;
}
- マクロ用に文字列を置換
- 冒頭で説明したマクロの引数に合うように文字列を置換
- 以下のようなテンプレート文字列を用意して%%で括られている所を置換
UE_DEFINE_GAMEPLAY_TAG_COMMENT(%TagTemp%,"%MainTagTemp%","%CommentTemp%");
UE_DECLARE_GAMEPLAY_TAG_EXTERN(%TemplateTag%);
/// <summary>
/// 指定した文字列を指定したパスにファイルとして生成
/// </summary>
/// <param name="StringToSave"> 書き出す文字列 </param>
/// <param name="StringToSave"> ファイルパス </param>
void UEUWFunctionLibrary::SaveStringToFile(const FString StringToSave, const FString FullPath)
{
// ヘルパー関数使って保存
FFileHelper::SaveStringToFile(StringToSave,*FullPath);
}
EUW実行
- 作成したEUWを実行すると以下の様にファイルが作成されて定義されてるタグが全てcpp/hファイルにマクロを使用した形で書き出される
- タグのハードコードやC++上でのGameplayTag変数の用意無しで扱えるようになる
// 定義したタグをコンテナに追加
FGameplayTagContainer Container;
Container.AddTag(TestProjectGameplayTags::ObjectRoot_Effect_Ef0001);
Container.AddTag(TestProjectGameplayTags::ObjectRoot_Effect_Ef0002);
Container.AddTag(TestProjectGameplayTags::ObjectRoot_Effect_Ef0003);
// 定義したタグを使って比較
if(InItemID.MatchesTag(MastrobotGameplayTags::ObjectRoot_Item_Use))
{
// nop
}
おわりに
UE_DECLARE_GAMEPLAY_TAG_EXTERN や UE_DEFINE_GAMEPLAY_TAG_COMMENT マクロの使い方として合っているか微妙な所なのですが、タグのハードコードや変数の用意が無くてもタグを扱えるので何らかの参考になれば幸いです。




