敵のヒットリアクションの実装と武器コリジョンの仕様を変更しました。
敵のヒットリアクションアニメーションを準備
敵が右から攻撃を受けた時と左から攻撃を受けた時のアニメーションシーケンスを用意します。
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と同じ役目になります。
先端は武器の実寸よりも長めのところに置いたほうが良いでしょう。
プレイヤーブループリントを編集
空振りでヒットリアクションが暴発しないように変数を作成しました。名前はAttackHit、型はBoolean。
変数HitDirectionを作成。型はEnum_HitDirection。
Apply DamageのDamage CauserにSelfを繋ぐ必要があります。繋ぎ忘れていて敵を倒した時にExpとMpが入手できていない状態になっていました。
ANS_SwordTraceLoopの作成と編集
コンテンツブラウザで右クリックしてブループリント クラス > AnimNotifyStateを選択。名前はANS_SwordTraceLoopにしました。
関数オーバーライドのReceived_NotifyTickを追加。
これはAnimMontageの通知ステートで自分の攻撃の方向を選択できるものです。
Hit Directionから線を伸ばして選択するのForwardとBackwardは変数へ昇格させます。目玉アイコンも開けておきます。こうすることでAnimMontageの通知ステートに追加した時に、ForwardとBackwardに分けてTagを選択できます。
Send Gameplay Event to ActorはプラグインのGameplay Abilitiesを導入していると使えるノードです。
関数オーバーライドのReceived_NotifyBeginを追加。
これは武器のTraceを有効にするノードです。
関数オーバーライドのReceived_NotifyEndを追加。
これは武器のTraceを無効にするノードです。
GA_HitReactionBaseの作成と編集
コンテンツブラウザで右クリックしてブループリント クラス > GameplayAbilityを選択。名前はGA_HitReactionBaseにしました。
PlayMontageAndWaitのStart SectionをStartにしています。ヒットリアクションは即アニメーションに反映してほしいですから、AnimMontageの頭を切るためにStart Sectionを指定しています。
GA_HitReactionLeftとRightの作成と編集
GA_HitReactionLeftの編集
Montage To Playを選択します。「Left」というのはプレイヤーが左側から攻撃した時です。それと対面している敵は右方向に倒れます。
Hit Direction TagはAttack.HitDirection.Leftにします。このTagはプレイヤーの攻撃時のAnimMontageで通知されます。
Ability TagsはAttack.HitReactionにします。
敵ブループリントの編集
イベント BeginPlayから続くノードの最後から線を伸ばしてFor Each Loopを配置。
そのLoop Bodyから線を伸ばしてGive Abilityを配置。ターゲットはコンポーネントのAbilitySystemをGetして繋げる。
For Each LoopのAbility Classは変数へ昇格。
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 #アンリアルエンジン pic.twitter.com/JvhsQDserW
— ハマーキーUE (@Hummerkey_UE) August 9, 2023
参考サイト
[UE5]攻撃時のリアクションをGAS(Gameplay Ability System)で実装する[逆引きUE] – YouTube
Unreal Engine 5 RPG Tutorial Series – #10: Sword Trace Damage and Hit Reactions – YouTube
大苦戦
自分が次やる時にパッと見れるようにこうやって記録を残していますが、今回は試行錯誤しすぎて、手順がちゃんとまとまっているか怪しいです。参考サイトを見直す必要があるかもしれません。
ただ、試行錯誤したなりの気付きと成長があったと思います。
コメント