武器を装備してのコンボ攻撃とヒットリアクション

XXX(□□□)の3連コンボなど、先行入力可能なコンボ攻撃と敵のヒットリアクション。

前から攻撃したか、後ろから攻撃したかで敵のリアクションが変わります。
Gameplay Abilitiesを使用しています。

Engineバージョンは5.3.2。

プラグイン

編集 > プラグインからGameplay Abilitiesを有効化。

アニメーションの用意

MixamoからUE5への導入方法は過去記事参照
Mixamo → Mixamo Converter → UE5.2 | 経験値0からのUE5

UE5にアニメーションシーケンスを移行したら、各アニメーションシーケンスのルートモーション > EnableRootMotionにチェックを入れてください。
各アニメーションシーケンスのAnimMontageを作成してください。

列挙型: E_HitDirection

ブループリント > 列挙型
名前: E_HitDirection
・新規作成
敵の前方から攻撃しているのか後方から攻撃しているのかを判別させるためのものです。

武器メッシュのソケット設定

武器のメッシュを開く。
今回はSM_Swordを使用します。
ソケットマネージャーから+して2つ追加。
名前をSocket_Bottomにして、刃の根元に合わせます。
名前をSocket_Topにして、刃の先端より少し先に合わせます。

このSocket_BottomからSocket_Topの間をトレースして武器の当たり判定となります。

武器の装着のさせ方は好きなようにして構いません。
簡易的に装着させるなら、プレイヤーキャラクターのメッシュのスケルトンのhand_rにソケットを追加して、名前をhand_r_swordにする。
hand_r_swordにプレビューアセットとしてSM_Swordを追加して、位置と向きを調整。

プレイヤーキャラクターBP(BP_Player)のコンポーネントにStatic Meshを追加し、その詳細の
スタティックメッシュ > Static MeshにSM_Swordをセット。
ソケット > 親ソケットにhand_r_swordを指定。

プレイヤーキャラクターBP: BP_Player

【変数追加】
HitDirection – E_HitDirection
└新規作成
IsAttackHit? – Boolean
└新規作成

ノードを組む
【前半】

WeaponTraceLoopTimer – Timer Handle
Set Timer by EventのReturn Valueから変数へ昇格
WeaponHitActor
Break Hit ResultのHit Actorから変数へ昇格
【後半】
コンポーネントにStaticMeshを追加して、そこに武器をセットしている場合、そのStaticMeshのコリジョンレスポンスは全て「無視する」にしてください。
これを「ブロック」にして敵側も「ブロック」だと通過できなくなるので敵が吹っ飛びます。

AnimNotifyState

AnimNotifyStateは3種作成します。
AnimNotifyStateはAnimMontageに配置するものです。
コンテンツブラウザで右クリックしてブループリント クラス > AnimNotifyStateを選択して作成。

AnimNotifyState: ANS_WeaponTraceLoop

ブループリント クラス > AnimNotifyState
名前: ANS_WeaponTraceLoop
・新規作成

関数オーバーライドのReceived_NotifyTickを追加。
これはAnimMontageの通知ステートで自分の攻撃の方向を選択できるものです。

ノードを組む

・Weapon Hit ActorはGetした後に右クリックして検証済ゲットに変換する。
Send Gameplay Event to ActorはプラグインのGameplay Abilitiesを導入していると使えるノードです。
【変数】
Forward – Gameplay Tag
Backward – Gameplay Tag
└GetしたHit Directionから線を伸ばして選択するを配置。先にReturn ValueをSend Gameplay Event to ActorのEvent Tagに繋げます。その後、ForwardBackward変数へ昇格させて、目玉アイコンも開けておきます(インスタンス編集可能)。

関数オーバーライドのReceived_NotifyBeginを追加。
これは武器のTraceを有効にするノードです。

ノードを組む

関数オーバーライドのReceived_NotifyEndを追加。
これは武器のTraceを無効にするノードです。

ノードを組む

AnimNotifyState: ANS_ReadyAttack

ブループリント クラス > AnimNotifyState
名前: ANS_ReadyAttack
・新規作成

左メニューの関数オーバーライドの欄でReceived Notify Beginを選択。

ノードを組む Received Notify Begin

【変数】
AttackBeginTag – Gameplay Tag
Gameplay Tag ContainerのValueから変数に昇格。目玉アイコンをオープンにする(インスタンス編集可能)。
関数オーバーライドでReceived Notify Beginを選択した時と同じように今度はReceived Notify Endを選択する。
ノードを組む Received Notify End

AnimNotifyState: ANS_BranchAttack

ブループリント クラス > AnimNotifyState
名前: ANS_BranchAttack
・新規作成

左メニューの関数オーバーライドの欄でReceived Notify Tickを選択。

ノードを組む Received Notify Tick

【ゲームプレイタグ】
Send Gameplay Event to ActorのNoneをクリックしてゲームプレイタグのウィンドウを開く。
+をクリックして新しいゲームプレイタグを追加。
名前は、Attack.Next
ソースは、DefaultGameplayTags.ini
「新しいタグを追加」をクリック。

タグを追加後、AttackとNextにチェックを入れる。

GameplayAbility

GameplayAbilityは攻撃用とリアクション用を作成します。

GameplayAbility: GA_ComboBase

ブループリント > Gameplay Ability
名前: GA_ComboBase
・新規作成
これを親として、後で子ブループリントを作成することになります。
GA_ComboBaseの編集

左メニューの変数を+して、IsFirstAttack(Boolean)を作成。これはコンボの1発目の攻撃であるかどうかの変数。

ノードを組む
Abilityが発動した時にMontageを再生するノード。

【変数】
IsFirstAttack? – Boolean
└新規作成。コンボ攻撃の1発目かどうかの確認。
Montage to Play – Anim Montage
PlayMontageAndWaitMontage to Playから変数に昇格
PlayMontageAndWaitから伸びる実行ピンはEvent Receivedからですので間違えないように。
PlayMontageAndWaitOnly Trigger Once(トリガーは1回のみ)にチェックを入れるのも忘れないように。
PlayMontageAndWaitのEvent Tagは既に登録済のAttack.Nextを選択。
このノードはボタンを押すとAbilityが発動して呼ばれるノードです。
まずIsFirstAttack?であるかどうか確認して、True(1発目の攻撃である)であるならそのままMontageを再生。False(1発目の攻撃ではない)であるならTagのAttack.Nextを付与してからMontageの再生へ。

GameplayAbility(子): GA_ComboX1

GA_ComboBase → 子ブループリント クラスを作成します
名前: GA_ComboX1
・子ブループリント クラスとして新規作成。
・名前がGA_ComboX1なのはゲームパッドのXボタンのコンボの1発目にするからです。
GameplayAbilityの子ブループリントは詳細のみを編集します。
詳細の編集

・これはコンボ1発目の攻撃ですから、Is First Attack?にチェックを入れます。
・Montage To Playには用意してあるAnimMontageを指定。
・タグは今のところAttack.Nextしか作成していませんから、追加で作成します。
タグを作成する時、Attackにチェックを入れて右の「v」をクリックし、「サブタグを追加」すると、Attack以下のタグが作成しやすいです。
Ability Tagsは名前です。
Activation Owned Tagsは、このAbilityを実行中に付与されるTagです。Abilityが終了した時点で消えます。この欄にAttack.X.1というTagを追加します。
Activation Blocked Tagsは、このAbilityが発動中に無効化するTagを入れます。
ここにはAttackを指定。Attack.XもAttack.Yも全て無効化されます。つまり、Xボタンを連打しても重複して発動するのを防げます。ここを空欄にしているとXボタンを連打すると何度も発動してしまい、攻撃モーションの最初にリセットされてしまう。

GameplayAbility(子): GA_ComboX2

名前: GA_ComboX2
・GA_ComboX1を複製して名前変更。
詳細の編集

・2発目の攻撃ですからIs First Attack?のチェックを外す。
・Montage To Playにコンボ攻撃の2発目となるAnimMontageを指定。
Ability Tagsは1発目と同じAttack.X
Activation Owned Tagsは、Attack.X.2になります。2発目の2です。
Activation Required Tagsは、このAbility(Attack.X.2)を発動するのに必要となるTagです。新たにAttack.Ready.X2を追加します。このTagは1発目の攻撃のAnimMontagedeから付与されるようにします。
Activation Blocked Tagsは、Attack.X.2です。
この瞬間、Attack.X.2以外のコンボ攻撃は発動条件外となっているので指定する必要がありません。重複発動する可能性があるのはAttack.X.2のみです。

GA_ComboX2を複製して名前をGA_ComboX3にします。
コンボ3発目の作り方はコンボ2発目の応用です。Tagは数字の2が3になるだけ。

プレイヤーキャラクターBP: BP_Player

コンポーネント

コンポーネントのBP_Player (Self)を選択した状態で+追加を押してAbilitySystemを追加する。

イベントグラフ
ノードを組む
アビリティを登録するシステムを作ります。

イベント BeginPlayから線を繋げますが、既にいくつかの線とノードが繋がっているかと思います。その最後のノードからFor Each Loopを繋げる。
Ability Classのピンが配列になっている変数が必要です。
Give AbilityAbility Classから線を伸ばして変数へ昇格。この時点ではピンが単一。
Ability Classの詳細のピンを配列に変更する。注意書きが出ますが「変数の型を変更」を選択。
このノードはGive AbilityでAbilityを登録しています。Gameplay AbilityはGive Abilityに登録しないと実行できません。

コンパイルしましょう。

配列にした変数Ability Classに、作成したアビリティを登録します。
左メニューの変数のAbility Classを選択し、右の詳細のデフォルト値 > Ability Classの+を選択。出現したインデックス[0]のNone欄にGA_ComboX1を指定。
同様にインデックス[1]を追加してGA_ComboX2を指定。インデックス[2]を追加してGA_ComboX3を指定。

ノードを組む
インプットアクションからAbilityを発動させます。

インプットアクションは好きなものを配置してください。UE5ではエンハンスドインプットアクションが主流ですが、マウスの左ボタンなどのノードでも可能です。
Xボタンを押すと、AbilityのAttack.Xが有効化されるわけです。
Attack.X.1~3まで全て有効化されていますが、Activation Required Tagsで制御されていて2と3は発動しません。つまり1発目の攻撃モーションが発動します。

GameplayAbility: GA_HitReactionBase

ブループリント クラス > GameplayAbility
名前: GA_HitReactionBase
・新規作成。
・攻撃を受けた時のリアクション用のGameplayAbilityです。
ノードを組む

【変数】
HitDirectionTag – Gameplay Tag
Wait Gameplay EventのEvent Tagから変数へ昇格
Montage To Play – Anim Montage
PlayMontageAndWaitのMontage to Playから変数に昇格
Wait Gameplay EventのOnly Trigger Onceにチェックを入れる。
PlayMontageAndWaitStart SectionをStartにしています。ヒットリアクションは即アニメーションに反映してほしいですから、AnimMontageの頭を切るためにStart Sectionを指定しています。

GameplayAbility(子): GA_HitReactionLeft

GA_HitReactionBase → 子ブループリント クラスを作成します
名前: GA_HitReactionLeft
・子ブループリント クラスとして新規作成。
子ブループリントですからAnimMontageの選択とTagの設定だけです。
詳細の編集

Montage To Playを選択します。
GA_HitReactionLeftでは攻撃を受けた時に左に倒れるAnimMontageを指定します。対面する敵は左手側を振って攻撃している状態。
Hit Direction TagはAttack.HitDirection.Leftにします。このTagはプレイヤーの攻撃時のAnimMontageで通知されます。
Ability TagsはAttack.HitReactionにします。
GA_HitReactionLeftを複製して、名前をGA_HitReactionRightにします。
GA_HitReactionRightも同じようなやり方で設定します。

敵キャラクターBP: BP_Enemy

敵キャラクター用のBPを用意してください。
今回はサードパーソンテンプレートのBP_ThirdPersonCharacterを複製して名前をBP_Enemyにしました。

上メニューの「クラスのデフォルト」を選択。
詳細 > アクタ > Tagsを追加して「Enemy」と入力。

コンポーネント

コンポーネントからCamera関係は削除しました。
コンポーネントにAbilitySystemを追加します。

イベントグラフ
ノードを組む

・操作関係のノードは削除して構いません。
・BP_Playerの時と同じです。
イベント BeginPlayから線を伸ばしてFor Each Loopを配置。
For Each LoopのLoop Bodyから線を伸ばしてGive Ability (AbilitySystem)を配置。
・Array ElementとAbility Classを繋げる。
For Each LoopAbility Class変数へ昇格
ノードを組む
AbilityClassに登録

変数AbilityClassを選択し、詳細 > デフォルト値にGA_HitReactionLeftとGA_HitReactionRightを追加。

コリジョン

詳細の
コリジョン > Mesh > コリジョンプリセットをCustom
コリジョン > Mesh > Collision EnabledをCollision Enabled (Query and Physics)にしました。
プレイヤーの攻撃トレースはVisibilityにしてありますから、トレース応答 > Visivblityはブロックにしておく必要があります。

AnimMontage

コンボ攻撃のAnimMontage

ANS_WeaponTraceLoop
ANS_ReadyAttack
ANS_BranchAttack
これらをプレイヤーの攻撃に使っているAnimMontageに追加します。

ANS_WeaponTraceLoop

通知トラックに通知ステートを追加で追加します。

当たり判定が出てほしい区間に配置する。

配置したANS_WeaponTraceLoopを選択した状態で詳細 > アニムノーティファイのForwardとBackwardにそれぞれ敵のリアクション用のTagを設定します。
プレイヤーがプレイヤーの右手側から攻撃する場合、
Forward(敵と対面)がAttack.Hitdirection.Rightとなり、
Backward(敵の背面)がAttack.Hitdirection.Leftとなります。

ANS_ReadyAttack

通知トラックに通知ステートを追加で追加します。
通知トラックは▼から「通知トラックを挿入」で追加できます。

配置した区間内にボタン入力があると、次の攻撃の発生が確定します。

コンボ攻撃1発目の場合、
ANS_WeaponTraceLoopを選択した状態で詳細 > アニムノーティファイ > Attack Begin Tagに「Attack.Ready.2」を指定。
このTagが付与されている間にコンボ2発目の入力が受け付けられます。

コンボ攻撃2発目の場合なら「Attack.Ready.3」を指定。

ANS_BranchAttack

通知トラックに通知ステートを追加で追加します。

次の攻撃への入力があった場合、ANS_BranchAttackの始点の位置で次の攻撃アニメーションに切り替わります。

攻撃スピード

デフォルトのアニメーションのままだと、やや攻撃スピードが遅く感じます。
AnimMontageのアセット詳細 > Animation > Rate Scaleを1.3とか大きい値にすればスピードが速くなります。

ヒットリアクションのAnimMontage

攻撃を受けてすぐ反応してほしいですから、モンタージュ(DefaultGroup)の右側のタイムラインで右クリックして「新しいモンタージュセクション」を選択。
名前を「Start」にして、モンタージュが再生されてほしいスタート位置を指定。頭の動きがない部分をカットすればリアクションの反応が良くなります。

「Start」を使用せずに、グリーンのラインを選択してその詳細のStart Timeで指定しても良いです。

リアクションの動きが鈍いと感じたら、AnimMontageのアセット詳細 > Animation > Rate Scaleを1.3とか大きい値にすればスピードが速くなります。

コンボ攻撃中の方向転換

プレイヤーキャラクターBPのCharacter Movementの詳細を見る。
ルートモーション > Allow Physics Rotation During Anim Root Motionにチェックを入れるとAnimMontage再生中に向きを変えられす。

問題点

問題点はありませんが、改良はいくらでもできます。

今回は敵のリアクションが左右だけですが、AnimMontageとタグの組み合わせ次第ですから、のけぞったり、転んだりも可能です。攻撃AnimMontageに対応したリアクションができます。

コメント

タイトルとURLをコピーしました