Unreal Engine5でGameplayAbilitySystemを使ったコンボ攻撃を実装する

こんにちは。 株式会社アドグローブ ゲーム事業部(大阪)エンジニアの菅です。

今回は以前初めてUE5でBPでアクションゲームを作った際に使った「GameplayAbilitySystem」を使ったコンボ攻撃の実装を紹介します。

「GameplayAbilitySystem」とは

ゲーム内で使用するアビリティを管理するシステムです。
アビリティはキャラクターの攻撃や回避行動、アイテムの使用などの行動になります。
その行動をタグで扱い、効率的に実装していくものとなります。

プラグインの追加

UE5のエディタの「編集」→「プラグイン」からプラグインのウィンドウを開き、
[GamePlayAbility]と検索し、該当するプラグインにチェックを入れてエディターを再起動します。

アビリティの作成

  1. コンテンツブラウザ内で右クリックし、
    「ゲームプレイ」→ 「Gameplay Ability ブループリント」を選択(画像右側)

  2. その後、親クラスは「Gameplay Ability」を選択し作成します。(画像左側)

ファイル名 : GA_Attack_First

Gameplay Tagsの追加

Gameplay Tagについて

基本的な単一のタグです。
タグの階層構造を活用して、カテゴリごとに整理されたラベルを作成できます。

特徴
  • タグは文字列として表現されます(例: Ability.Fire)。
  • 階層構造を持ち、.(ドット)で階層を区切ります。
    • 例:
      • Ability.Fire(火属性アビリティ)
      • Ability.Ice(氷属性アビリティ)
Gameplay Tagsの種類
種類 主な用途
アビリティタグ アビリティの分類
タグ付きのアビリティをキャンセル アビリティの分類
タグ付きのアビリティをブロック アビリティのキャンセル条件
アクティベーションの所有タグ アビリティ発動中の保持
アクティベーションの必須のタグ アビリティ発動条件の設定
アクティベーションのブロック済みタグ アビリティの発動禁止
ソース必須タグ 発動元が特定のタグを持つ場合のみアビリティを発動可能
ソースブロック済みタグ 発動元が特定のタグを持つ場合、アビリティを発動不可
ターゲットの必須タグ ターゲットが特定のタグを持つ場合のみアビリティを発動可能
ターゲットのブロック済みタグ ターゲットが特定のタグを持つ場合、アビリティの効果を適用不可

追加方法

GA_Attack_First開き、画面右側のタグの欄から空のマップをクリックします。
タグ追加の画面を開くので「+」を押しタグを登録します。

  • 名前: Combo.A.First
  • ソース: DefaultGameplayTags.ini


ゲームプレイタグを追加後、以下のようにタグを追加します。

  • アビリティタグで使うタグを設定
  • アクティベーションの所有タグで起動中に有効にするタグを設定
  • アクティベーションのブロック済みタグで指定したタグを起動中は起動出来ないようにする。

アビリティの処理の実装

攻撃ボタンを押した時にする処理は以下の内容となります。

  • 処理の内容
    • Play Montage
      • 再生するモンタージュを呼び出すノード。
      • Montage to playに再生したいモンタージュを選択する。
    • GetSkeletalMeshComponentFromActorInfo
      • 再生の対象となるスケルタルメッシュコンポーネントを取得するノード
    • End Ability
      • アビリティを終了するノード
      • Play montage ノードのOn Compotedと On interruptedから繋がないとアビリティが終了せず
        次の攻撃が出来なくなるので、再生が終わったら必ず追加する必要があります。

アビリティをキャラクターに追加

  • キャラクターBPのイベントグラフを開き、コンポーネントの追加からAbility Systemを追加します。


  • 次にEvent Begin playからGive Abilityを繋ぎ、キャラクターにアビリティを付与します。
  • Give AbilityのAbility Classから作成した「GA_Attack_First」を選択します。

アビリティの呼び出し

  • 攻撃ボタンを押した時に追加したアビリティタグを起動する処理を追加します。
  • 「Make Literal Gameplay Tag Container」のValueには「Combo.A」のタグを設定します。

アビリティの実装確認

以上の設定でコンパイルし、デバックしてみましょう。


攻撃ボタンを押すことで攻撃のモンタージュが再生されるようになりました。
またアクティベーションのブロック済みタグを設定しているので、
連打してもモンタージュが終わるまで攻撃ができないようになっています。

コンボ攻撃

1段目の攻撃が出来たので次は2段目の攻撃を作成しましょう。

二段目の作成

  1. 「GA_Attack_First」を作った要領で「GA_Attack_Second」のファイルを作成します。
  2. ゲームプレイタグに新たに「Combo.A.Second」を追加します。

  3. アビリティの処理の実装の時のように処理を実装します。
    この時Motange to Playには別のモンタージュを用意します。

  4. ゲームプレイタグの設定はこちらになります。

    • 今回は1段目の後に起動する条件のアビリティなのでアクティベーションの必須のタグに「Combo.A.First」を設定して制御します。
  5. 最後にキャラクターにアビリティを登録します。

実装の確認

出来ているか確認してみましょう

攻撃ボタンを連打してみます。

何やら挙動がおかしいですね。。。
1段目の攻撃のキャンセルが上手く出来ていないです。

この原因は二つあります。

原因

  • アクティベーションのブロックするべきタグが足りない

    • 「Combo.A.First」の方でブロックするタグがA.Firstのみになっており、
    • A.Second起動中にA.Firstが起動してしまう状態となっております。
    • それを防ぐためにCombo.A.Firstのアクティベーションのブロック済みタグを
      「Combo.A.First」→「Combo.A」に変更します。
  • キャンセルのタイミングを設定していない

    • キャンセルのタイミングが設定されていないとすぐキャンセルとなり、
      一段目がちゃんと再生されません。
      次にキャンセルのタイミングの追加について説明します。

攻撃キャンセルの実装

モンタージュの通知ステートの追加

  1. 「Combo.A.First」で使用しているモンタージュファイルを開きます。

  2. 画面下部のウィンドウで

    1. 通知の1の行で右クリック
    2. 通知ステートを追加
    3. 「Montage Notify Window」をクリックして追加します。
  3. 通知ステートの設定

    1. 通知ステートの開始位置と終了位置を調整
    2. 通知ステートの名前を変更(EnableCancel : 二段目の攻撃に移行する通知)
  4. 通知を一つ追加

    1. さらにもう一つ通知ステート(EnableInput : 先行入力の通知)を追加します。
    2. 通知の▼をクリックして、通知トラックを追加
    3. 通知の2に「Montage Notify Window」を設定します。

通知ステートを受け取りキャンセルを実装

  1. 前準備として新たにゲームプレイタグを二つ追加します。

  2. 「GA_Attack_First」のイベントグラフで通知ステートが有効になった時に
    新たなゲームプレイタグを有効にする処理を作ります。

  3. また、「GA_Attack_First」のイベントグラフの「Event OnEndAbility」に
    「Combo.EnableCancel」と「Combo.EnableInput」を削除する処理を追加します。
    これが無いと二回目以降のコンボ攻撃が出来なくなってしまいます。

  4. 「GA_Attack_Second」のアクティベーションの必須のタグ に「Combo.EnableInput」を追加します。

  5. 「GA_Attack_Second」のイベントグラフで「Play Montage」の前に「Wait Gameplay Tag Add」を繋げ、
    指定したタグが有効になるまで待つ処理を追加します。

実装を確認


これで連打してもキャンセルが有効になるまで切り替わらないようになりました!

まとめ

今回はGameplayAbilitySystemを使ってコンボ攻撃を簡単に実装する方法を紹介しました。
GASには他にも
「GameplayAttribute」を使ってスタミナを実装する方法や
「GameplayEffect」でダメージ計算・スキルによるバフの実装などもあり
出来る事が幅広い機能となっております。
また、機会があればそれらを使ったソウルライクなゲームも作ってみたいですね。

最後までお読みいただきありがとうございました。

参考サイト・動画