【UE4】攻撃判定の実装

アニメーションモンタージュによる連続攻撃の実装を以前行ったので、今回は攻撃判定を実装し敵を攻撃できるようにしてみたいと思います。
※画像はクリックで拡大できます
攻撃判定用コリジョンの追加
攻撃判定用にBoxコリジョンをキャラクタークラスに追加します。このBoxコリジョンが敵キャラのコリジョンにオーバーライドした時にHitイベント発生させます。
今回使用しているキャラクターが両手にそれぞれ武器を持っているので、とりあえずその近くに配置しておきます。後でブループリントによる制御で座標をセットするので仮で置きます。
キャラクターのスケルトンにソケットを追加
キャラクターのスケルトンをダブルクリックしてスケルトン編集画面を開き、スケルトンツリーを確認します。
今回使用するキャラクターは左右の武器用ボーンが既に含まれている状態でしたので、そのボーンを右クリックして「ソケットを追加」を選択してソケットを追加します。
武器が含まれていない場合は、手のボーンにソケットを追加して武器のメッシュをソケットにアタッチする事で武器を持たせる事ができます。
今回は武器のボーンに攻撃判定コリジョンを設置するための座標取得を目的に、ソケットを追加しています。

ブループリントでソケットの座標を攻撃判定用コリジョンにセット
キャラクタークラスのブループリントで先程追加したソケットのワールド座標を、攻撃判定用コリジョンの座標にセットします。
これで攻撃アニメーションに攻撃判定用コリジョンが追従するようになりました。
アニメーション通知による攻撃判定コリジョンの制御
キャラクターの攻撃アニメーションを制御しているアニメーションモンタージュの通知に、攻撃判定コリジョンの有効、無効を設定する通知を設定します。
この通知が来た時に、攻撃判定コリジョンの有効、無効を切り替える事で特定のタイミングで当たり判定を行う事ができます。
キャラクターのアニメーションBPに通知を受けた際の処理を実装します。
アニメーションBPで呼び出している「Set Attack Collision R」と 「Set Attack Collision L」は、キャラクタークラスの方で実装している各コリジョンコンポーネントに「Set Collision Enabled」する関数です。
攻撃を受ける敵側の処理
敵のキャラクタークラスのブループリントに、プレイヤーキャラの攻撃判定コリジョンが重なった時の処理を記載します。
On Component Begin Overlapによって、重なったコリジョンコンポーネントを取得して「Component Has Tag」で重なったコンポーネントを判別しています。
攻撃を行うプレイヤーキャラのキャラクタークラスから 「Set Attack Collision R」と 「Set Attack Collision L」を呼び出し、攻撃がヒットした段階で攻撃判定用コリジョンを無効にしています。 これで多段にヒットする事を防いでいます。
敵キャラの状態を「Hit」状態にし、イベントディスパッチャー「HitDispatcher」を作成し呼び出す事で、アニメーションBP側で HitDispatcherにバインドしたカスタムイベントで攻撃Hit時のアニメーションを再生させます。
攻撃判定用コリジョンコンポーネントにTagをセット
「Component Has Tag」で攻撃判定用コリジョンである事を判別するため、プレイヤーのキャラクタークラスに用意したボックスコリジョン「R_WBoxCollision」と「L_WBoxCollision」にタグを設定しています。
攻撃Hit時のアニメーション
敵キャラのキャラクタークラスで攻撃ヒット時、イベントディスパッチャー「HitDispatcher」を作成し呼び出しているので、アニメーションBPでHitDispatcherにカスタムイベント「HitEvent」を作成しバインドします。バインドは初期化時に一回行えば大丈夫のようです。
カスタムイベント「HitEvent」ではスロットアニメーションの再生を行っています。以前アニメーションモンタージュを再生しましたが、それの単品版といった感じです。
「Play Slot Animation」で指定のアニメーションを再生、アニムグラフで呼び出すのに必要なスロットノード名を設定します。
「AnimNotify_Enemy1HitEnd」は攻撃Hit時アニメのアニメーション終了を知らせる通知イベントです。この通知が来たら「Stop Slot Animation」でスロットアニメーションの再生を終了します。
アニムグラフの方で、「Play Slot Animation」で指定したノード名のスロットアニメーションを呼び出します。
攻撃してみる
攻撃する側とされる側の準備ができたので、早速攻撃してみます。
ちゃんと攻撃アニメーションに合わせて、攻撃がHitするよう実装できました!!
ディスカッション
コメント一覧
参考になりました!
BoxCollisionはMeshの子Componentにして
Parent Socketを設定すれば、追従処理は省略できそうですね。
コメントありがとうございます!
恥ずかしながら、Parent Socketの存在を知りませんでしたorz
Parent Socketに武器用のソケットを指定する方法で、攻撃判定用コリジョンの追従処理が省略できる事に気づく事ができました。
こちらの方がスマートですね、ありがとうございます!m(__)m