コンボ攻撃の作り方の続きです。敵にダメージを与えられるようにします。
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の位置調整をして、右手に合わせてください。
「パースペクティブ」の左の三をクリックして、「リアルタイム」のチェックを外すと動きが止まって合わせやすいです。
きちんと合わせる必要はありません。この棒立ちのアニメーションは剣を持つためのものではありませんから、どう持たせてもおかしくなりますし、走ると剣が体を貫通します。ちゃんとした剣戟のゲームを作るなら、構えたり歩いたり走ったりするのも専用のアニメーションにしておく必要があります。
コンポーネントの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は武器より大きい方が良いです。武器にきっちり合わせてしまうと、ゲームプレイした時に「剣が当たっているのにダメージ判定がない!」と錯覚しやすいです。
SwordMeshを選択した状態で+追加をクリックし、Capsule Collitionを追加します。名前はWeaponCollisionにしました。
ビューポートでWeaponCollisionの位置調整とサイズ調整をして、武器を包み込むように合わせてください。WeaponCollisionは武器より大きい方が良いです。武器にきっちり合わせてしまうと、ゲームプレイした時に「剣が当たっているのにダメージ判定がない!」と錯覚しやすいです。
武器のコリジョンプリセット
コンポーネントのWeaponCollisionを選択した状態で詳細 > コリジョンで設定。
コリジョン > Generate Overlap Eventsにチェックを入れる。何かに重なった時にイベントが発生できるようにします。
コリジョンプリセットをCustomにする。
Collision Enabledをコリジョンなしにする。剣が振られている時のみコリジョンを有効にしたいからです。
Object TypeをPlayerAttackにする。PlayerAttackが表示されていない時はコンパイルしてください。PlayerAttackにすることで、自分自身には当たり判定をなくします。
その下、Visibility~EnemyAttackまでの項目。ここはPawnだけをオーバーラップにして、それ以外は全て無視する。つまり、この武器はPawnに対してのみ当たり判定があります。
コンポーネントの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は無視となっています。つまり自分の武器からダメージは受けません。
コンポーネントの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は削除して構いません。
コンテンツ > CharactersにEnemyというフォルダを作りました。
BP_Playerを複製してBP_Enemyとし、Enemyフォルダに入れました。
コンポーネントのCameraBoomとFollowCameraは削除して構いません。
敵の武器のコリジョンプリセット
コンポーネントのWeaponCollisionを選択した状態で詳細 > コリジョンで設定。
プレイヤーキャラクターと違うのは1ヵ所だけです。
Object TypeがEnemyAttackになります。
コンポーネントのWeaponCollisionを選択した状態で詳細 > コリジョンで設定。
プレイヤーキャラクターと違うのは1ヵ所だけです。
Object TypeがEnemyAttackになります。
敵キャラクターのコリジョンプリセット
コンポーネントのMash (CharacterMesh0)を選択した状態で詳細 > コリジョンで設定。
ここもプレイヤーキャラクターと違うのは1ヵ所だけです。PlayerAttackをオーバーラップにして、EnemyAttackは無視する。
コンポーネントのMash (CharacterMesh0)を選択した状態で詳細 > コリジョンで設定。
ここもプレイヤーキャラクターと違うのは1ヵ所だけです。PlayerAttackをオーバーラップにして、EnemyAttackは無視する。
攻撃中のみ武器のコリジョンを有効にする設定
AnimNotifyStateの作成
Blueprintsフォルダで右クリックしてブループリント クラスを選択。すべてのクラスの中からAnimNotifyStateを選択。名前はANS_WeaponCollisionにしました。
Blueprintsフォルダで右クリックしてブループリント クラスを選択。すべてのクラスの中からAnimNotifyStateを選択。名前はANS_WeaponCollisionにしました。
WeaponCollisionの編集
Received Notify Beginを選択
ANS_WeaponCollisionを開く。
左メニューの関数オーバーライドの欄でReceived Notify Beginを選択。
NotifyStateは始点と終点の2つの点で管理します。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とリターンノードを繋ぐ。
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を選択
左メニューの関数オーバーライドの欄でReceived Notify Endを選択。
NotifyStateは始点と終点の2つの点で管理します。Received Notify Beginは終点にあたります。
左メニューの関数オーバーライドの欄でReceived Notify Endを選択。
NotifyStateは始点と終点の2つの点で管理します。Received Notify Beginは終点にあたります。
ノードを組む
Received Notify Beginとほぼ同じですから、ほぼコピペで組めます。1つだけ違うのはSet Collision EnabledのNew Typeをコリジョンをなしにする。
Received Notify Beginとほぼ同じですから、ほぼコピペで組めます。1つだけ違うのはSet Collision EnabledのNew Typeをコリジョンをなしにする。
ANS_WeaponCollisionの通知ステートの終点で再びコリジョンを無効化したわけです。
AnimMontageにANS_WeaponCollisionを追加する
AnimMontageにANS_WeaponCollisionの通知ステートを追加
前回の記事『コンボ攻撃の作り方』の続きでやっている人は通知2まで使用済です。通知2の右の▼トラックをクリックして通知トラックを挿入する。
通知3の右のスペースで右クリックして、通知ステートを追加 > ANS_WeaponCollisionを選択。
言うまでもなく、剣に当たり判定が出てほしいところに追加しましょう。
振る前や振りきった後に当たり判定があると不格好です。
前回の記事『コンボ攻撃の作り方』の続きでやっている人は通知2まで使用済です。通知2の右の▼トラックをクリックして通知トラックを挿入する。
通知3の右のスペースで右クリックして、通知ステートを追加 > ANS_WeaponCollisionを選択。
言うまでもなく、剣に当たり判定が出てほしいところに追加しましょう。
振る前や振りきった後に当たり判定があると不格好です。
攻撃に使用している全てのAnimMontageにANS_WeaponCollisionを追加する必要があります。
プレイヤーキャラクターのオーバーラップイベントを作成
OnComponentBeginOverlapを追加
プレイヤーキャラクターのブループリントを開く。
WeaponCollisionを選択した状態で右クリックしてイベントを追加 > OnComponentBeginOverlapを追加。このコリジョンが敵に触れた時に発生するイベントです。
プレイヤーキャラクターのブループリントを開く。
WeaponCollisionを選択した状態で右クリックしてイベントを追加 > OnComponentBeginOverlapを追加。このコリジョンが敵に触れた時に発生するイベントです。
ノードを組む
剣が敵にヒットした時に敵にダメージを与えます。
On Component Begin Overlapから線を伸ばしてApply Damageを配置。
Base Damageはヒットした時に与えるダメージです。0だと反応しませんから10.0にしておきます。
Damaged ActorをOn Component Begin OverlapのOther Actorに繋ぐ。
剣が敵にヒットした時に敵にダメージを与えます。
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を作成しました。
今回は36_Frank_ActionRPG_Sword_Hit_01をリターゲットし、AnimMontageを作成しました。
敵キャラクターのダメージ処理
変数の追加 HP(Float)
敵キャラクターのブループリントを開き、左メニューの変数を+して変数を追加します。名前はHPです。Floatです。
コンパイルしてから詳細を見て、デフォルト値を50にしておきます。
敵キャラクターのブループリントを開き、左メニューの変数を+して変数を追加します。名前はHPです。Floatです。
コンパイルしてから詳細を見て、デフォルト値を50にしておきます。
ノードを組む
敵がダメージを受けて死んだりする処理です。
BP_Enemy(※敵キャラクターのブループリント)の空いているところにイベント AnyDamageを配置。さっき作成したApply Damageと連動して発生するイベントです。
変数のHPをドラッグ&ドロップでGet配置。そこから線を伸ばして-キーを押して「減算する」を配置。
イベント AnyDamageのDamageを減算するの左下に繋げる。
変数のHPをドラッグ&ドロップでSet配置し、イベント AnyDamageから線を伸ばして左上、減算するから線を伸ばして左下に繋ぐ。
Set HPの右上から線を伸ばしてBキーを押してブランチを配置。
Set HPの右下から線を伸ばして>キーを押して「より大きい」を配置。そこからブランチのConditionに繋ぐ。
ブランチのTrue(生きてる)とFalse(死んでいる)からの線は仮のものです。ダメージリアクションや死亡処理は、もっとちゃんと作ったほうが良いでしょう。
敵がダメージを受けて死んだりする処理です。
BP_Enemy(※敵キャラクターのブループリント)の空いているところにイベント AnyDamageを配置。さっき作成したApply Damageと連動して発生するイベントです。
変数のHPをドラッグ&ドロップでGet配置。そこから線を伸ばして-キーを押して「減算する」を配置。
イベント AnyDamageのDamageを減算するの左下に繋げる。
変数のHPをドラッグ&ドロップでSet配置し、イベント AnyDamageから線を伸ばして左上、減算するから線を伸ばして左下に繋ぐ。
Set HPの右上から線を伸ばしてBキーを押してブランチを配置。
Set HPの右下から線を伸ばして>キーを押して「より大きい」を配置。そこからブランチのConditionに繋ぐ。
ブランチのTrue(生きてる)とFalse(死んでいる)からの線は仮のものです。ダメージリアクションや死亡処理は、もっとちゃんと作ったほうが良いでしょう。
これでテストプレイするとプレイヤーの攻撃が5回当たると敵が死にます。
コメント
great article