【UE4】Gameplay Ability System を使い始めたい人向けの情報
Gameplay Ability System
(以降 GAS と略します) を使い始めたい人に向けて、以下をまとめたものです。
なお、このドキュメント内で GAS のすべての機能の網羅はしません。
GAS は多機能なため、網羅しようとするとドキュメントが大きくなりすぎるためです。
詳細はリンク先のドキュメントに譲りますので各リンク先を参照ください。
GAS のクラスごとの機能 は 200 行程度で概要をまとめております。
公式ドキュメント等のボリュームに圧倒されてしまった方は、先にこちらを読んで頂くと理解の助けになるかもしれません。
Index
参考リンク
参考リンク:公式
Gameplay Ability System の公式ドキュメント
- Unreal Engine 4.27 Documentation > インタラクティブな体験をつくりだす > ゲームプレイ アビリティ システム
- Unreal Engine 4.27 Documentation > インタラクティブな体験をつくりだす > ゲームプレイ アビリティ システム > ゲームプレイ アビリティ
- Unreal Engine 4.27 Documentation > インタラクティブな体験をつくりだす > ゲームプレイ アビリティ システム > ゲームプレイ アトリビュートとゲームプレイ エフェクト
- Unreal Engine 4.27 Documentation > インタラクティブな体験をつくりだす > ゲームプレイ アビリティ システム > アビリティ タスク
キーとなる機能の説明がまとまっています。
GAS を利用してどういった事が可能なのかを知りたいならば、最初にこちらを読むと良いです。
具体的な実装方法は書かれていません。
実例が知りたい場合は ActionRPG や GASDocumentation/GASShooter を見ると良いです。
GameplayPrediction.h
GameplayPrediction.h は Unreal Engine 内のヘッダファイルで、 GAS の Prediction (予測)の設計思想について書かれています。
上記のリンクはそのコメント部分の引用です。
あなたが GAS を試用してみた結果これを気に入り、これ利用してネットワークゲームを作成し、 Prediction (予測)の恩恵を受けたいと考えるかもしれません。
もしそうならば、ゲームの設計の前にこちらの内容を把握しおくとスムーズに進められるかもしれません。
ActionRPG
- UE マーケットプレイス > Action RPG
- Unreal Engine 4.27 Documentation > サンプルとチュートリアル > サンプル ゲーム プロジェクト > Action RPG Game サンプル プロジェクト
- Unreal Engine 4.27 Documentation > サンプルとチュートリアル > サンプル ゲーム プロジェクト > Action RPG Game サンプル プロジェクト > Action RPG のゲームプレイ アビリティ
Epic によるサンプルプロジェクトで、 マーケットプレイスで無料でダウンロード可能です。
また、このプロジェクトに関するドキュメントが Epic の公式ページにも存在します。
このサンプルは取り扱うトピックが広く、 GAS に特化したサンプルではありません。
シングルプレイ のサンプルなため、マルチプレイに流用する際は注意が必要です。
A Guided Tour of Gameplay Abilities | Inside Unreal
2022/03/29追記:
Epic による公式チャンネルで定期的に放送されている「 Inside Unreal 」の 2021/01/15 にライブ配信された GAS を取り上げた時のアーカイブです。
内容的には名前の通りガイドツアーであり、他のドキュメントを一通り把握している方からすれば目新しいものはあまりないと思います。
3時間超えですが、文章より動画のほうが好きな世代であれば視聴してみると良いです。
日本語字幕が自動生成ではなくちゃんと翻訳されているものなので英語が苦手な人でも大丈夫だと思います。
字幕をダウンロードしてまとめたものを ここ に置いておきました。
視聴する必要があるかの判断材料になるかもしれませんので、ざっくり内容を知りたいのであればどうぞ。
動画では多少のライブコーディングもあるので、字幕だけ読んでもよくわからない部分もあると思います。
講師を努めている Michael Prinke氏自体が動画内で以下のように述べています。
私はこのシステムを 教えようとしている人たちと一緒に このシステムを学んでいるので 見逃していることがたくさんあるかもしれないという ことを 改めて注意してください
氏がシステムを完全に理解しているわけではないというのを念頭に視聴する必要があります。
動画中に、 GAS の新しいドキュメントを数ヶ月でリリースするとありましたが、その後どうなったのかはちょっとわからないです。
概要欄にあるフォーラムへのリンクも目を通すと良いです。
参考リンク:非公式
GAS Companion
Mickael Daniel 氏が作成している、GAS を扱いやすくするためのプラグインです。
セットアップの手間がかかる部分をウィザード化していたり、 HUD に関する機能など、導入の助けになるであろう機能が盛りだくさんで入っています。
note: 面白い機能として、アビリティのキューシステムがあります。
これは、あるアビリティを実行中に別のアビリティの起動がブロックされた場合、実行中のアビリティが終了した段階でブロックされたアビリティの起動を再度試みる機能です。
これを利用することで、いわゆる先行入力のようなことを実現することができます。
導入手順や API リファレンス もあり、こちらもシンプルな英語なので読みやすいです。
また、動画もあるので利用しやすそうです。
※私は利用していないので詳細は不明です。
GASDocumentation/GASShooter
tranek 氏が作成している、 GAS を使用したマルチプレイのサンプルプロジェクト付きのドキュメントです。
GASDocumentation は詳細なドキュメントと、実例のためのサンプルプロジェクトのような形となっています。
GASShooter はシューターゲームでよく使われるであろう銃器の実装などが含まれます。
ActionRPG と比較すると、こちらは基本的に GAS に関することを主に実装しています。
そのため、 GAS のことだけ知りたいのであればこちらのほうがわかりやすいです。
その他の解説
- Qiita
- 検索すれば出てきますので割愛します。
- ヒストリア様のブログ
- こちらも検索すれば出てきますので割愛します。
- Discoard
- Unreal Slackers サーバーに gameplay-ability-system というスレッドがあります。
- 助けが必要ならばここで質問しても良いかもしれません。英語ですが。
2021/12/08追記:
-
FutureSoftware UnrealEngine Study BLOG
- 「GAS入門」というシリーズの記事があります。
- Third Person Template にプレーンの GAS コンポーネントを利用するというシンプルな構成で導入方法が解説されています。
- Pantong51/GASContent
2021/12/17追記:
- GameplayAbilities and You
-
spencer-melnick/Threshold
- spencer-melnick 氏による GAS を使った個人制作のアクションゲームのプロジェクト(らしい)です。
- FGameplayAbilityTargetData のサブクラスを作り、独自データをもたせ、後で取り出す実例があります。
- TargetDataTypes.h や TargetDataTypes.cpp や CharacterDodge.cpp や AbilityFunctionLibrary.h あたり。
- FGameplayAbilityTargetData のサブクラスに FVector をもたせ、クライアントからサーバーへ送り、 FVector を取り出しています。
- これらを見れば、好きなデータを SendGameplayEventToActor の Payload に乗せて送る方法がわかると思います。
- (この部分の実例はあまり他で見かけないので追記しました)
GAS のクラスごとの機能
GAS の各クラスが何を行うものかを大まかにまとめておきます。
AbilitySystemComponent
C++ でいうところの UAbilitySystemComponent 及びプロジェクト毎の派生クラスのことです。
Pawn や PlayerState や Actor 派生クラスに所有させる、 GAS に関連する機能を相互にやり取りできるようにするためのコンポーネントです。
ここに AttributeSet を登録したり、 GameplayAbility を与えたり、与えた GameplayAbility を起動したり、 GameplayEffect を適用したりすることで、ゲーム固有の様々な状態やアビリティを表現します。
詳細: 「GASDocumentation 和訳」の「4.1 Ability System Component」
GameplayTag
C++ でいうところの FGameplayTag のことです。
Unreal Editor のプロジェクト設定で編集可能な、階層的な名前(Game.Play.Tag
のように .
で階層分け可能な名前)で表現される識別用のデータです。
アビリティ起動時の条件だったり、装飾的な演出の識別用だったり、ゲーム固有の状態用だったり、アビリティ処理内の一時的な変数の識別用だったりと、用途は多岐にわたります。
-
GameplayAbility の起動の許可や抑制等
- 例:スタン中はスキルを起動できないようにしたい
- スキル用の GameplayAbility の ActivationBlockTags に
CC.Stun
を設定する、など
- スキル用の GameplayAbility の ActivationBlockTags に
- 例:スタン中はスキルを起動できないようにしたい
- キャラクター等にゲーム特有の状態を付与
- 例:スタン
- GrantedTags に
CC.Stun
を設定した GameplayEffect をキャラクター(が所有する AbilitySystemComponent)に適用する、など - GAS の管理外のことを行う場合は、独自の実装を行う。
- スタン中に移動できなくしたい場合は、独自の CharacterMovementComponent 派生クラスを用意し、
CC.Stun
が付与されている間は移動速度を 0 にする、など
- スタン中に移動できなくしたい場合は、独自の CharacterMovementComponent 派生クラスを用意し、
- GrantedTags に
- 例:スタン
- 装飾的な演出の適用
- 例:スタン中に専用エフェクトの再生
- GamaplayCueTag に
GameplayCue.Character.CC.Stun
を設定した GameplayCue アセットを作成し、GameplayCue.Character.CC.Stun
を指定して GameplayCue を再生する、など
- GamaplayCueTag に
- 例:スタン中に専用エフェクトの再生
-
GameplayEffect 内で一時的に使用する変数のパラメータ名として使用
- 例:ダメージ値
-
GameplayAbility 内でダメージ計算用の GameplayEffect から GameplayEffectSpec を作成し、
AssignTagSetByCallerMagnitude
ノードなどでData.Damage
に任意の値を設定し、 GameplayEffectSpec を適用する、など
-
GameplayAbility 内でダメージ計算用の GameplayEffect から GameplayEffectSpec を作成し、
- 例:ダメージ値
-
GameplayAbility のクールダウン設定でクールダウン中を示す識別に使用
- 例:スキルのクールダウン
- DurationPolicy を HasDuration に、DurationMagnitude > ScalableFloatMagnitude を 5 に、GrantedTags を
Cooldown.Skill
を設定した GameplayEffect を用意し 、キャラクター(が所有する AbilitySystemComponent)に適用する、など
- DurationPolicy を HasDuration に、DurationMagnitude > ScalableFloatMagnitude を 5 に、GrantedTags を
- 例:スキルのクールダウン
詳細: 「GASDocumentation 和訳」の「4.2 Gameplay Tags」
Attribute
C++ でいうところの FGameplayAttributeData 型のプロパティのことです。
GameplayEffect で操作可能な、ゲーム固有のパラメータを定義するための器です。
AttributeSet で保持されます。
基本的に、値の変化は GameplayEffect を通じてのみ行います。
これは、クライアントサイドで Prediction (予測)できるようにするためです。
詳細: 「GASDocumentation 和訳」の「4.3 Attributes」
AttributeSet
C++ でいうところのプロジェクト毎の UAttributeSet の派生クラスのことです。
Attribute を保持するための器です。
AbilitySystemComponent を所持する Pawn や PlayerState や Actor 派生クラスに所有させることで、同じく所有させている AbilitySystemComponent に登録され、 GameplayEffect 適用時に参照されるようになります。
詳細: 「GASDocumentation 和訳」の「4.4 Attribute Set」
GameplayEffect
GameplayEffect を派生したブループリントクラス群のことで、 C++ では通常派生しません。
ロジックを持たせず、クラスのデフォルトで各パラメータを設定するだけのデータ専用ブループリントとして扱います。
主に「 AttributeSet/GameplayTag の変更」「コストの定義」「クールダウンの定義」に利用されるクラスです。
一つのクラスで異なる用途の設定が行えるようになっているため、同時に設定しないような項目もあります。
例:
- 「このスキルは、ターゲットの Health を -10 、スタンを 3 秒間与える。スキルの使用者は Mana を -5 され、スキルの再使用に 7 秒のクールタイムが必要」というスキルの場合、 GameplayEffect は以下の 4 つが必要になります。
- Health を -10 する
-
GameplayTag
CC.Stun
を 3 秒間付与する - Mana を -5 する
-
GameplayTag
Cooldown.Skill
を 7 秒間付与する
Attribute の変化と GameplayTag の付与は、前者は即時(Instant)、後者は期限がある(HasDuration)ため、別の GameplayEffect に分割します。
コスト及びクールタイムは、 GameplayAbility の専用のプロパティに設定することでアビリティ起動前のチェック(コストが支払えるか、クールタイム中ではないか)で利用されます。
そのため、専用の GameplayEffect に分割します。
-
AttributeSet の値の変更用
- 例: キャラクターの Health を -10 する
- Modifiers で Attribute を Health に、 ModifierOp を Add に、 Modifier Magnitude > Scalable Float Magnitude を -10 に設定した GameplayEffect を用意し 、キャラクター(が所有する AbilitySystemComponent)に適用する、など
- 例: キャラクターの Health を -10 する
-
GameplayTag の適用用
- 例: キャラクターに GameplayTag
Cooldown.Skill
を 3 秒間付与する- DurationPolicy を HasDuration に、DurationMagnitude > ScalableFloatMagnitude を 3 に、GrantedTags を
CC.Stun
を設定した GameplayEffect を用意し 、キャラクター(が所有する AbilitySystemComponent)に適用する、など
- DurationPolicy を HasDuration に、DurationMagnitude > ScalableFloatMagnitude を 3 に、GrantedTags を
- 例: キャラクターに GameplayTag
-
GameplayAbility のコスト用
- 例:スキルを使用したら Mana を -5 する
- Modifiers で Attribute を Mana に、 ModifierOp を Add に、 Modifier Magnitude > Scalable Float Magnitude を -10 に設定した GameplayEffect を用意し 、スキル用の GameplayAbility の CostGameplayEffectClass で設定する、など
- 例:スキルを使用したら Mana を -5 する
-
GameplayAbility のクールダウン用
- 例:スキルを使用したら 7 秒間使用できなくする
- DurationPolicy を HasDuration に、DurationMagnitude > ScalableFloatMagnitude を 5 に、GrantedTags を
Cooldown.Skill
を設定した GameplayEffect を用意し 、スキル用の GameplayAbility の CooldownGameplayEffectClass で設定する、など
- DurationPolicy を HasDuration に、DurationMagnitude > ScalableFloatMagnitude を 5 に、GrantedTags を
- 例:スキルを使用したら 7 秒間使用できなくする
その他にも様々な機能がありますが、具体的に二つだけあげます。
- スタック
- 同じ GameplayEffect を同じキャラクター(が所有する AbilitySystemComponent)に適用できるようにすることが可能です。
- 期限付き( DurationPolicy が HasDuration )の場合、期限が来たらどのように扱うか(スタック全て消費する、スタックを 1 だけ減じる等)なども設定可能です。
- 例:毒は3回までスタックする。 10 秒経過すると治る(スタックが 0 になる)。
- スタックが溢れた時に適用する GameplayEffect の設定なども可能です。その際にスタックがクリアするようにすることも可能です。
- 例:毒が3回スタックした状態で毒を受けるとスタックをクリアし、 Health を -10 する。
- 周期的(Periodic)な処理
- X 秒ごとに効果を適用することが可能です。
- 例:5 秒ごとに Health を 2 回復する。
note:既存のゲームでやっているような属性操作は大抵できるはずですが、どの機能をどのように組み合わせれば、やりたいことが実現できるか(あるいはできないのか)、というのを判断することが難しいです。
詳細: 「GASDocumentation 和訳」の「4.5 Gameplay Effects」
ModifierMagnitudeCalculation
C++ でいうところの UGameplayModMagnitudeCalculation のプロジェクト毎の派生クラスのことです。
Attribute の値を変化させる量を複雑な計算で Prediction (予測)可能に算出できる仕組みです。
GameplayEffect の Modifier として利用します。
MMC
/ModMagCalc
等と略されることもあります。
詳細: 「GASDocumentation 和訳」の「4.5.11 Modifier Magnitude Calculation (Modifier の大きさ計算)」
GameplayEffectExecutionCalucuration
C++ でいうところの UGameplayEffectExecutionCalculation のプロジェクト毎の派生クラスのことです。
ModifierMagnitudeCalculation より強力で、複数の Attribute の変更が可能ですが、 Prediction (予測)できない仕組みです。
GameplayEffect の Modifier として利用します。
Execution
/ExecCalc
等と略されることもあります。
詳細: 「GASDocumentation 和訳」の「4.5.12 Gameplay Effect Execution Calculation (実行計算)」
GameplayAbility
C++ でいうところの UGameplayAbility 及びプロジェクト毎の派生クラスのことです。
通常は汎用的な仕組みを C++ で実装し、ゲーム固有の処理をブループリントで実装します。
アビリティそのものを表現します。
アビリティは Latent に処理を行う必要なものも多く、ブループリント内で Latent ノードの呼び出しも含め、アビリティ固有の処理をイベントグラフで実装することでそれを実現します。
単位に決まりがあるわけではないので、一つのアビリティを一つの GameplayAbility で書きにくい場合は分割しても問題ありません。
note: 例として、 GASShooter の銃撃は「 LineTrace による射線上のオブジェクトチェック」と「マウス入力時の発砲中の処理」で GameplayAbility を分けています。
詳細: 「GASDocumentation 和訳」の「4.6 Gameplay Abilities」
AbilityTask
C++ でいうところの UAbilityTask のプロジェクト毎の派生クラスのことです。
Latent な処理を実装するためのクラスであり、 GameplayAbility のイベントグラフ内から呼び出します。
例:
- ルートモーションによる移動を行う
- アニメーションモンタージュを再生する
- 1 フレーム待機する
- アニメーションが終了するか、 AnimNotify でイベントがなげられるまで待機する
- ユーザーの入力によるターゲット選択が完了/中断するまで待機する
詳細: 「GASDocumentation 和訳」の「4.7 Ability Tasks」
2021/12/25 追記:
-
[UE] AbilityTask について全部書くよ
- koorinonaka 氏による、エンジンから提供されている全ての AbilityTask について一覧できるようにまとめられた記事です。
- 実現したい機能の設計の際など、非同期処理を行うにあたってどのような AbilityTask が初めから用意されているかを知りたいときに助けになると思います。
GameplayCue
GameplayCueNotify_Static/GameplayCueNotify_Actor を派生したブループリントクラス群のことです。
ゲームプレイに影響しない装飾的な演出を再生するのに利用します。
例:
- カメラシェイク
- パーティクル再生
- サウンドエフェクト再生
GameplayCue の再生には、 GameplayCue
から始まる GameplayTag を識別のために利用します。
例:
- スタン用の演出のための GameplayTag として
GameplayCue.Character.CC.Stun
を使用する
詳細: 「GASDocumentation 和訳」の「4.8 Gameplay Cues」
その他
更に詳細を知っておく必要がある情報としては以下のような項目があります。
- グローバル設定
- GAS のグローバルクラスの変更や初期化方法についての説明。
- 詳細: 「GASDocumentation 和訳」の「4.9 Ability System Globals」
- Prediction
- Prediction (予測)に関する説明。ネットワークゲームを作るのであれば、 Latent なノードを利用する際に PredictionKey についての理解が必要です。
- Prediction (予測)されないケースについての情報もまとまっています。
- 詳細: 「GASDocumentation 和訳」の「4.10 Prediction (予測)」
- Targetting
- ネットワークを介して対象の情報等をやり取りする方法についての説明。例えば場所指定スキルの選択した場所のやり取り方法など。
- 詳細: 「GASDocumentation 和訳」の「4.11 Targeting」
- よくある実装例
- 既存のゲームで一般的に実装されているアビリティの実装例の説明。
- 詳細: 「GASDocumentation 和訳」の「5. Commonly Implemented Abilities and Effects (一般的に実装されている Abilities と Effects)」
- Debugging GAS
- ログの出力方法やデバッグ情報を画面に出す方法についての説明。トラブル時に備え、 GAS のセットアップが終わった段階で一度試しておくと良いです。
- 詳細: 「GASDocumentation 和訳」の「6. Debugging GAS」
- GameplayEvent
- 公式ドキュメント内で ゲームプレイ イベントとのトリガー という項目があります。
- この項目は GASDocumentation では GameplayAbility へのデータの受け渡しの説明内で出てきます。
- 詳細: 「GASDocumentation 和訳」の「4.6.11 Passing Data to Abilities (Abilities へのデータの受け渡し)」
おしまい。