以下の状態でレベル上に配置したエネミーポーンから弾丸を発射させると、弾丸が壁を貫通してしまいます。
1枚目の画像は4つのカスタムコリジョンの詳細です。
左上から時計周りで順に、プレイヤーポーンのカプセルコリジョン(PlayerComponent)、プレイヤーポーンのキャラクターメッシュ(PlayerMesh)、弾丸のBoxコリジョン(ProjectileObject)、プレイヤーポーンが持つシールドのBoxコリジョン(ShieldPlayer)のコリジョンプロファイルです。
2枚目の画像は上段がトレースチャンネルの種類、下段左がBlockAllプロファイルの詳細、下段右がBlockAllDynamicプロファイルの詳細である。ここでBlockAllとBlockAllDynamicは、キャラクターポーンのカプセルコリジョンやシールドのBoxコリジョンと同様、トレースチャンネルProjectileAttackをオーバーラップするように設定しています。
3枚目の画像は最上段が弾丸のオーバーラップイベントおよび弾丸破壊イベント、中段が弾丸のオーバーラップイベント内のCheckHitActorByProjectile関数の一部で、弾丸が床や壁にオーバーラップした時に弾丸破壊イベントへ繋がる処理の部分、最下段が壁のコリジョンの状態です。
処理の概要としては、以下の通りです。
弾丸がProjectileAttackのトレースチャンネルに対応するオブジェクトに命中(オーバーラップ)したら爆発し、そのオブジェクトがプレイヤーポーンの場合はダメージを与え、プレイヤーポーンの持つシールドの場合はそのシールドの持ち主(=プレイヤーポーン)にダメージを与え、壁や床に命中した場合はそのまま爆発するように処理しています。
まずプレイヤーポーンに命中した場合はオーバーラップイベントが正常に発火し、ダメージを与えられます。
次にシールドに命中した場合も、こちらの意図した通りシールドの持ち主であるプレイヤーポーンにダメージを与えられます。
しかし壁や床に命中した場合、オーバーラップイベントが発火しません。トレースを可視化して見てみたところ、弾丸がプレイヤーポーンやシールドと接触した時はトレースが描画されるのに、壁と接触した時はトレースが描画されませんでした。
また試しにレベル上に配置した壁のコリジョンをPlayerComponentやShieldPlayerに変えてみたり、GenerateOvelapEventsとSimulationGeneratesHitEventsを有効にしてみましたが、結果は変わりませんでした。
なぜ壁と接触した時はオーバーラップイベントが発火せず、弾丸が貫通してしまうんでしょうか?
※仕様上、プレイヤーの回避行動中に命中した場合は弾丸を爆発させたくないので、今回はHitイベントではなくOverlapイベントを採用しています。