📝

[UE5]GameplayAbilitySystemメモ1 -概要-

2024/05/11に公開

本記事は筆者のメモ的アウトプットとして書いています。
勉強中に書いたものなので、間違いがあるかもしれません。

GameplayAbilitySystem(GAS)とは

ゲーム内で行うジャンプや攻撃、パッシブスキルなどを"アビリティ"という単位で括り、アビリティの発動条件やコスト、実行内容などを定義します。ゲームプレイアビリティはインスタンスとして存在できるため、マップ上に落ちてる回復アイテムなどにも活用できます。タグを使用することで、一つの行動で発動するアニメーションやエフェクト、SEなどの複数タスクや、ネットワーク周りの予測処理などで、大量のbool型を使用せずに済みます。

つまり何が嬉しいかというと、複雑なものを作る際の様々な要素を管理しやすくなります。
何が嬉しくないかというと、そこそこに学習コストが掛かる点です。

作りたいゲームが簡易的なものであれば、無理にGASを導入しない方がいいかもしれません。
逆に、凝ったゲームを作りたいのであればぜひとも導入を検討してください。
GASは、FortnightやFormstarsなどの大規模なプロジェクトでも活躍しています。

各コンポーネントについて

GameplayAbility

  • プレイヤーが起こす行動をここで定義する。これが1つのアビリティとなる
  • 機能をカプセル化するために使用するクラス

GameplayAbilitySystemComponent

  • アビリティの付与、アクティブ化、通知
  • 特定の能力が発動したときや効果が適用されたときに使う
  • 脳みそ的な位置づけ
  • キャラクターにアタッチする

Attribute Set

  • キャラクターに関連する全ての属性
  • ライフ、マナなど

Ability Task

  • アビリティを非同期で実行する。

GameplayTag

  • 階層構造を持てるため、色んなものを識別するのに便利
  • GameplayAbilityだけで使用されているわけではない。

GameplayEffect

  • アビリティによって引き起こされる
  • Attributeの値を変更

GameplayCue

  • パーティクルシステムやサウンドなどの装飾的な効果を処理

基本構造

alt text

最低限の実装として、PawnにGameplayAbilitySystemComponentとAttributeを持たせておけば、HPやMPが減る、といった単純な処理はできます。
しかしこの場合、HPがなくなってPawnインスタンスを破棄すると、GameplayAbilitySystemComponentとAttributeも破棄されてしまいます。
ここで困ることは、

・FPSなどで、キルされた時に持っていた武器を所持してリスポーンしたい
・アクションゲームなどで、キルZに落ちてしまった場合、HP・MPなどをそのままに落ちる前の地点にリスポーンさせたい

といった処理に手間がかかってしまいます。

Player State

対処法として、Pawnの状態を保持するPlayerStateを使う方法があります。
PlayerStateに、Pawn, GameplayAbilitySystemComponent, AttributeSetを持たせることで、Pawnが破棄されてもGameplayAbilitySystemComponentとAttributeは無事というわけです。

この対応は、GameplayAbilityを使用する全てのクラスで行えばいいというわけではありません。
使い捨てができる、またはそもそも破棄する機会がないクラスには、PlayerStateは必要なさそうです。例えば、小型のEnemyクラスや街中にいるNPCクラスなどでしょうか
逆に、複雑な処理・情報管理を必要とするクラスでは必須級です。
使用場面は、Playerクラスや大型Enemyクラスなどが考えられます。

おわり

メモ程度ですが、大まかな概要は以上となります。
次回からはもう少し具体的に、C++での実装部分などを書いていこうと思います
が、飽き性なのでこの記事が最初で最後となるかもしれません。
ゆっくり更新していければと思っております。よろしくお願いします

GitHubで編集を提案

Discussion