ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【UE5】〈Tips〉列挙型の代わりにGameplayTagで管理したら便利だった話

目次

 

はじめに

Unreal Engine 5 における GameplayTag は、単なるアビリティシステムの一部ではなく、列挙型よりも柔軟かつ拡張性の高い識別・分類手段として、BlueprintやC++を横断した幅広い用途に活用できます。

この記事ではGameplayTag をユニークなキーとして活用する設計アイデアとその利点を解説します。

BPのみのプロジェクトでも利用可能です。

 

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

 

UE5.4.4で解説します。

 

解説

① 簡単な使い方の解説

GameplayTagの追加

プロジェクト設定->GameplayTagsの項目を表示

 

ゲームプレイタグを管理をクリック

 

ゲームプレイタグマネージャーが開きます。

タグの追加はプラスアイコンから...

 

Tagの名前、タグの追加先のソースを設定して、新しいタグを追加を押して完了。

 

階層構造も作れます。

親にしたいタグの右のアイコンからサブタグを追加...

 

もしくは、既存のタグに” . ”で区切ることで階層化できます。

 

こんな感じで設定してみました。これにて定義は完了です。

 

GameplayTagの利用 - 単一タグの指定

定義が終わったら実際に利用してみましょう。

BPの新規作成->アクタを作ってみます。

 

B_SampleGameplayTagActorという名前にしました。

 

変数の追加から...

 

GameplayTag型の変数Tagを追加します。

 

コンパイル後このようにタグ専用のUIで一つを選ぶことができます。

 

GameplayTagの利用 - 複数タグの指定

変数の追加からGameplayTagContainer型のTagContainerを追加します。

 

コンパイル後、値を設定するとこのように複数のタグを指定することができます。

 

GameplayTagの利用 - タグの制限

C++限定の機能になってしまいますが、

GameplayTag型のプロパティで表示する項目を制限することができます。

 

SampleGameplayTagActorBaseというアクタを継承したクラスを作成します。

 

以下のようにプロパティを追加しました。

#pragma once

#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "GameFramework/Actor.h"
#include "SampleGameplayTagActorBase.generated.h"

UCLASS()
class BLOGSAMPLE_API ASampleGameplayTagActorBase : public AActor
{
GENERATED_BODY()

public:
// Sets default values for this actor's properties
ASampleGameplayTagActorBase();

// GamePlay Tag
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Tags",
meta = (Categories = "BlagSampleTags.PiyoPiyoSystem"))
FGameplayTag Tag;

// Gameplay Tag Container
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Tags",
meta = (Categories = "BlagSampleTags.PiyoPiyoSystem"))
FGameplayTagContainer GameplayTagContainer;

protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;

public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};

 

このように書くことでエディタで表示する階層を制限して意図しない階層を表示しないようにすることができます。

meta = (Categories = "BlagSampleTags.PiyoPiyoSystem")

 

C++でGameplayTagを使う場合はBuild.csにモジュールの追加をお忘れなく...

PublicDependencyModuleNames.AddRange(new string[]
{
....
"GameplayTags" // 追加
});

 

これを継承したBPアクタを作成すること...

 

PiyoPiyoSystemの階層しか表示されなくなって便利になりました。

 

② 列挙型(Enum)の代替としての活用

列挙型は静的で変更が難しく、Blueprint 上での柔軟な運用に制限があります。

特にBP製のEnumは破損するとBPアクタ自体が見えない変数で壊れるケースにたびたび見舞われたので避けたいところです。

 

かといって文字列として扱うにもタイポが怖い。

 

そのようなケースにおいて代わりに GameplayTag を使うことで、データドリブンかつ動的な拡張性を得ることができます。

 

インスタンス編集可能にして公開しておくとレベル上で個別にTagを指定することができます。
この時の操作性はEnumの代替に成り得ます。

 

 ③ MatchTags / HasTag 機能による柔軟な分岐処理

GameplayTagには専用の分岐ノードが存在します。

Enumとの大きな違いとして、GameplayTag は 階層構造 を持ちます。

そのため親子関係によるマッチングで、細かいロジックをシンプルに記述できます。

 

他にもGameplayTagQueryを利用することで、高度な条件を変数として取りまわすこともできます。

 

外部の参照からTagを取得してコンテナに追加したり、削除したりもできます。

 

④ TMapとの合わせ技

TMap<FGameplayTag, ValueType> を使うことで、拡張性・柔軟性に優れたキー管理と検索機能もおすすめです。

種類が決まっているようなケースではGameplayTagを用いて、管理Subsystemなどで起動時にクラスで収集/Tagとアクタのマップで管理をよく利用します。

 

 

⑤ その他便利機能

分岐に便利 Switch on GameplayTag

 

デバッグに便利 Get Tag ~ /  Get Debug ~

 

TagContainerの分解 Break Gameplay Tag Container

 

参照されているTagを探したい Tagの参照検索

 

最後に

今回は列挙型の代わりにGameplayTagで管理したら便利だった話について解説しました。設計の幅が広がるアプローチなので活用してみてはいかがでしょうか。


UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやX(Twitter)のフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる