Chapter 19

剣で攻撃を実装する方法【UE5,UE4】

daichi_gamedev
daichi_gamedev
2021.10.01に更新

※UE4でも同じやり方です。

https://www.youtube.com/watch?v=eGnWkyxcP8g
動画でも解説しています↑

こんな攻撃を実装していきます↓

相手(敵)に剣のコリジョンが触れた時、ダメージをくらうアニメーションを再生させるといった事を実装します。おおまかな実装手順としては

①剣をプレイヤーに装備する
②剣のコリジョンを作成する
③攻撃アニメーションをプレイヤーにつける
④当たり判定をつけて、ダメージを与える

です。

剣で攻撃を実装する手順↓

今回はThirdPersonのテンプレートを使用して作っていきます。結構長いです。

①今回は以下の剣の3Dモデル、アニメーションを用意

剣とアニメーションを用意されている事を前提に進めていきます。今回は例として以下のものを使用します。

・剣の3Dモデル→マーケットプレイスの無料のアセットFree Fantasy Weapon Sample Pack
・攻撃するアニメーション「Sword and Shield Slash」
・攻撃された時のアニメーション「Hit to body」
・攻撃されて死んだ時のアニメーション「Sword and shield death」

アニメーションを以上と同じ物を使用する場合はMixaomからUEにアニメーションを持ってくる方法をご覧になってリターゲットしてください。オリジナルのアセットでももちろんかまいません。

②剣をプレイヤーに装備

①グレイマンのスケルタルメッシュを開いて右上でスケルトンアイコンを選択し、skeletontreeを開きます。

②右手となるリグ(hand_r)を右クリックしてAddsocketをクリック。

③作成したソケットから右クリックしてAddPreviewAssetから剣のスタティックメッシュを選択します。

④剣が追加されたので適当に正しい位置になるように角度なり調整します。

左上のPreviewMeshから剣の攻撃アニメーションを選択して実際のアニメーションでも剣の位置、角度が正しいか確認する事ができます。

③親の武器ブループリントとなるBaseWeaponを作成

今回、複数の剣を切り替えられるように親のブループリントと子のブループリントを用意します。まずは親から作成します。
コンテンツブラウザで右クリックでBluePrint Class > Actorを選択

BaseWeaponという名前にします。

BaseWeaponのブループリントを開いてStaticMeshコンポーネントを追加。名前をSwordに。

さらにBoxコンポーネントを追加して名前をSwordCollisionに。

④子の武器ブループリントを作成

次に子のブループリントを作成します。BaseWeaponから右クリックからCreate child blueprint

名前をBaseWeapon_Sword1に変更

開くとコンポーネントが継承されているのがわかります。継承されると親のコンポーネントをそのまま引き継がれます。

メッシュを選択します。

剣のメッシュを適用

Swordcollisionコンポーネントを選択して

剣のコリジョンの大きさ、位置を調整して以下にしてコンパイル。

BaseWeaponブループリントのSwordとSwordCollisionコンポーネントのCollisionをNoCollisionにする。

⑤プレイヤーのブループリントに剣を装備

グレイマンのブループリントでAddcomponentからMeshコンポーネントの子にchildactorを作成

childactorから先ほど作成した子の武器Sword1を選択

Parent Socketを先ほど作成した右手のソケットに選択

transformの値を0にする。

⑥剣のノードを作成

親のブループリント(BaseWeapon)を開いてVariablesからSwordDamageのfloatを作成します。コンパイルします。

武器毎にダメージは変化させたいので子のブループリントを開いてDeatailsからsworddamegeを10に設定

BlueprintUEにノードを貼ったのでこれをBaseWeaponにコピペしてください。解説もコメントしています。(詳細 & コピーはこちら)

そのままだとエラーを吐くので変数のみ修正します。sworddamageの変数とswordcollisionを一度ノードを削除して置き換えます。上の画像やブループリントUEを参考にして修正してください。

⑦用意したアニメーションからモンタージュを作成

最初に言った「攻撃、ヒット、死ぬ」三つのリターゲット済みのアニメーションからCreate Anim montageでモンタージュを作成します。

⑧プレイヤーのブループリントを作成

プレイヤーの攻撃する処理をグレイマンのブループリントに追加します。(コピー & 詳細はこちらから)

AnimMontageの箇所に攻撃アニメーションを追加

AnimBPを開いてAnimGrafを開きます。


Slot DefalutSlotを中央に入れて以下のように繋げます。

コンパイルしたら以下のように再生されます。

⑧AnimNotifyブループリントを作成する

コンテンツブラウザでblueprintからAnimNotifyStateを選択してブループリントを作成します。名前はDamageNotifyにします。

開いてFunctionsのOverrideからNotifyBeginとEndを追加します。

NotifyBeginには以下のブループリントを追加します。(詳細はこちらから)以下の画像の状態に調整します。

NotifyEndには以下のブループリントを追加します。(詳細はこちらから)以下の画像の状態に調整します。

コンパイルします。

⑨AnimNotifyをアニメーションに設定にする

攻撃するアニメーションモンタージュを開いて

アニメーションの攻撃モーションに入るあたりでNotifiesの下の1のタイムラインで右クリックからAddnotifystate > DamageNotifyを選択。

攻撃終わるあたりにDamageNotifyの終わりを調整します。

⑩グレイマンにダメージを受ける処理を追加

ダメージを受ける処理とダメージを自分は受けないようにする処理を追加しておきましょう。
まずはグレイマンのサードパーソンブループリントからfloatのhealth変数を作成します。

DetailsからdefalutValueを30にします。

プレイヤーのブループリントに以下を追加します(コピー & 詳細はこちらから)

health変数をつけ直して、PlayAnimMontageの箇所にそれぞれのアニメーションモンタージュを代入します。

⑪グレイマンのブループリントをゲームに追加して試す


プレイヤーのブループリント拡張版

プレイヤーは現状、連続でマウスを押すとアニメーションがリセットされたりジャンプ中も再生されてしまうので以下のノードすると問題解決します。音も再生出来ます。以下のサードパーソンについているノードを削除して

こちらのブループリントに変更します。(コピー & 詳細はこちらから)

参考になる動画

https://www.youtube.com/watch?v=Lx_JvUuZCbo&t=201s

著者コメント
お疲れ様でした。非常に長くなってしまったのですが、剣で攻撃するならこの方法がいいんじゃないかなと思います。この記事書くだけで2日以上費やしてしまいました🤣さあこれから解説動画作りたいと思います📺