Gameplay Tag は概念的なものであり、ユーザー定義の名前を持つ階層ラベルです。こうしたタグは階層レベルをいくつでも持つことが可能であり、"." 文字で区切られます。例えば 3 階層の Gameplay Tag は "Family.Genus.Species" という形式になります。"Family" は階層で最も広い範囲の識別子であり、"Species" が最も限定的なものになります。"Family.Genus.Species" の存在は、 "Family.Genus" と "Family" Gameplay のタグも存在することを暗に示しています。個々のタグは軽量であり、型 FGameplayTag
を使用します。ゲーム オブジェクトは複数のタグを持つことが多いため、Gameplay Tag Container (型 FGameplayTagContainer
を使用) が用意されており、様々なクエリーを追加で処理することができます。Gameplay Tag (またはGameplay Tag Container) を任意のプロジェクトに追加してオブジェクトを概念的なラベルに関連付けます。次にこれを使ってプロジェクトでこれらを (必要に応じて) 特定、マッチング、分類、フィルタリングします。
Gameplay Tag の作成
エンジンに認識させるために Gameplay Tag をベースとなるタグ辞書に追加しなければなりません。これはエディタの機能を使って次の 3 種類の方法で行うことができます。
- タグを手動で [Project Settings (プロジェクト設定)] メニューに追加または削除する
- 「GameplayTags」フォルダで .ini ファイルを作成または編集する
- データ テーブル アセットを作成する
こうした 3 種類の方法は、[Project Settings] で [Project] セクションの [Gameplay Tag] を開いてセットアップします。

手動でタグを追加する
Gameplay Tag を追加する最も簡単な方法は [Project Settings] メニューで手入力するやり方です。[Import Tags From Config] オプションにチェックを入れると、Config/DefaultGameplayTags.ini
がロードされます。Config/Tags
パスの.ini ファイルにあるすべてのゲームプレイ タグもロードされます。[Add New Gameplay Tag] とラベル付けされたオプションが表示されます。このオプションを使って新規ゲームプレイ タグをデフォルト ファイルを含む既存の Gameplay Tag .ini ファイルに追加します。このように追加されたタグには、短い説明を入力するオプション欄があります。これは、エディタでツールチップとして表示されます。

.ini ファイルを直接編集する
.ini ファイルを使ってタグを追加するには [Import Tags From Config] オプションを有効にしなければなりません。プロジェクトの Config/Tags/
パスにある各 .ini ファイルから Gameplay Tag がロードされ、手作業で簡単に編集することができます。エディタ実行中にこうした編集が加えられると、Import Tags From Config オプションをオフにし、オンに戻すとファイルを再ロードします。ファイル形式は次のようになります。
<code class="language-cpp">[/Script/GameplayTags.GameplayTagsList]
GameplayTagList=(Tag="Vehicle.Air.Helicopter",DevComment="This is a custom tooltip!")
GameplayTagList=(Tag="Movement.Flying",DevComment="")
GameplayTagList=(Tag="Movement.Hovering",DevComment="")
GameplayTagList=(Tag="Movement.Landing",DevComment="")</code>
これはチームのメンバーが独自のタグを追加できる便利な方法です。Config/Tags
の .ini ファイルは簡単に編集できるテキスト ファイルであり、任意のファイル命名規則に従い名前を付けることができるからです。
[Project Settings] 内の [Gameplay Tags Developer] メニューに進み "Developer Tag" config ファイルを使用し、お好みのファイル名を Developer Config Name に入力します。有効にすると、デフォルトの .ini ファイルに自分で追加したすべてのタグを指定した .ini ファイルに保存します。.ini ファイルは Config/Tags
フォルダにあり、他のデベロッパーに渡したり、さらに修正を加えることなくソース コントロール システムにサブミットすることができます。これは非常に多くのタグを持つ大規模プロジェクトで役立ちます。あるいは、特定のデベロッパーが作成したタグや特定のゲーム機能で使用するタグを区別する手段として役立ちます。これは全くのオプションですが、特定のタグを別個のファイルに保存する一部のチームやワークフローで役立つでしょう。
Data Table アセット
最後に行の型が GameplayTagTableRow
の データ テーブル アセットを介してタグを追加することができます。これは Excel のスプレッドシート ファイルなどの外部ソースから Gameplay Tag をインポートする際に特に便利です。しかし、インポートするファイルがなくても独自のものを作成してインエディタで作業することができます。アセットを作成したらそれを [Project Settings] メニューの [GameplayTagTableList] に追加し、その中に入っているすべてのタグが [Gameplay Tag Manager] に追加されます。このシステムでは、リストされている複数アセットに対応します。そのため、ワークフローや整理に役立つならば、プロジェクトのタグを複数のスプレッド シートに分けることもできます。

Data Table アセットは .ini ファイルではなく Unreal Engine のアセットを使用します。他のゲーム アセットと同様にエディタ実行中に表示したり、変更することができます。
Gameplay Tag を管理する
Gameplay Tag を追加後、それらに対する参照を検索、削除、名前変更して管理することができます。こうした操作をするには、[Project Settings] メニューでタグのとなりにある下向き三角のドロップダウンを使用します。タグは ini ファイルで追加した場合に限り (手作業で編集または Project Settings メニューから追加)、このメニューから削除可能であり、他のものから参照されません。名前変更したタグは、GameplayTagRedirects リストに入り、名前変更したタグがあればロード中にサイレント修正されます。

Gameplay Tag は下向き三角のドロップダウンから [Project Settings (プロジェクト設定)] で編集することができます。
Gameplay Tag 編集の制限
Gameplay Tag Editor は階層のすべてのレベルにおいて、ユーザーの権限リストに基づいてゲームプレイ タグの編集を制限します。Gameplay Tag の編集制限を使用するには、[Project Settings (プロジェクト設定)] > [GameplayTags] を選択し、 [Advanced Gameplay Tags (Gameplay Tags の詳細)] 階層を展開します。Gameplay Tag 一式に編集を制限するには、まず "DefaultGameplayTags.ini" ではなく、タグを格納する .ini ファイルを選択しなければなりません。編集をする場合にユーザーが誰に連絡すべきか分かるようにタグのオーナーも指定します。最後に、Gameplay Tag 自体を、リストにいないユーザーは子の追加ができるかどうかをチェックボックスで示す Restricted Tag List に追加できるようになります。(リスト化されたオーナーを除く) ユーザーが Restricted Tag List の編集を試みると、オーナーから許可を得ているかをユーザーに確認する警告がポップアップ表示されます。ユーザーが [Yes] を選択しなければ編集は行われません。

制限された Gameplay Tags を追加するインターフェース。チェックボックスでユーバーが子タグの追加権限があるかを示します。
ユーザー (リストに載っているオーナー以外) が Restricted Tag List の修正を試みると警告が表示されます。

*Restricted Tag List を所有しないユーザーが編集を行おうとすると警告/確認ウィンドウが表示されます。
*Restricted Tag List を設定すると、通常の Gameplay Tag List に制限された Gameplay Tags を含みます。ただし、制限されたタグにはキャレット ドロップダウンに「名前変更」または「削除」オプションは含まれず、[+] ボタンは Restricted Tag List のボックスにチェックを入れたタグの隣にのみ表示されます。

標準の Gameplay Tag List には現在のユーザーが所有しない制限されたタグ用の [+] ボタンは含まれません。

Restricted Tag List で作成されたタグはすべてキャレット メニューに検索オプションのみを含みます。「名前変更」と「削除」オプションは利用できません。
現在、一度作された制限されたタグは、エディタで削除することはできません (Restricted Tag List の中でさえも) が、.ini ファイルで削除できます。以下はこの例で使用された制限されたタグに対応する「RestrictedTags.ini」ファイルです。タグの入力が適切であれば、このファイルからタグを削除することは、行の削除と同じくらいシンプルです。
[/Script/GameplayTags.RestrictedGameplayTagsList]
RestrictedGameplayTagList=(bAllowNonRestrictedChildren=False,Tag="RestrictedDesignTags",DevComment="These tags are controlled by the design lead")
RestrictedGameplayTagList=(bAllowNonRestrictedChildren=False,Tag="RestrictedDesignTags.MajorTags",DevComment="These are restricted.")
RestrictedGameplayTagList=(bAllowNonRestrictedChildren=True,Tag="RestrictedDesignTags.MajorTags.EditableTags",DevComment="This is not restricted, unlike its parent.")
RestrictedGameplayTagList=(bAllowNonRestrictedChildren=True,Tag="RestrictedDesignTags.MinorTags",DevComment="These are not restricted.")
RestrictedGameplayTagList=(bAllowNonRestrictedChildren=False,Tag="RestrictedDesignTags.MinorTags.Special",DevComment="This is restricted, unlike its parent.")
Gameplay Tag のテスト演算
テスト演算は多数ありますが、そのすべてはタグを他のタグにマッチングさせるという概念に基づいています。これは、Gameplay Tag と Gameplay Tag Container で行うことができます。こうした関数はそれぞれ、Gameplay Tag または Gameplay Tag Container と呼ばれ、単独のGameplay Tag または Gameplay Tag Container をパラメータとして取ります。
以下の表は、タグとタグ コンテナで利用可能な演算の詳細です。この表ではフォーマット、"A.1" は単独の Gameplay Tag を表します。 "{A.1}" は Gameplay Tag Container の一部である同じタグを表しています。複数のタグを持つコンテナは、"{A.1, B.1}" というフォーマットになります。
ソース | 関数/演算 | 入力パラメータ | 戻り値 |
---|---|---|---|
A.1 | MatchesTag | A | true |
A.1 | MatchesTagExact (or ==) | A | false |
A.1 | MatchesAny | {A, C} | true |
A.1 | MatchesAnyExact | {A, C} | false |
A.1 | MatchesAll | {A} | true |
A.1 | MatchesAllExact | {A} | false |
{A.1, B.1} | HasTag | A | true |
{A.1, B.1} | HasTagExact | A | false |
{A.1, B.1} | HasAny | {A, C} | true |
{A.1, B.1} | HasAnyExact | {A, C} | false |
{A.1, B.1} | HasAll | {A, B} | true |
{A.1, B.1} | HasAllExact | {A, B} | false |
空すなわちデフォルトの Gameplay Tag Container を入力パラメータとして与えると、HasAll
、 HasAllExact
、 MatchesAll
、および MatchesAllExact
以外の全ての演算で false を戻すようになります。ソースの集合にないタグが、このパラメータのコンテナにないからです。
例えば、以下のブループリントでは、テスト アクタがゲームにスポーンされると上記の演算の一部を使って、ある Gameplay Tag Container に、TestTag.One
または TestTag.Three
のいずれかがあるかを検出しますが、両方のタグは検出せず、TestTag.Two
も検出しません。ここではテスト目的のためにブループリントのリテラル コンテナ値を使いますが、アクタのコンテナに対してブループリント (または C++) の変数を使います。
クリックして拡大表示。
Gameplay Tag のクエリー
Gameplay Tag コンテナの一部のクエリーのタイプは、Gameplay Tag Query 変数に格納してデータ駆動にし、ひとつの変数やコードの一部を編集する必要なく多くの場所で実行し、スピードアップすることができます。Gameplay Tag のクエリーは以下の 3 種類の基本テストに限定されます。
- Any Tags Match はクエリーのタグが最低 1 つコンテナで見つかれば成功です。
- All Tags Match は、クエリーのタグでコンテナでも見つからなかったものがない場合に成功します。 これには、クエリーにタグが何もない場合も含まれます。
- No Tags Match は、クエリーのタグでコンテナで見つかったものがない場合、成功です。これには、クエリーにタグが全く存在しない場合が含まれます。
ただし、こうしたテストは 3 つの大きな表現式を組み合わせてテストすることもできます。それぞれ、追加の表現式やテストの配列を含みます。
- Any Expressions Match は、その部分式やテストが成功すれば成功です。
- All Expressions Match は、その部分式やテストがひとつも失敗しない場合に成功になります。 これには部分式やテストがクエリーに全く存在しない場合を含みます。
- No Expressions Match は、その部分式やテストがひとつも成功しない場合に成功になります。 これには部分式やテストがクエリーに全く存在しない場合を含みます。
上記の 3 種類のテストは、上の演算の表の「完全一致」を表しています。
上記のテスト サンプル、TestTag.One
または TestTag.Three
のいずれかひとつ (両方はだめ) はソース コンテナに入っていて、TestTag.Two
はコンテナに入っていないことを求めることを、ひとつの Gameplay Tag Query を使って再現することができます。このテストでは、リテラル値もサポートしますが、ブループリント (または C++) の変数だけを使います。以下はテスト クエリーの変数です。

このクエリーをセットアップした状態で、以下のようにテストアクタのブループリントで Gameplay Tag Container を評価することができます。
クリックして拡大表示。
ゲームで Gameplay Tags を使用する
作成したタグをゲーム内のオブジェクトに適用するには、Gameplay Tag (C++ 型 FGameplayTag
) または Gameplay Tag Container (C++ 型 FGameplayTagContainer
) のプロパティをオブジェクトに追加します。Gameplay Tag Queries (C++ 型 FGameplayTagQuery
) を必要に応じてオブジェクトに追加するか、ブループリントまたは C++ コードで直接タグ演算を使用することができます。こうしたプロパティを追加したら、他の変数と同様にコードまたはエディタで編集することができます。
C++ で Gameplay Tag に迅速にアクセスする
IGameplayTagAssetInterface
は C++ で実装可能です。実装し、GetOwnedGameplayTags
関数をオーバーライドすると、ブループリントで、そのオブジェクトに関連するタグを Gameplay Tag Container に入れられるようになります。ほとんどの場合、これは単に基底クラスから新規コンテナにタグをコピーすることを意味しますが、クラスを実装すると複数のコンテナからタグを集めて、ブループリントの関数を呼び出してブループリントで宣言したタグにアクセスしたり、オブジェクトが必要とすることを行います。このインタフェースのメリットは標準化された方法で多様な異なるオブジェクトの型とインタラクションできるようにし、明示的にオブジェクトをキャストせずにオブジェクトのタグを取得することができます。次に各型に対してカスタム コードを記述し、正しいタグ変数を取得します。これは大規模プロジェクトで役立ちます。 (再現が難しい) バグの回避や、コードをクリーンにし高速化し、容易に維持管理できるようにします。