4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【UE5】GameplayTagをC++上で参照しやすくする為のツールを作ってみた

Last updated at Posted at 2025-12-02

はじめに

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

完成イメージ

EUWを実行すると.h .cppファイルに定義されているタグを全て書き出す
image.png

namespace::Tag の形で参照可能になり、
以下の様にC++上でわざわざ変数を用意せずともGameplayTagを扱えるようになる。

Hoge.cpp
// 定義したタグをコンテナに追加
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つのマクロの引数に合うよう文字列を作成
Macro.cpp
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の作成

  • 「GetAssetsByPath」で指定したパスのアセット取得
    image.png

  • 取得したアセットからDataTableだけを取得
    image.png

  • DataTableからFGameplayTagTableRowの情報を抜き取る

  • BP公開されている関数では必要な情報を取得する事が出来なかったのでC++で以下の関数を作成
    image.png

GetData.cpp
/// <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;
}
  • マクロ用に文字列を置換
  • 冒頭で説明したマクロの引数に合うように文字列を置換
  • 以下のようなテンプレート文字列を用意して%%で括られている所を置換
Template.cpp
UE_DEFINE_GAMEPLAY_TAG_COMMENT(%TagTemp%,"%MainTagTemp%","%CommentTemp%");
UE_DECLARE_GAMEPLAY_TAG_EXTERN(%TemplateTag%);

image.png

  • 最終的な文字列をコードに書き出し
    image.png
  • ヘルパー関数を呼ぶためのラップした関数を用意
Template.cpp
/// <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ファイルにマクロを使用した形で書き出される
    image.png
  • タグのハードコードやC++上でのGameplayTag変数の用意無しで扱えるようになる
Hoge.cpp
// 定義したタグをコンテナに追加
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 マクロの使い方として合っているか微妙な所なのですが、タグのハードコードや変数の用意が無くてもタグを扱えるので何らかの参考になれば幸いです。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?