はじめに
Unreal Engine (UE) Advent Calendar 2025 の14日目の記事です!
この記事では Gameplay Ability の発動方法を調べてまとめてみました。
この記事での環境は以下の通りです。
- Windows 11
- UE 5.7.1(ランチャー版)
Ability System Component のノード
早速、Gameplay Ability の発動方法を解説します。
まずは UAbilitySystemComponent で定義されている関数から解説します。
Give Ability And Activate Once
まずは Give Ability And Activate Once についてです。
このノードはその名前の通り、アビリティの付与と発動を同時に行います。
付与&発動したいアビリティはクラス(TSubclassOf<UGameplayAbility>)で渡します。
戻り値の型は Gameplay Ability Spec Handle です。

公式ドキュメントやそのノードのコメントには以下のように書かれています。
Grants a Gameplay Ability, activates it once, and removes it.
Give Ability And Activate Once
これを和訳すると「Gameplay Ability を付与して一度だけ発動させ、その後に取り除く。」となります。
このコメントの通り、Give Ability And Activate Once はアビリティを付与すると同時にそれを発動させ、アビリティの発動が完了した後はそれを取り除きます。
なので例えばアビリティと、それを所有するアクタで以下のような処理を組んだとします。
まず、アビリティ側ではそのアビリティの発動直後に「Activate Ability」と表示して一定時間待機後、「End Ability」と表示して End Ability を呼び出しています。

そのアビリティを所有するアクタでは(原始的な方法ですが、)自身がそのアビリティを持っているかどうかを Tick() で毎フレーム確認しています。
自身がそのアビリティを持っているなら「has ability」、持っていないなら「does not have ability」と表示されます。

この状態でゲームを実行して、Give Ability And Activate Once でアビリティを付与&発動してみました。
Give Ability And Activate Once する前は「does not have ability」と表示され続けていましたが、Give Ability And Activate Once した後は「Activate Ability」と表示され、以降は「has ability」と表示され続けました。
「End Ability」と表示されてアビリティが終了した後は再び「does not have ability」と表示され続けました。
≀
does not have ability
Activate Ability
has ability
≀
has ability
End Ability
does not have ability
≀
アビリティ発動中は、そのアクタはそのアビリティを所有していますが、そのアビリティが終了するとそのアクタはアビリティを所有しなくなった(取り除かれた)ことがわかります。
このような特徴から、「このアビリティはそのアクタにずっと持っていてほしいわけじゃないけど、必要になった時に付与して使い捨てたい」という場合は Give Ability And Activate Once を使用すると良いかと思います。
Try Activate Abilities by Tag
次は Try Activate Abilities by Tag についてです。
このノードはその名前の通り、そのタグと一致する発動可能なアビリティを探してそれらを発動します。
引数の型は Gameplay Tag Container で、戻り値の型は bool です。

Gameplay Tag Container は Make Gameplay Tag Container from Tag や Make Literal Gameplay Tag Container、Make Gameplay Tag Container from Array などを使って作成することができます。
これら3つのノードのうち、Make Gameplay Tag Container from Tag のみ、設定できるタグが1つだけとなっています。

アクタの所有しているアビリティがそのタグと一致するかどうかは、そのアビリティの「Class Defaults > Details > Tags > AssetTags (Default AbilityTags)」で設定したタグと比較して判断しています。

また、「Try Activate Abilities by Tag」という名前からもわかるように、このノードではそのアクタがそのタグに一致するアビリティを複数持っている場合はそれら複数のアビリティ(異なるクラスのアビリティ)を発動しようとします。
Try Activate Ability by Class
次は Try Activate Ability by Class についてです。
このノードはその名前の通り、そのクラスと一致する発動可能なアビリティを探して発動します。
引数の型は発動したいアビリティのクラス(TSubclassOf<UGameplayAbility>)で、戻り値の型は bool です。

タグではなく、クラス指定でアビリティを発動させたい場合はこちらを使用します。
試してみたところ、そのアクタが1種類のアビリティ(1つのアビリティクラス)を複数持っている場合はそれら全てが発動するようです。
Try Activate Ability
最後は Try Activate Ability についてです。
Try Activate Abilities by Tag と Try Activate Ability by Class では、場合によっては複数のアビリティを発動することがありましたが、Try Activate Ability では発動したいアビリティを Gameplay Ability Spec Handle という構造体で指定するので発動するアビリティを特定の1つだけに絞ることができます。
引数の型は Gameplay Ability Spec Handle で、戻り値の型は bool です。

Gameplay Ability Spec Handle は Give Ability などでアビリティを付与したときや、Find All Abilities with Tags などでアビリティを探したときなどに取得できます。
Ability Trigger
次は Ability Trigger によってアビリティを発動させる方法についてです。
Ability Trigger はアビリティのクラスの「Class Defaults > Details > Triggers > Ability Triggers」で設定することができます。

各要素では Trigger Tag と Trigger Source を設定できます。
さらに Trigger Source は On Gameplay Event と When Tag Is Added、When Tag Is Present の3つから選択できます。
ここからはその Trigger Source ごとに挙動や使い方の違いなどを解説します。
On Gameplay Event
まずは On Gameplay Event についてです。
これは名前の通り、Gameplay Event の受信をトリガーにアビリティを発動させることができます。
Gameplay Event は Send Gameplay Event to Actor や Send Gameplay Event などのノードを使って送信することができます。

Gameplay Event でアビリティを発動させる場合は Gameplay Event を送信する際に Event Tag 引数に渡すタグと、アビリティ側で設定する Trigger Tag を同じものにする必要があります。


また、アビリティ側での処理は ActivateAbility() ではなく、ActivateAbilityFromEvent() に追加します。
ActivateAbilityFromEvent() には Event Data という引数があり、Gameplay Event 送信時に Payload 引数に渡した Gameplay Event Data という構造体をアビリティ側で受け取れるのが特徴です。

When Tag Is Added
次は When Tag Is Added についてです。
On Gameplay Event や When Tag Is Added、When Tag Is Present などの Trigger Source は GameplayAbilityTypes.h で EGameplayAbilityTriggerSource::Type として定義されています。
その列挙子の定義部分や公式ドキュメントには以下のコメントが書かれています。
Triggered when the owner gains the specified tag. Will not cancel when the tag is removed.
EGameplayAbilityTriggerSource::Type
これを和訳すると「所有者が指定されたタグを獲得したときに発動します。タグが取り除かれてもキャンセルされません。」となります。
このコメント通り、Trigger Source を When Tag Is Added にすると、Trigger Tag に設定したものと同じタグが、そのアビリティを所有しているアクタに追加されるとそのアビリティが発動します。
アビリティの発動中にアクタからそのタグを取り除いてもアビリティの発動はキャンセルされません。
When Tag Is Present
最後は When Tag Is Present についてです。
When Tag Is Present は When Tag Is Added と似ていますが、それの定義部分や公式ドキュメントには以下のコメントが書かれています。
Triggered when the owner has the specified tag. The ability will be canceled if the tag is later removed.
EGameplayAbilityTriggerSource::Type
これを和訳すると「所有者が指定されたタグを持つときに発動します。後でタグが取り除かれた場合、このアビリティはキャンセルされます。」となります。
検証してみたところ、When Tag Is Present も When Tag Is Added と同じように、Trigger Source に設定したタグがそのアクタに追加されるとそのアビリティが発動しました。
そして、アクタからそのタグが取り除かれるとアビリティの発動がキャンセルされました。
そのアビリティを所有しているアクタが指定のタグを所有し始めたらアビリティを発動したいけど、そのタグを所有しなくなったら、その時点でそのアビリティの発動をキャンセルしたい場合は When Tag Is Present を使い、キャンセルせずにそのアビリティを最後まで実行し終えたい場合は When Tag Is Added を使うという使い分けでしょうか。
Input ID
最後は Input ID を使ってアビリティを発動させる方法についてです。
これは端的に言うとプロジェクト設定の Action Mappings で設定したアクションと、アビリティをアクタに付与する際に設定する Input ID を紐付けて、そのアクションを検知したらそのアビリティを発動させるという方法です。


ここからは Input ID によるアビリティの発動を最低限の手順で試してみます。
(ここからは C++ が登場します。)
まずは APawn を継承したクラスを作成します。
今回は「ASamplePawn」というクラス名にしました。
ヘッダーファイルのパスは「{プロジェクト名}/Source/{プロジェクト名}/Public/SamplePawn.h」にしました。
クラスの作成直後は以下のような、ほぼ空の状態になっているかと思います。
// .h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "SamplePawn.generated.h"
UCLASS()
class SAMPLE_API ASamplePawn : public APawn
{
GENERATED_BODY()
public:
ASamplePawn();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};
// .cpp
#include "SamplePawn.h"
ASamplePawn::ASamplePawn()
{
PrimaryActorTick.bCanEverTick = true;
}
void ASamplePawn::BeginPlay()
{
Super::BeginPlay();
}
void ASamplePawn::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void ASamplePawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
}
次は、後にプロジェクト設定で設定するアクションと同じ名前の列挙子を持つ列挙型を定義します。
今回は「ESampleAction」という列挙型を定義して、「SampleAction_0」と「SampleAction_1」という列挙子も定義しました。
前述の通り、ここで定義する列挙子は後にプロジェクト設定で設定するアクションの名前と一致している必要があります。
また、ここで定義した列挙型はブループリントから利用するので、UENUM() に BlueprintType を設定しておきます。
// .h
#include "GameFramework/Pawn.h"
#include "SamplePawn.generated.h"
//追加
UENUM(BlueprintType)
enum class ESampleAction : uint8
{
SampleAction_0,
SampleAction_1
};
UCLASS()
class SAMPLE_API ASamplePawn : public APawn
{
次は ASamplePawn に UAbilitySystemComponent をアタッチします。
まずはヘッダーファイルで UAbilitySystemComponent というクラスを前方宣言します。
次に UAbilitySystemComponent* 型のメンバ変数を定義します。
今回は「AbilitySystemComponent」という変数名にしました。
そのメンバ変数の UPROPERTY() には BlueprintReadOnly と VisibleAnywhere というプロパティ指定子を設定しています。
// .h
class UAbilitySystemComponent; //追加
UCLASS()
class SAMPLE_API ASamplePawn : public APawn
{
GENERATED_BODY()
public:
ASamplePawn();
protected:
virtual void BeginPlay() override;
public:
//追加
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
UAbilitySystemComponent* AbilitySystemComponent;
virtual void Tick(float DeltaTime) override;
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};
その Pawn のコンストラクタでは、UAbilitySystemComponent をインスタンス化して、そのポインタを AbilitySystemComponent 変数に代入します。
また、AbilitySystemComponent.h を include しておきます。
// .cpp
#include "SamplePawn.h"
#include "AbilitySystemComponent.h" //追加
ASamplePawn::ASamplePawn()
{
PrimaryActorTick.bCanEverTick = true;
//追加
AbilitySystemComponent = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystemComponent"));
}
次は、アビリティを発動させるためのアクションを PlayerInputComponent(UInputComponent)にバインドするという処理を SetupPlayerInputComponent() に追加します。
以下のコードでは EnumPath というローカル変数を定義するときに「/Script/Sample.ESampleAction」という文字列を渡していますが、ここでの「Sample」はプロジェクト名、「ESampleAction」は先ほど定義した列挙型の名前です。
void ASamplePawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
const FTopLevelAssetPath EnumPath(TEXT("/Script/Sample.ESampleAction"));
const FGameplayAbilityInputBinds GameplayAbilityInputBinds(TEXT("ConfirmTargeting"), TEXT("CancelTargeting"), EnumPath);
AbilitySystemComponent->BindAbilityActivationToInputComponent(PlayerInputComponent, GameplayAbilityInputBinds);
}
BeginPlay() や Tick() は空のままで大丈夫です。
C++ でのコーディングはこれで以上です。
ここまで書けたらビルドしてプロジェクトを開きます。
UGameplayAbility を親クラスとする Gameplay Ability Blueprint を2つ作成します。
今回はこれらの Gameplay Ability Blueprint を「GA_Sample_0」と「GA_Sample_1」という名前にしました。
それぞれの ActivateAbility() では「Activate {アビリティ名}」と表示するという処理を追加しました。
AssetTags や Ability Triggers などは何も設定していません。


先ほど作成した Pawn を親クラスとするブループリントを作成します。
先ほど作成した2つのアビリティを Give Ability でその Pawn に付与するという処理を BeginPlay() に追加します。
Give Ability の Input ID 引数には、先ほど定義した列挙型の列挙子を整数型に変換して渡します。
今回、GA_Sample_0 には SampleAction_0 を、GA_Sample_1 には SampleAction_1 を指定しました。

最後は「Edit > Project Settings… > Engine > Input > Bindings > Action Mappings」にアクションを追加します。
アクションの名前は、先ほど定義した列挙型の列挙子の名前と一致させます。
今回は「SampleAction_0」と「SampleAction_1」というアクションを作成して、0 キーと 1 キーを設定しました。

ここまでできたら、先ほど作成した Pawn を GameMode の Default Pawn Class に設定してゲームを実行します。
今回の例では 0 キーを押すと「Activate GA_Sample_0」、1 キーを押すと「Activate GA_Sample_1」と表示されました。

Input ID 経由で設定したアクションによってアビリティを発動できていることがわかります。
最後に
参考
- Unreal Engine でのゲームプレイ アビリティの使用
- Give Ability And Activate Once
- EGameplayAbilityTriggerSource::Type
- 『野狗子: Slitterhead』の開発事例【UNREAL FEST 2024 TOKYO】
- GAS最初の60分「7. Introduction to Targeted Abilities(ターゲットアビリティの紹介)」
- GASDocumentation

