ささみのメモ帳

ゲーム会社で働く、無能プログラマーが自分のためのメモ帳として利用しています。

UEのGASのAbilityについてのメモ

Ability(GameplayAbility)とは

UnrealEngineのGASの機能の一つで、技・行動等の内容定義
効果の生存時間、効果内容の適用タイミング、タグの付与、攻撃等のイベント発生の内容を定義をする
GameplayAbility(UGameplayAbility)クラスをベースとして作る
公式リファレンス

設定項目は以下の要素がある(C++での定義例あり)
※ver UE 5.3

項目名 定義内容
Tags アビリティを実行する上での依存するTag
Input アビリティの実行タイミング
Advanced アビリティの実行方法
Costs アビリティ実行による消費
Triggers アビリティ実行を紐づけるトリガー
Cooldown 次のアビリティ実行可能までの待機

Tags

Ability Tags

アビリティ自体に付与されるタグ

Cancel Abilities With Tag

該当のタグを持つすべてのアクティブなアビリティを中断

Block Abilities With Tag

このアビリティがアクティブな間、該当のタグを持つすべてのアビリティを実行させない

Activation Owned Tags

アビリティがアクティブな間、アビリティ所有者に適用されるタグ

Activation Required Tags

該当のタグを持つアビリティがアクティブな場合、このアビリティを実行する

Activation Blocked Tags

該当のタグを持つアビリティがアクティブな場合、このアビリティを実行しない

Source Required Tags

発動者が該当のタグを持つ場合、このアビリティを実行する

Source Blocked Tags

発動者が該当のタグを持つ場合、このアビリティを実行しない

Target Required Tags

適用者が該当のタグを持つ場合、このアビリティを実行する

Target Blocked Tags

適用者が該当のタグを持つ場合、このアビリティを実行しない

AbilityTags.AddTag([Tag]);
CancelAbilitiesWithTag.AddTag([Tag]);
BlockAbilitiesWithTag.AddTag([Tag]);
ActivationOwnedTags.AddTag([Tag]);
ActivationRequiredTags.AddTag([Tag]);
ActivationBlockedTags.AddTag([Tag]);
SourceRequiredTags.AddTag([Tag]);
SourceBlockedTags.AddTag([Tag]);
TargetRequiredTags.AddTag([Tag]);
TargetBlockedTags.AddTag([Tag]);

Input

Replicate Input Directly

直接サーバー側に入力と同時にアビリティ実行処理を行う。
通常入力を受けて、ローカルで処理を行った後にサーバーへの処理に移行するが、
これにより並行して処理することができ、通信下での遅延が減る。ただ、処理コストは増える

bReplicateInputDirectly = true;

Advanced

Replicate Policy

アビリティの実行処理同期設定
アビリティ実行をサーバー側(他プレイヤー)でも行う

項目名 内容
Do Not Replicate サーバーに同期しない。
コード上では、EGameplayAbilityReplicationPolicy::ReplicateNo
Replicate サーバーに同期する。
コード上では、EGameplayAbilityReplicationPolicy::ReplicateYes

Instancing Policy

アビリティのインスタンス(生成、破棄)設定

項目名 内容
Non Instanced アビリティの種類単位で同一のアビリティデータを共有。
メモリ効率が良いが、アビリティの状態を個別で管理できない。
Instanced Per Actor 各アクター(キャラクターなど)ごとに一度だけインスタンス化される。
各アクター単位でアビリティの状態管理ができる。
Instanced Per Execution アビリティ実行単位でインスタンス化される。
メモリ効率が悪いが、各実行単位でアビリティの状態管理ができ、同じアビリティを同時に複数回実行することが可能。

Server Respects Remote Ability Cancellation

クライアントのアビリティキャンセルをサーバー側も同期してキャンセルを行う

Retrigger Instanced Ability

アクティブなアビリティを再度発動可能(再使用速度の向上)にする

Net Executeion Policy

アビリティの実行がクライアント、サーバーでどのように処理されるかの設定
クライアント寄りだと、データの一貫性が保ちにくくなるが遅延が少ない。
サーバー寄りだと、データの一貫性が保ちやすいが遅延が多くなる。

項目名 内容
Local Predicated アビリティはクライアントで予測的に実行する。
その後サーバーによる確認が行われて、一貫性を保つ。
Local Only アビリティはクライアントでのみ実行され、サーバー(他プレイヤー)には影響を与えない。
Server Initiated アビリティはサーバーによって実行する。
サーバーがアビリティのトリガーを管理しつつ、クライアント側でのレスポンスも許可する。
※実行はクライアントでも行われる可能性がある。
Server Only アビリティはサーバーでのみ実行され、その後クライアントに結果を同期する。

Net Security Policy

アビリティのクライアント、サーバーでの実行、同期制御内容の設定

項目名 内容
Client Or Server アビリティ実行やキャンセルがクライアントとサーバーのどちらからでも可能。
不正行為やエラーに対して脆弱になる可能性がある。
Server Only Execution サーバー側でのみアビリティ実行可能。
結果をクライアントに同期、データの整合性を保つ。
Server Only Termination アビリティ実行はサーバーから開始し、その後の処理がクライアントで行われる。
サーバーのオーソリティとクライアントのレスポンス性をバランス良く行う。
Server Only サーバー側でのみアビリティ実行可能。
結果はクライアントに同期されず、サーバー側でのみ持つ。データの整合性。

ReplicationPolicy = EGameplayAbilityReplicationPolicy::ReplicateYes;
InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerActor;
bServerRespectsRemoteAbilityCancellation = true;
bRetriggerInstancedAbility = true;
NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::LocalPredicted;
NetSecurityPolicy = EGameplayAbilityNetSecurityPolicy::ClientOrServer;

Costs

Cost Gameplay Effect Class

アビリティの消費(コスト)のGmeplayEffect

CostGameplayEffectClass = [TSubclassOf<UGameplayEffect>];

Triggers

Ability Triggers

Trigger Tag
トリガータグ。このタグをもとにほかのアビリティを実行。

Trigger Source
トリガー、実行の条件。

項目名 内容
Gameplay Event 指定されたタグがEventTagのGameplayEvent(FGameplayEventData)の実行でトリガー
Owned Tag Added 指定されたタグが対象に新たに追加された瞬間にトリガー
Owned Tag Present 指定されたタグが対象に存在している場合、トリガー、実行可能

※Source Required TagsとOwned Tag Presentは似ているが、
Sourceはアビリティを所持しているActor本体がそのタグを持っているか(武器、防具等) Owned Tag Presentはアビリティを所持しているActorのOwnerがそのタグを所持しているか(武器、防具の使用者等) というタグ所持の確認する対象の違いがある。

FAbilityTriggerData TriggerData;
TriggerData.TriggerTag = [Tag];
TriggerData.TriggerSource = EGameplayAbilityTriggerSource::GameplayEvent;
AbilityTriggers.Add(TriggerData);

Cooldown

Cooldown Gameplay Effect Class

アビリティの再使用までの待機(クールタイム)のGmeplayEffect

CooldownGameplayEffectClass = [TSubclassOf<UGameplayEffect>];