XXX(□□□)の3連コンボなど、先行入力可能なコンボ攻撃と敵のヒットリアクション。
前から攻撃したか、後ろから攻撃したかで敵のリアクションが変わります。
Gameplay Abilitiesを使用しています。
Engineバージョンは5.3.2。
プラグイン
編集 > プラグインからGameplay Abilitiesを有効化。
アニメーションの用意
- コンボ攻撃用のアニメーション2~4種
最低2種あれば良いです。
Sword And Shield Downward Slash | Mixamo
Sword And Shield Cross Slash | Mixamo
Sword And Shield Low Attack | Mixamo - ヒットリアクション用のアニメーション2種
左から攻撃された時と右から攻撃された時のリアクション用のアニメーション。
Male Reaction Hit On The Left Side | Mixamo
Male Reaction Hit On The Right Side | Mixamo
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から変数へ昇格。
【後半】
これを「ブロック」にして敵側も「ブロック」だと通過できなくなるので敵が吹っ飛びます。
AnimNotifyState
AnimNotifyStateは3種作成します。
AnimNotifyStateはAnimMontageに配置するものです。
コンテンツブラウザで右クリックしてブループリント クラス > AnimNotifyStateを選択して作成。
AnimNotifyState: ANS_WeaponTraceLoop
名前: 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に繋げます。その後、ForwardとBackwardを変数へ昇格させて、目玉アイコンも開けておきます(インスタンス編集可能)。
関数オーバーライドのReceived_NotifyBeginを追加。
これは武器のTraceを有効にするノードです。
関数オーバーライドのReceived_NotifyEndを追加。
これは武器のTraceを無効にするノードです。
AnimNotifyState: ANS_ReadyAttack
名前: ANS_ReadyAttack
・新規作成
左メニューの関数オーバーライドの欄でReceived Notify Beginを選択。
【変数】
AttackBeginTag – Gameplay Tag
└Gameplay Tag ContainerのValueから変数に昇格。目玉アイコンをオープンにする(インスタンス編集可能)。
AnimNotifyState: ANS_BranchAttack
名前: ANS_BranchAttack
・新規作成
左メニューの関数オーバーライドの欄でReceived Notify Tickを選択。
【ゲームプレイタグ】
Send Gameplay Event to ActorのNoneをクリックしてゲームプレイタグのウィンドウを開く。
+をクリックして新しいゲームプレイタグを追加。
名前は、Attack.Next
ソースは、DefaultGameplayTags.ini
「新しいタグを追加」をクリック。
タグを追加後、AttackとNextにチェックを入れる。
GameplayAbility
GameplayAbilityは攻撃用とリアクション用を作成します。
GameplayAbility: GA_ComboBase
名前: GA_ComboBase
・新規作成
GA_ComboBaseの編集
左メニューの変数を+して、IsFirstAttack(Boolean)を作成。これはコンボの1発目の攻撃であるかどうかの変数。
Abilityが発動した時にMontageを再生するノード。
【変数】
IsFirstAttack? – Boolean
└新規作成。コンボ攻撃の1発目かどうかの確認。
Montage to Play – Anim Montage
└PlayMontageAndWaitのMontage to Playから変数に昇格。
・PlayMontageAndWaitから伸びる実行ピンはEvent Receivedからですので間違えないように。
・PlayMontageAndWaitのOnly Trigger Once(トリガーは1回のみ)にチェックを入れるのも忘れないように。
・PlayMontageAndWaitのEvent Tagは既に登録済のAttack.Nextを選択。
まずIsFirstAttack?であるかどうか確認して、True(1発目の攻撃である)であるならそのままMontageを再生。False(1発目の攻撃ではない)であるならTagのAttack.Nextを付与してからMontageの再生へ。
GameplayAbility(子): GA_ComboX1
名前: GA_ComboX1
・子ブループリント クラスとして新規作成。
・名前がGA_ComboX1なのはゲームパッドのXボタンのコンボの1発目にするからです。
・これはコンボ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_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 AbilityのAbility Classから線を伸ばして変数へ昇格。この時点ではピンが単一。
Ability Classの詳細のピンを配列に変更する。注意書きが出ますが「変数の型を変更」を選択。
コンパイルしましょう。
配列にした変数Ability Classに、作成したアビリティを登録します。
左メニューの変数のAbility Classを選択し、右の詳細のデフォルト値 > Ability Classの+を選択。出現したインデックス[0]のNone欄にGA_ComboX1を指定。
同様にインデックス[1]を追加してGA_ComboX2を指定。インデックス[2]を追加してGA_ComboX3を指定。
インプットアクションからAbilityを発動させます。
・インプットアクションは好きなものを配置してください。UE5ではエンハンスドインプットアクションが主流ですが、マウスの左ボタンなどのノードでも可能です。
Attack.X.1~3まで全て有効化されていますが、Activation Required Tagsで制御されていて2と3は発動しません。つまり1発目の攻撃モーションが発動します。
GameplayAbility: GA_HitReactionBase
名前: 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にチェックを入れる。
・PlayMontageAndWaitのStart SectionをStartにしています。ヒットリアクションは即アニメーションに反映してほしいですから、AnimMontageの頭を切るためにStart Sectionを指定しています。
GameplayAbility(子): GA_HitReactionLeft
名前: GA_HitReactionLeft
・子ブループリント クラスとして新規作成。
Montage To Playを選択します。
GA_HitReactionLeftでは攻撃を受けた時に左に倒れるAnimMontageを指定します。対面する敵は左手側を振って攻撃している状態。
Hit Direction TagはAttack.HitDirection.Leftにします。このTagはプレイヤーの攻撃時のAnimMontageで通知されます。
Ability TagsはAttack.HitReactionにします。
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 LoopのAbility 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に対応したリアクションができます。
コメント