[UE5]GameplayAbilitySystemメモ1 -概要-
本記事は筆者のメモ的アウトプットとして書いています。
勉強中に書いたものなので、間違いがあるかもしれません。
GameplayAbilitySystem(GAS)とは
ゲーム内で行うジャンプや攻撃、パッシブスキルなどを"アビリティ"という単位で括り、アビリティの発動条件やコスト、実行内容などを定義します。ゲームプレイアビリティはインスタンスとして存在できるため、マップ上に落ちてる回復アイテムなどにも活用できます。タグを使用することで、一つの行動で発動するアニメーションやエフェクト、SEなどの複数タスクや、ネットワーク周りの予測処理などで、大量のbool型を使用せずに済みます。
つまり何が嬉しいかというと、複雑なものを作る際の様々な要素を管理しやすくなります。
何が嬉しくないかというと、そこそこに学習コストが掛かる点です。
作りたいゲームが簡易的なものであれば、無理にGASを導入しない方がいいかもしれません。
逆に、凝ったゲームを作りたいのであればぜひとも導入を検討してください。
GASは、FortnightやFormstarsなどの大規模なプロジェクトでも活躍しています。
各コンポーネントについて
GameplayAbility
- プレイヤーが起こす行動をここで定義する。これが1つのアビリティとなる
- 機能をカプセル化するために使用するクラス
GameplayAbilitySystemComponent
- アビリティの付与、アクティブ化、通知
- 特定の能力が発動したときや効果が適用されたときに使う
- 脳みそ的な位置づけ
- キャラクターにアタッチする
Attribute Set
- キャラクターに関連する全ての属性
- ライフ、マナなど
Ability Task
- アビリティを非同期で実行する。
GameplayTag
- 階層構造を持てるため、色んなものを識別するのに便利
- GameplayAbilityだけで使用されているわけではない。
GameplayEffect
- アビリティによって引き起こされる
- Attributeの値を変更
GameplayCue
- パーティクルシステムやサウンドなどの装飾的な効果を処理
基本構造
最低限の実装として、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++での実装部分などを書いていこうと思います
が、飽き性なのでこの記事が最初で最後となるかもしれません。
ゆっくり更新していければと思っております。よろしくお願いします
Discussion