ARPG開発 012 敵のヒットリアクション

敵のヒットリアクションの実装と武器コリジョンの仕様を変更しました。

敵のヒットリアクションアニメーションを準備

敵が右から攻撃を受けた時と左から攻撃を受けた時のアニメーションシーケンスを用意します。

AnimMontageを作成しますが、そのまま使用すると攻撃を受けてから微妙な「間」があってヒットリアクションをする場合があります。
反応がない頭の「間」をカットするために、モンタージュの右で右クリックして新しいモンタージュセクションを追加し、名前をStartにしました。
AnimMontageの再生ノードでセクションをStartに設定することで頭の「間」がカットされます。

ちなみに↑の通知1にはゾンビが攻撃を受けた時の声を入れています。音の追加は右クリック > 通知を追加 > Play Soundです。

列挙型の作成と編集

コンテンツブラウザで右クリックしてブループリント > 列挙型を選択し、名前をEnum_HitDirectionにしました。

列挙子を追加して2つにします。
名前はForwardとBackward。
プレイヤーの攻撃が敵の前からなのか後ろからなのか判定させるために必要です。

Weapon Pointの設定

Weapon CollisionのON/OFF切替システムをやめて、Sphere Traceを使います。

BP_WeaponBaseの編集

BP_WeaponBaseを開き、コンポーネントにArrowを2つ追加。
名前をWeponTopPointとWeaponBottomPointにします。

BP_WeaponBatとAxeの編集

WeponTopPointを武器の先端の当たり判定にしたいところに移動。
WeaponBottomPointを武器の根元の当たり判定にしたいところに移動。
お互いX軸を向かい合わせます。
この先端から根元までがCollisionと同じ役目になります。
先端は武器の実寸よりも長めのところに置いたほうが良いでしょう。

プレイヤーブループリントを編集

ノードを組む 前半

Break Hit ResultHit Actor変数へ昇格させたところまで。
ノードを組む 後半

空振りでヒットリアクションが暴発しないように変数を作成しました。名前はAttackHit、型はBoolean。
変数HitDirectionを作成。型はEnum_HitDirection。
Apply DamageDamage CauserSelfを繋ぐ必要があります。繋ぎ忘れていて敵を倒した時にExpとMpが入手できていない状態になっていました。

ANS_SwordTraceLoopの作成と編集

コンテンツブラウザで右クリックしてブループリント クラス > AnimNotifyStateを選択。名前はANS_SwordTraceLoopにしました。

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

ノードを組む

Hit Directionから線を伸ばして選択するForwardBackward変数へ昇格させます。目玉アイコンも開けておきます。こうすることでAnimMontageの通知ステートに追加した時に、ForwardBackwardに分けてTagを選択できます。
Send Gameplay Event to ActorはプラグインのGameplay Abilitiesを導入していると使えるノードです。

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

ノードを組む

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

ノードを組む

GA_HitReactionBaseの作成と編集

コンテンツブラウザで右クリックしてブループリント クラス > GameplayAbilityを選択。名前はGA_HitReactionBaseにしました。

ノードを組む

PlayMontageAndWaitStart SectionをStartにしています。ヒットリアクションは即アニメーションに反映してほしいですから、AnimMontageの頭を切るためにStart Sectionを指定しています。

GA_HitReactionLeftとRightの作成と編集

GA_HitReactionBaseで右クリックして子ブループリント クラスを作成しますを選択。2つ作成してGA_HitReactionLeftとGA_HitReactionRightという名前にします。
GA_HitReactionLeftの編集
子ブループリントですからAnimMontageの選択とTagの設定だけです。
Tagの設定

Montage To Playを選択します。「Left」というのはプレイヤーが左側から攻撃した時です。それと対面している敵は右方向に倒れます。
Hit Direction TagはAttack.HitDirection.Leftにします。このTagはプレイヤーの攻撃時のAnimMontageで通知されます。
Ability TagsはAttack.HitReactionにします。
GA_HitReactionRightも同じようなやり方で設定します。

敵ブループリントの編集

コンポーネントにAbilitySystemを追加します。
ノードを組む

イベント BeginPlayから続くノードの最後から線を伸ばしてFor Each Loopを配置。
そのLoop Bodyから線を伸ばしてGive Abilityを配置。ターゲットはコンポーネントのAbilitySystemをGetして繋げる。
For Each LoopAbility Class変数へ昇格
ノードを組む
敵HPの処理の前にノードを追加します。
AbilityClassに登録

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

Tagsの登録

クラスのデフォルト > アクタ > Tagsを+して、インデックス[0]にDamageableと追加します。
プレイヤーブループリントのイベントグラフでActor Has Tagというノードを使って、この「Damageable」Tagを持っているアクターのみにダメージが当たるようにしています。

コリジョンの変更

Meshの詳細 > コリジョン > コリジョンプリセット > Collision Enabledをコリジョンを有効化(Query and Physics)にしました。

AnimMontageに追加

作成したANS_SwordTraceLoopをプレイヤーの攻撃に使っているAnimMontageに追加します。

通知トラックに通知ステートを追加で追加します。
当たり判定が出てほしい区間に設定する。

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

参考サイト

[UE5]攻撃時のリアクションをGAS(Gameplay Ability System)で実装する[逆引きUE] – YouTube
Unreal Engine 5 RPG Tutorial Series – #10: Sword Trace Damage and Hit Reactions – YouTube

大苦戦

自分が次やる時にパッと見れるようにこうやって記録を残していますが、今回は試行錯誤しすぎて、手順がちゃんとまとまっているか怪しいです。参考サイトを見直す必要があるかもしれません。

ただ、試行錯誤したなりの気付きと成長があったと思います。

コメント

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