ARPG開発 009 コリジョン設定

戦闘でダメージを与えたり受けたりするためにコリジョン設定をします。

プロジェクト設定

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

プレイヤーブループリントの編集

Mash (CharacterMesh0)のコリジョン設定

コンポーネントのMash (CharacterMesh0)を選択した状態で詳細 > コリジョンで設定。

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

BP_WeaponBaseの編集

WeaponColisionの追加

BP_WeaponBaseを開き、コンポーネントのWeaponMeshを選択した状態で+追加、Capsule Collisonを追加して、名前はWeaponCollisionにします。

コンポーネントのWeaponCollisionを選択した状態で詳細 > コリジョンで設定。

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

BP_WeaponBatとBP_WeaponAxeの編集

BP_WeaponBatの編集

WeaponCollisonでバットを包み込むだけです。
武器のコリジョンは大きめにするのが基本です。武器そのままのサイズにしてしまうと「当たってるのに当たり判定がない!」と錯覚しやすいです。

BP_WeaponAxeの編集

WeaponCollisonで斧を包み込むだけです。

エネミーブループリントの編集

私は敵ブループリントをBP_Enemyとしています。
アニメーションブループリントはABP_MannyをコピーしてABP_Enemyにしました。

Mash (CharacterMesh0)のコリジョン設定

コンポーネントのMash (CharacterMesh0)を選択した状態で詳細 > コリジョンで設定。

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

Weapon Collisionの設定

武器を持たせず、素手を武器にします。
コンポーネントにCapsule Collisionを2つ追加します。
名前をWeaponCollisionLeftHandとWeaponCollisionRightHandにしました。

WeaponCollisionLeftHandの詳細 > ソケット > 親ソケットで虫眼鏡アイコンをクリックしてhand_lを選択。
ビューポートを見ながらスケール調整して左手に合わせる。

WeaponCollisionRightHandの詳細 > ソケット > 親ソケットで虫眼鏡アイコンをクリックしてhand_rを選択。
ビューポートを見ながらスケール調整して左手に合わせる。

コンポーネントのWeaponCollisionLeftHandを選択した状態で詳細 > コリジョンで設定。

プレイヤーキャラクターと違うのは1ヵ所だけです。
Object TypeがEnemyAttackになります。

WeaponCollisionRightHandも同じように設定します。

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

AnimNotifyStateの作成と編集

コンテンツブラウザで右クリックしてブループリント クラスを選択。すべてのクラスの中からAnimNotifyStateを選択。名前はANS_WeaponCollisionにしました。

ANS_WeaponCollisionの編集

左メニューの関数オーバーライドの欄でReceived Notify Beginを選択。
NotifyStateは始点と終点の2つの点で管理します。Received Notify Beginは始点にあたります。

ノードを組む

Received Notify BeginMesh Compから線を伸ばしてGet Ownerを配置。そのReturn ValueからCast To BP_Playerを配置。Received Notify BeginCast To BP_Playerを繋ぐ。
Cast To BP_PlayerAs BP Playerから線を伸ばしてCurrent Weaponを取得、さらに線を伸ばしてWeapon Collisionを取得
Weapon Collisionから線を伸ばしてSet Collision Enabledを配置。New Typeがコリジョンなしになっていますからコリジョンを有効化(Query and Physics)にする。
Cast To BP_PlayerSet Collision Enabledを繋ぐ。
Set Collision Enabledリターンノードを繋ぐ。
これはANS_WeaponCollisionの通知ステートの始点です。この始点で武器のコリジョンが有効化されたわけです。
この後のReceived Notify Endで何をやるかもわかるはずです。
左メニューの関数オーバーライドの欄でReceived Notify Endを選択。
NotifyStateは始点と終点の2つの点で管理します。Received Notify Beginは終点にあたります。
ノードを組む

eceived Notify Beginとほぼ同じですから、ほぼコピペで組めます。1つだけ違うのはSet Collision EnabledのNew Typeをコリジョンをなしにする。
ANS_WeaponCollisionの通知ステートの終点で再びコリジョンを無効化したわけです。

AnimMontageにANS_WeaponCollisionを追加する

攻撃モーションで使っているAnimMontageにANS_WeaponCollisionを追加します。

通知*の右のスペースで右クリックして、通知ステートを追加 > ANS_WeaponCollisionを選択。
言うまでもなく、武器に当たり判定が出てほしいところに追加しましょう。
振る前や振りきった後に当たり判定があると不格好です。

Struct_WeponDataを編集

武器ごとに攻撃力を変えたいので、Struct_WeponDataに+変数を追加。
名前はAttack、型はFloat。

BP_WeaponBatとBP_WeaponAxeの編集

まずBP_WeaponBaseでコンパイルして変更を反映してから、BP_WeaponBatとBP_WeaponAxeの詳細 > デフォルト > Weapon Data > Attackの値を入力。

BP_WeaponBaseの編集

オーバーラップイベントを作成

コンポーネントのWeaponCollisionを選択した状態で詳細 > イベント > On Component Begin Overlapを+して配置。

ノードを組む
On Component Begin Overlapから線を伸ばしてApply Damageを配置。
Other ActorDamaged Actorを繋ぐ。
変数Player RefをGetして、まずDamage Causerに繋ぐ。ダメージを与えた人ですからプレイヤーです。
Player Refから線を伸ばしてAttackを取得。プレイヤーの攻撃力を取得します。
変数WeaponDataをGetし、右クリックして構造体ピンを分割Weapon Data Attackから線を伸ばして加算する(+)を配置。左下はAttackを取得を繋ぐ。右から線を伸ばしてBase Damageに繋ぐ。
プレイヤーの攻撃力と武器の攻撃力を足してトータルダメージになります。

敵ブループリントの編集

ノードを組む

イベント AnyDamageを配置。Apply Damageと連動して発生するイベントです。
変数を作成します。名前はHp、型はFloat、デフォルト値は100にします。
変数HpをGetし、そこから線を伸ばして-キーを押して減算する(-)イベント AnyDamageDamageを減算するの左下に繋げる。
変数HpをSetし、イベント AnyDamageから線を伸ばして左上、減算する(-)から線を伸ばして左下に繋ぐ。
セット(Hp)の右上から線を伸ばしてブランチを配置。
セット(Hp)の右下から線を伸ばして>キーを押してより大きい(>)を配置。そこからブランチConditionに繋ぐ。
ノードを組む 敵の死亡処理
生死を判定するブランチのFalse(死)以降を追加しました。

Set All Bodies Simulate Physicsでラグドール化して、Set Collision Enableでコリジョンをフィジックスのみにしています。
忘れてはいけないのが、敵が死亡時にGet ExpGet MPを繋いで値を入力し、プレイヤーにExpとMpを入れること。これらのターゲットはDamage Causerです。
最後はDelayで5秒待った後、Destroy Actorでアクターを削除しています。

簡単

過去に自分がまとめたチュートリアルを見ながらやるだけなので簡単でした。久しぶりに何のトラブルもなくスムーズに完了。
完璧に頭に入っているわけではないので、やはり自分自身の作業工程の記録は大事です。

コメント

  1. Charles Deluca より:

    great article

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