敵にダメージを与える

コンボ攻撃の作り方の続きです。敵にダメージを与えられるようにします。

Unreal Engineのバージョンは5.2.1です。

プロジェクト設定

編集 > プロジェクト設定 > エンジン > コリジョンを開く。
Object Channelsで「新規のオブジェクトチャンネル」を2つ追加します。
名前はPlayerAttackとEnemyAttack。
デフォルト応答は両方とも「無視する」。

プレイヤーキャラクターのブループリントを編集

武器を持たせる
ビューポートを開く。
コンポーネントのMash (CharacterMesh0)を選択した状態で+追加をクリックし、Skeletal Meshを追加します。名前はSwordMeshにしました。

SwordMeshを選択した状態で詳細を見る。
メッシュ > Skeletal Mesh AssetにWeapon_Swordを指定。これはFrank Action RPG Sword 1 (Basic Set)に含まれているものです。

詳細のソケット > 親ソケットでフォルダ&虫眼鏡アイコンをクリックし、hand_rを選択。
ビューポート上のWeapon_Swordがhand_rボーンに近づきます。

ビューポートでWeapon_Swordの位置調整をして、右手に合わせてください。
「パースペクティブ」の左の三をクリックして、「リアルタイム」のチェックを外すと動きが止まって合わせやすいです。
きちんと合わせる必要はありません。この棒立ちのアニメーションは剣を持つためのものではありませんから、どう持たせてもおかしくなりますし、走ると剣が体を貫通します。ちゃんとした剣戟のゲームを作るなら、構えたり歩いたり走ったりするのも専用のアニメーションにしておく必要があります。
コリジョン設定
武器にコリジョンを追加
SwordMeshを選択した状態で+追加をクリックし、Capsule Collitionを追加します。名前はWeaponCollisionにしました。
ビューポートでWeaponCollisionの位置調整とサイズ調整をして、武器を包み込むように合わせてください。WeaponCollisionは武器より大きい方が良いです。武器にきっちり合わせてしまうと、ゲームプレイした時に「剣が当たっているのにダメージ判定がない!」と錯覚しやすいです。
武器のコリジョンプリセット
コンポーネントのWeaponCollisionを選択した状態で詳細 > コリジョンで設定。

コリジョン > Generate Overlap Eventsにチェックを入れる。何かに重なった時にイベントが発生できるようにします。
コリジョンプリセットをCustomにする。
Collision Enabledをコリジョンなしにする。剣が振られている時のみコリジョンを有効にしたいからです。
Object TypeをPlayerAttackにする。PlayerAttackが表示されていない時はコンパイルしてください。PlayerAttackにすることで、自分自身には当たり判定をなくします。
その下、Visibility~EnemyAttackまでの項目。ここはPawnだけをオーバーラップにして、それ以外は全て無視する。つまり、この武器はPawnに対してのみ当たり判定があります。
Mash (CharacterMesh0)のコリジョン設定
キャラクターのコリジョンプリセット
コンポーネントのMash (CharacterMesh0)を選択した状態で詳細 > コリジョンで設定。

コリジョン > Generate Overlap Eventsにチェックを入れる。何かに重なった時にイベントが発生できるようにします。
コリジョンプリセットをCustomにする。
Object TypeをPawnにする。
その下、Visibility~EnemyAttackまでの項目。ここはEnemyAttackだけをオーバーラップにして、それ以外は初期設定のまま。
武器のObject TypeをPlayerAttackにしており、キャラクターのコリジョンプリセットではPlayerAttackは無視となっています。つまり自分の武器からダメージは受けません。

敵キャラクターのコリジョン設定

敵キャラクターのブループリントを用意する

コンテンツ > CharactersにEnemyというフォルダを作りました。
BP_Playerを複製してBP_Enemyとし、Enemyフォルダに入れました。
コンポーネントのCameraBoomとFollowCameraは削除して構いません。
敵の武器のコリジョンプリセット
コンポーネントのWeaponCollisionを選択した状態で詳細 > コリジョンで設定。

プレイヤーキャラクターと違うのは1ヵ所だけです。
Object TypeがEnemyAttackになります。
敵キャラクターのコリジョンプリセット
コンポーネントのMash (CharacterMesh0)を選択した状態で詳細 > コリジョンで設定。

ここもプレイヤーキャラクターと違うのは1ヵ所だけです。PlayerAttackをオーバーラップにして、EnemyAttackは無視する。

攻撃中のみ武器のコリジョンを有効にする設定

AnimNotifyStateの作成

Blueprintsフォルダで右クリックしてブループリント クラスを選択。すべてのクラスの中からAnimNotifyStateを選択。名前はANS_WeaponCollisionにしました。
WeaponCollisionの編集
Received Notify Beginを選択
ANS_WeaponCollisionを開く。
左メニューの関数オーバーライドの欄でReceived Notify Beginを選択。
NotifyStateは始点と終点の2つの点で管理します。Received Notify Beginは始点にあたります。
ノードを組む

Received Notify BeginのMesh Compから線を伸ばしてGet Ownerを配置。そのReturn ValueからCast To BP_Playerを配置。人によってキャラクターのブループリントの名前が違いますからBP_Playerのところを自分のキャラクターのブループリントの名前で探してください。
Received Notify BeginとCast To BP_Playerを繋ぐ。
Cast To BP_PlayerのAs BP Playerから線を伸ばしてWeapon Collisionを取得(Get Weapon Collision)。
Weapon Collisionから線を伸ばしてSet Collision Enabledを配置。New Typeがコリジョンなしになっていますからコリジョンを有効化(Query and Physics)にする。
Cast To BP_PlayerとSet Collision Enabledを繋ぐ。
Set Collision Enabledとリターンノードを繋ぐ。
これはANS_WeaponCollisionの通知ステートの始点です。この始点で武器のコリジョンが有効化されたわけです。
この後のReceived Notify Endで何をやるかもわかるはずです。
Received Notify Endを選択
左メニューの関数オーバーライドの欄でReceived Notify Endを選択。
NotifyStateは始点と終点の2つの点で管理します。Received Notify Beginは終点にあたります。
ノードを組む
Received Notify Beginとほぼ同じですから、ほぼコピペで組めます。1つだけ違うのはSet Collision EnabledのNew Typeをコリジョンをなしにする。
ANS_WeaponCollisionの通知ステートの終点で再びコリジョンを無効化したわけです。

AnimMontageにANS_WeaponCollisionを追加する

AnimMontageにANS_WeaponCollisionの通知ステートを追加

前回の記事『コンボ攻撃の作り方』の続きでやっている人は通知2まで使用済です。通知2の右の▼トラックをクリックして通知トラックを挿入する。
通知3の右のスペースで右クリックして、通知ステートを追加 > ANS_WeaponCollisionを選択。
言うまでもなく、剣に当たり判定が出てほしいところに追加しましょう。
振る前や振りきった後に当たり判定があると不格好です。
攻撃に使用している全てのAnimMontageにANS_WeaponCollisionを追加する必要があります。

プレイヤーキャラクターのオーバーラップイベントを作成

OnComponentBeginOverlapを追加

プレイヤーキャラクターのブループリントを開く。
WeaponCollisionを選択した状態で右クリックしてイベントを追加 > OnComponentBeginOverlapを追加。このコリジョンが敵に触れた時に発生するイベントです。
ノードを組む
剣が敵にヒットした時に敵にダメージを与えます。

On Component Begin Overlapから線を伸ばしてApply Damageを配置。
Base Damageはヒットした時に与えるダメージです。0だと反応しませんから10.0にしておきます。
Damaged ActorをOn Component Begin OverlapのOther Actorに繋ぐ。

攻撃を受けた時に再生されるAnimMontageを作成

敵が攻撃を受けた時に再生されるAnimMontageが必要です。
今回は36_Frank_ActionRPG_Sword_Hit_01をリターゲットし、AnimMontageを作成しました。

敵キャラクターのダメージ処理

変数の追加 HP(Float)

敵キャラクターのブループリントを開き、左メニューの変数を+して変数を追加します。名前はHPです。Floatです。
コンパイルしてから詳細を見て、デフォルト値を50にしておきます。
ノードを組む
敵がダメージを受けて死んだりする処理です。

BP_Enemy(※敵キャラクターのブループリント)の空いているところにイベント AnyDamageを配置。さっき作成したApply Damageと連動して発生するイベントです。
変数のHPをドラッグ&ドロップでGet配置。そこから線を伸ばして-キーを押して「減算する」を配置。
イベント AnyDamageのDamageを減算するの左下に繋げる。
変数のHPをドラッグ&ドロップでSet配置し、イベント AnyDamageから線を伸ばして左上、減算するから線を伸ばして左下に繋ぐ。
Set HPの右上から線を伸ばしてBキーを押してブランチを配置。
Set HPの右下から線を伸ばして>キーを押して「より大きい」を配置。そこからブランチのConditionに繋ぐ。
ブランチのTrue(生きてる)とFalse(死んでいる)からの線は仮のものです。ダメージリアクションや死亡処理は、もっとちゃんと作ったほうが良いでしょう。

これでテストプレイするとプレイヤーの攻撃が5回当たると敵が死にます。

コメント

  1. Matthew Harby より:

    great article

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