戦闘でダメージを与えたり受けたりするためにコリジョン設定をします。
プロジェクト設定
編集 > プロジェクト設定 > エンジン > コリジョンを開く。
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 BeginのMesh Compから線を伸ばしてGet Ownerを配置。そのReturn ValueからCast To BP_Playerを配置。Received Notify BeginとCast To BP_Playerを繋ぐ。
Cast To BP_PlayerのAs BP Playerから線を伸ばしてCurrent Weaponを取得、さらに線を伸ばしてWeapon Collisionを取得。
Weapon Collisionから線を伸ばしてSet Collision Enabledを配置。New Typeがコリジョンなしになっていますからコリジョンを有効化(Query and Physics)にする。
Cast To BP_PlayerとSet Collision Enabledを繋ぐ。
Set Collision Enabledとリターンノードを繋ぐ。
この後のReceived Notify Endで何をやるかもわかるはずです。
NotifyStateは始点と終点の2つの点で管理します。Received Notify Beginは終点にあたります。
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 ActorとDamaged 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し、そこから線を伸ばして-キーを押して減算する(-)。イベント AnyDamageのDamageを減算するの左下に繋げる。
変数HpをSetし、イベント AnyDamageから線を伸ばして左上、減算する(-)から線を伸ばして左下に繋ぐ。
セット(Hp)の右上から線を伸ばしてブランチを配置。
セット(Hp)の右下から線を伸ばして>キーを押してより大きい(>)を配置。そこからブランチのConditionに繋ぐ。
生死を判定するブランチのFalse(死)以降を追加しました。
Set All Bodies Simulate Physicsでラグドール化して、Set Collision Enableでコリジョンをフィジックスのみにしています。
忘れてはいけないのが、敵が死亡時にGet ExpとGet MPを繋いで値を入力し、プレイヤーにExpとMpを入れること。これらのターゲットはDamage Causerです。
最後はDelayで5秒待った後、Destroy Actorでアクターを削除しています。
簡単
過去に自分がまとめたチュートリアルを見ながらやるだけなので簡単でした。久しぶりに何のトラブルもなくスムーズに完了。
完璧に頭に入っているわけではないので、やはり自分自身の作業工程の記録は大事です。
コメント
great article