Meiryo’s blog

やってみて詰まったことを備忘録として残すブログ

【UE5】Gameplay Ability Systemを初めて使った時に役立ったサイトや良かったことなど

先日アンリアルクエスト5に参加いたしました。
提出したゲームはこちら www.youtube.com

今回このイベントで初めてGameplay Ability System(GAS)を使用しました。
使用したのはAbility、Attribute 、Effect、Cueです。

Abilityは簡単なのですが
Attribute 、Effectはかなり苦しみました。
苦しみながらもなんとか試すくらいにはできるようになったので
行ったこと、参考になったサイトなどを記しておきます。

※この記事は浅い知識で書いているので
誤りやアンチパターンなどが含まれているかもしれません

概要把握

猫でも分かる UE4の新しいサンプル「Action RPG」について
76ページからのスライドを見てGASの概要を学びました。

一番参考にした動画

Gameplay Ability System in 40 Minutes -UE4 C++ Tutorial - YouTube

これが無ければGASを使うことができませんでした。
1本の動画でAbility、Attributes 、Effect、Cueを試せるようになる動画です。
本記事はこの動画を参照することが多いです。

AttributeSetとAbilitySystemComponentの作成

上記で記載した動画と
こちらの記事を見て
AttributeSetとAbilitySystemComponentを作成しました。

ほとんど丸写しをしましたが「Repilicateなんたら」等の
ネットワーク関連の感じがするようなものは書きませんでした。

Abilityを使ってみる

いきなり攻撃Abilityを作るのはしんどそうだったのでまずは
JumpAbilityを作りました。
参考にしたのはこちらの記事です。

AttributeとEffectを使ってみる

一番参考にした動画を見てそれぞれ使っていきました。
詳しいことは動画を見ればわかるので
ここでは使うのになにをする必要があるのかをまとめておきます。

Gameplay Effectの作成

まずGameplay Effectを作成します。
作成するのは

  • プレイヤーと敵のステータス
  • ダメージ

です。

プレイヤーにはHP10と攻撃力1 敵にはHP3と攻撃力1を与えます。

作成したらプレイヤーと敵のBPに
それぞれEffectを設定します。

ダメージエフェクトはこのように設定しました。
ダメージを受けたらHPを1減らします。

Abilityの作成

次にAbilityを作成します。
これは近接攻撃Abilityの一部です。
近接攻撃のアニメーションの再生が終わるまで
Wait Gameplay Eventで待機します。
Event Tagは「Weapon.Hit」にしました。

こちらはプレイヤーが装備している武器BPのEventGraphです。

Box Collisionを持っており、近接攻撃アニメーション中に
敵に当たったらActorBeginOverlapが実行されます。

あまりよくわかってないのですがおそらく
「誰が誰にダメージを与えたか」の情報を
作ってSend Gameplay Event to Actorに送っています。

ここでEvent Tagを「Wait Gameplay Event」で設定したTagと
同じ「Weapon.Hit」を設定します。
すると、待機していた近接攻撃Abilityの「Wait Gameplay Event」に
引っかかります。

ApplyGameplayEffectToTargetのGameplayEffectClassに
ダメージエフェクトを設定します。

これで攻撃が当たるとダメージが入るようになります。

余談 HPをUIで表示するには

どうやってGameplayAttributesの値を取得すれば良いのかが
わからなかったのですが
ActionRPGのコードを見たら
普通にGetterを作って取得していたので同じことをしました

float ABaseCharacter::GetMaxHealth() const
{
    return Attributes->GetMaxHealth();
}

float ABaseCharacter::GetHealth() const
{
    if (!Attributes)
    return 1.f;

    return Attributes->GetHealth();
}

float ABaseCharacter::GetAttackPower() const
{
    return Attributes->GetAttackPower();
}

Cueを使ってみる

ToolからCue Editorを開いてCueを作ります。

Cueでは攻撃を受けた時のアニメーションを再生します。

このCueをダメージEffectで設定します。

これでダメージを受けた時に
ダメージEffectと一緒にCueが実行されるようになりました。

Gameplay Ability Systemを使ってよかったこと

外部に処理を逃がすことができる

こちらの資料にもありましたが
なにか動きを追加したかったらAbility、
パラメータに影響与えたい時はEffectを作成すればいいので
処理を外部に逃がすことができることが良かったです。
巨大なPlayerクラス・Enemyクラスを避けることができます。

Tagを使うことでBooleanを減らせる

Tagで「このAbilityを使っている時は他のTagのAbilityは使えない」等の
設定ができるのでbooleanを使う箇所が減ったのも良かったです。

これは前転をするAbilityのTagの設定ですが
「前転中はAbility.Actionを実行しない」
という設定になっています。

Ability.Actionには
Ability.Action.AttackやAbility.Action.Jumpなどの
タグがあるのですがそれらを一括で防ぐことができます。

「Block Abilities with Tag」からAbility.Actionが無くなると
どうなるかというと
前転をキャンセルして攻撃に入ったり
前転中にジャンプができてしまったりします。

ある処理をしている時に他の処理をさせないようにするには
booleanだったり「Animation再生中かどうか」等を
チェックしなければならないと思いますが
その手間が無くなったのは楽に感じました。

この話はこちらの記事がとても参考になりました。

Tagを使う時の注意

便利なTagですが何も考えずに作っていると
後に困ることになります。 以下はタグの一覧の一部です。

見ての通りぐちゃぐちゃでどこで何を使っているかわかりません。
まだ少ないので取り返しがつきますが
既に整理をするのがめんどくさいです。

このことからTagを使うときには事前にTagの分け方を
ある程度決めておいた方がいいなと思いました。
分け方はActionRPGが参考になると思います。

知識を深めるには

まだ未視聴なのでなんとも言えないのですが
この2本の動画でかなり知識が深まりそうな気がしています。
A Guided Tour of Gameplay Abilities | Inside Unreal - YouTube

Exploring the Gameplay Ability System (GAS) with an Action RPG | Unreal Fest 2022 - YouTube

いつか見たら記事を書くと思います。