敵の弾はシールドで防ぎたい。でも、自分の弾は内側から外へ撃ち出したい。同じシールドでも、相手によって当たり方を変えられると、こうした仕掛けを作れます。
UEのコリジョンには、相手の種類ごとに「止める・重なりを調べる・無視する」を決める表があります。まずはこの表を読み、よく使う組み合わせに名前を付けて保存してみましょう。
この記事では、チャンネルとプロファイルの役割を整理し、敵弾だけを止めるシールドを作ります。最後は実際に2種類の弾を飛ばし、設定表と目の前の結果を対応させます。
この記事でわかること
- Object Typeという「名札」と、相手ごとのResponseの読み方
- Object ChannelとTrace Channelの使い分け
- 双方の設定からBlock・Overlap・Ignoreが決まる仕組み
- 敵弾だけを止めるシールドと、プロファイルの切り替え
チャンネルとプロファイル:名札と、設定一式
岩の当たり判定ならStatic Mesh Component、プレイヤー本体ならCapsuleComponent。こうした、当たり判定を持つ部品の詳細パネルで「Collision Presets」を開くと、Object TypeやResponseを確認できます。
Object Typeは、その部品が何者かを示す名札です。プレイヤーのカプセルならPawn、動かない壁ならWorldStatic、といった種類があります。自分でObject Channelを作ると、EnemyProjectileのような種類を増やせます。
Responseは、その種類の相手にどう反応するかです。たとえば敵弾なら「PlayerShieldにはBlock、PawnにはOverlap」というように、相手の名札ごとに設定します。

このObject Type、相手ごとのResponse、判定の用途を決めるCollision Enabledなどをまとめたものが、コリジョンプロファイルです。設定一式にEnemy_Bulletという名前を付けておけば、複数の弾へ同じ設定を適用できます。
試すだけなら、部品のCollision Presetsを「Custom...」にして直接設定しても動きます。プロファイルを作る理由は、同じ表を何度も手で書かずに済み、後から名前で選び直せるようにするためです。
チャンネルを作るだけで、敵味方を自動判別するわけではありません。 どの部品がその種類を名乗り、相手がどう反応するかまで設定します。
Object ChannelとTrace Channel
チャンネルには、部品の分類と、判定の目的を分ける2種類があります。
| 種類 | 何を分けるか | 例 |
|---|---|---|
| Object Channel | 当たり判定を持つ部品の種類 | Pawn、WorldStatic、自作のEnemyProjectile |
| Trace Channel | 判定を行う目的 | Visibility、Camera、自作のInteract |
Object Channelは、見えないトリガー用の部品にも使います。画面に描かれるかどうかではなく、当たり判定を持つ部品を何に分類するかで考えます。
一方、トレースは、線や形を伸ばして途中の相手を調べる処理です。たとえば「照準の先に何があるか」と「カメラの前に壁があるか」で、反応する対象を分けたいときにTrace Channelを使います。
Line Trace by ChannelのTrace Channelには後者を指定します。線を使う判定にはObject Typeで対象を選ぶ方式もあるため、「線ならすべてTrace Channel」と覚える必要はありません。Line Trace入門で、それぞれを使う場面 を確認できます。
新しい種類は「編集」→「プロジェクト設定」→「Engine」→「Collision」で作ります。今回の弾とシールドでは、Object Channelsを使います。

Ignore・Overlap・Blockを双方の表で読む
Responseの基本は3つです。まずは、ゲーム中に何が起こるかで比べましょう。

| 応答 | 当たり方 | 通知を使う場面 |
|---|---|---|
| Ignore | その相手との判定を無視する | 通ったことも調べなくてよい |
| Overlap | 重なりを調べる。進行は止めない | アイテムに触れた、領域へ入ったなど |
| Block | 移動を遮る接触として扱う | 壁や、弾を防ぐシールドなど |
Overlapは、重なったときに何をするかを書くための入口です。通知を受け取るには、両方のComponentでGenerate Overlap Eventsをオンにし、On Component Begin Overlapなどのイベントへ処理をつなぎます。設定をOverlapにするだけで、HPが減るわけではありません。
Blockも、設定だけで跳ね返しまで決まるわけではありません。Projectile Movementで弾を動かす場合、跳ね返すかはShould Bounceで選びます。Hit通知にも条件があるので、まずは「動きを遮ること」と「通知から処理を呼ぶこと」を分けて考えます。
片方だけBlockでは、止められない
シールドが敵弾をBlockにしていても、敵弾がシールドをIgnoreにしていれば通り抜けます。自分の表と、相手の表を合わせて読むのが大切です。
| 自分から相手へ | 相手から自分へ | 結果 |
|---|---|---|
| Block | Block | Block |
| Block | Overlap | Overlap |
| Block | Ignore | Ignore |
| Overlap | Overlap | Overlap |
| Overlap | Ignore | Ignore |
左右を入れ替えても同じです。片方でもIgnoreなら無視し、Ignoreがなく片方がOverlapなら重なり、両方Blockなら遮ります。もちろん、判定そのものが無効になっている場合や、移動時に衝突を調べていない場合は、この表だけでは止まりません。

実践:敵の弾だけを防ぐシールドを組む
Enhanced Input入門のBP_InputPracticeを使います。白いキャラクターの周囲へ球形のシールドを付け、敵弾は外側から、味方弾は内側から飛ばします。
まずはシールドを有効にした状態と無効にした状態を、Playをやり直して比べます。基本の反応を確かめた後に、Qキーで切り替える処理を加えます。

1. 3種類の名札を作る
「プロジェクト設定」→「Engine」→「Collision」のObject Channelsで「New Object Channel...」を押し、次の3種類を作ります。
| 名前 | Default Response |
|---|---|
| PlayerShield | Ignore |
| EnemyProjectile | Ignore |
| PlayerProjectile | Ignore |
Default Responseは、新しく増えた種類へ、既存の設定がどのように反応するかの出発点です。今回は必要な相手だけを指定するためIgnoreから始めます。新しい項目が部品の詳細へ出ない場合は、Blueprintを閉じて開き直します。
2. 3つのプロファイルを保存する
同じ画面のPresetを開き、「New...」から次の3つを作ります。表の列が、1つのプロファ イルです。
| 項目 | Shield_Active | Enemy_Bullet | Player_Bullet |
|---|---|---|---|
| Collision Enabled | Query Only | Query Only | Query Only |
| Object Type | PlayerShield | EnemyProjectile | PlayerProjectile |
| PlayerShieldへのResponse | Ignore | Block | Ignore |
| EnemyProjectileへのResponse | Block | Ignore | Ignore |
| PlayerProjectileへのResponse | Ignore | Ignore | Ignore |
| PawnへのResponse | Ignore | Overlap | Ignore |
| その他へのResponse | Ignore | Ignore | Ignore |
Query Onlyは、重なりや移動先の判定に参加する設定です。ここでは剛体の物理シミュレーションで弾を落とさず、Projectile Movementでまっすぐ動かします。
今回の弾は、シールドと本体の関係だけを観察するため、壁や床もIgnoreにします。普通の弾として壁で止めたい場合は、後で弾のWorldStaticをBlockにし、壁側も対応させます。
3. キャラクターへシー ルドを付ける
BP_InputPracticeのCapsuleComponentへSphere Collisionを子として追加し、ShieldCollisionと名付けます。Relative Locationはすべて0、Scaleはすべて1、Sphere Radiusは150にします。
ShieldCollisionのCollision PresetsをShield_Activeにし、Generate Overlap Eventsはオフにします。今回はシールドの重なり通知を使わず、弾を止める役割だけを持たせます。
練習中に球の範囲を見たい場合は、ShieldCollisionのHidden in Gameをオフにできます。この輪郭は確認用の表示で、完成版のシールドの見た目とは別です。
次に本体のCapsuleComponentを選びます。Collision Presetsを「Custom...」にし、Object TypeはPawnのまま、EnemyProjectileへのResponseだけOverlapに変えます。Generate Overlap Eventsもオンにします。床を歩くためのWorldStaticなど、元の応答は残してください。
新しいチャンネルのDefault ResponseをIgnoreにしたので、この変更をしないと本体まで敵弾を無視します。シールドと本体は同じActorの部品ですが、反応表はそれぞれ別です。
4. 飛ぶ敵弾を作る
Actorを親にBlueprintを作り、BP_EnemyBulletと名付けます。まずSphere Collisionを追加し、BulletCollisionと名付けてDefaultSceneRootへドラッグし、Rootにします。
その子にStatic Mesh ComponentのBulletMeshを追加し、見た目用のSphereを選びます。エンジンのBasicShapesにあるSphereならScaleをすべて0.2にすると直径20程度になります。見つからない場合は、アセット選択欄の設定で「エンジンコンテンツを表示」をオンにします。BulletMeshのCollision PresetsはNoCollisionです。
| 部品 | 設定 |
|---|---|
| BulletCollision | Sphere Radius=10、Scale=1、Collision Presets=Enemy_Bullet |
| BulletCollision | Generate Overlap Events=オン、Simulate Physics=オフ |
| BulletMesh | Relative Location=0、見た目だけ。Collision Presets=NoCollision |
さらにProjectile Movementを追加し、次の値にします。
| 項目 | 値 |
|---|---|
| Initial Speed / Max Speed | 両方200 |
| Velocity | X=200、Y=0、Z=0 |
| Initial Velocity in Local Space | オン |
| Projectile Gravity Scale | 0 |
| Should Bounce | オフ |
| Sweep Collision | オン |
| Auto Activate | オン |
これで、Playが始まると弾自身の前方であるローカルX方向へ、毎秒200cmで進みます。 レベルへ置いた弾の向きを変えれば、飛ぶ向きも変わります。重力は0なので途中で落ちません。
Sweepは、移動前から移動先までの途中に、ぶつかるものがないかを調べることです。Projectile Movementは通常Rootを移動対象にするため、判定のあるBulletCollisionをRootへ置きました。見た目だけの部品を動かしていないかが、貫通するときの確認点になります。

自分でSet Actor Locationなどを使う場合にもSweepの指定はあります。今回は弾の移動をProjectile Movementへ任せます。弾をゲーム中に生成する仕組みは、Spawn ActorとProjectileの記事で扱います。
5. 止まった場所と、本体への到達を表示する
BP_EnemyBulletでProjectile Movementを選び、詳細のイベントからOn Projectile Stopを追加します。そこからPrint Stringへつなぎ、敵弾が止まったを5秒表示します。止まった球は残して、位置を見られるようにします。

続いてBulletCollisionを選び、On Component Begin Overlapを追加します。Other ActorをCast To BP_InputPracticeのObjectへつなぎ、白い線もイベントからCastへつなぎます。
Castの成功側からPrint Stringで敵弾が本体へ届いたを5秒表示し、その後にDestroy Actor(Target=self)を呼びます。Cast Failed側は何もつなぎません。

ここでのCastは、重なった相手が練習用キャラクターかを確かめる処理です。シールドで止められず、本体まで届いた場合を区別できます。今回は到達の確認までにし、HPを減らす処理は体力とダメージの記事と組み合わせます。
6. 敵弾を置き、2つの状態を比べる
高さが0の平らな床がある場所を使い、PlayerStartをLocation=(0, 0, 100)、Rotation=(0, 0, 0)へ置きます。GameModeはEnhanced Input入門のBP_InputPracticeGameModeです。キャラクターはPlayerStartから生成されるので、手で追加配置しません。
BP_EnemyBulletをLocation=(800, 0, 88)、RotationのYaw=180、PitchとRoll=0で置きます。キャラクターの前方8mから、こちらへ向かって飛ぶ配置です。弾とPlayerStartの間には障害物を置かず、Play中は移動・ジャンプをせずに観察します。
まずShield_Activeのままコンパイル・保存してPlayします。敵弾が近づき、キャラクター本体より手前の球面で止まれば、「敵弾が止まった」と表示されます。
次にPlayを止め、BP_InputPracticeのShieldCollisionだけをNoCollisionへ変えて再びPlayします。今度は球面で止まらず、キャラクターへ届いて「敵弾が本体へ届いた」と表示され、弾が消えます。
Hidden in Gameをオフにしていた場合、NoCollisionでも確認用の輪郭は残ります。輪郭の表示と当たり判定の有効・無効は別なので、弾の位置と通知で結果を比べてください。
毎回Playをやり直すのは、新しい弾で同じ条件を試すためです。一度止まった弾は、シールドを解除しても自動で飛び直しません。
7. 味方の弾が内側から出られるか確かめる
Playを止め、ShieldCollisionをShield_Activeへ戻します。BP_EnemyBulletを複製してBP_PlayerBulletを作り、BulletCollisionのCollision PresetsをPlayer_Bulletに変えます。
複製でコピーされたOn Projectile StopとOn Component Begin Overlapのイベント、およびそこからのPrint・Cast・Destroyの処理は、BP_PlayerBullet側で削除します。敵弾の通知を味方弾から出さないためです。移動の設定は同じままにします。
BP_PlayerBulletをLocation=(80, 60, 88)、Rotation=(0, 0, 0)でレベルへ置きます。シールドの内側から、前方へ飛び出す位置です。

保存してPlayし、内側の味方弾が外へ進む一方、外から来る敵弾が球面で止まるかを見ます。判定の形は同じでも、相手ごとのResponseで結果が変わりました。
8. Qキーでシールドを切り替える
ここまで確認できたら、実行中の切り替えを加えます。InputPracticeフォルダへDigital (Bool)のIA_Shieldを作り、ModifiersとTriggersは空にします。IMC_CommonへQキーの割り当てを追加します。
BP_InputPracticeにBoolean変数bShieldOnを作り、初期値はtrueにします。ShieldCollisionの初期プロファイルもShield_Activeへ揃えてく ださい。
IA_ShieldのStartedからBranchへつなぎ、ConditionにはGet bShieldOnを渡します。

- True側:Set Collision Profile NameでNoCollisionへ変更 → Set bShieldOn=false → Print Stringで「シールドOFF」
- False側:Set Collision Profile NameでShield_Activeへ変更 → Set bShieldOn=true → Print Stringで「シールドON」
2つのSet Collision Profile Nameは、どちらもTargetがGet ShieldCollisionです。名前はIn Collision Profile Nameへ入力し、Update Overlapsはオンにします。PrintのDurationは2です。

プロファイルを選び直すと、その部品の設定一式が切り替わります。 球の大きさや、別部品である本体の設定を変える操作ではありません。

Play画面をクリックし、敵弾が届く前にQを押してみ ます。OFFにすれば本体への到達、ONのままなら球面での停止を確認できます。繰り返すときはPlayをやり直してください。
うまく動かないときのチェック
| 症状 | 確認するところ |
|---|---|
| 敵弾がシールドを通り抜ける | Shield_ActiveとEnemy_Bulletが互いのObject TypeへBlockか。ShieldCollisionがNoCollisionのままではないか |
| シールドを切っても、本体への到達が出ない | CapsuleのEnemyProjectileがOverlapか。CapsuleとBulletCollisionの両方でGenerate Overlap Eventsがオンか |
| 弾が動かない | Projectile MovementのAuto Activate、Velocity、Initial Speedを確認する |
| 弾が別方向へ飛ぶ・落ちる | 弾のYaw、Initial Velocity in Local Space、Gravity Scale=0を確認する |
| Blockなのに移動で突き抜ける | Sweep Collisionがオンか、BulletCollisionがRootか、Simulate Physicsがオフか |
| 味方弾まで止まる | BP_PlayerBulletのObject TypeがPlayerProjectileか。BulletMeshが独自に判定していないか |
| Qで切り替わらない | IMC_CommonのQ割り当て、Started、bShieldOnの初期値、SetのTargetと名前を確認する |
| 弾が本体と違う場所を通る | PlayerStartの位置と向き、弾の高さ、床の高さ、Play中にキャラクターを動かしていないか |
形そのものが合わない場合は、SimpleとComplexの使い分けも確認します。形・相手への反応・動かし方を 順に見ると、設定を一度に変えずに原因を探せます。
おまけ:判定の用途と分類を整理する
Query Onlyでも、移動は止められる
Collision Enabledでは、何のために当たり判定を使うかを選びます。まずはよく使う次の4種類を区別します。
| 設定 | 使い方 |
|---|---|
| No Collision | 判定を無効にする |
| Query Only | トレース、重なり、Sweepによる移動先の確認 |
| Physics Only | 剛体の物理シミュレーション |
| Collision Enabled (Query and Physics) | 問い合わせと物理シミュレーションの両方 |
Queryは、位置や形を指定して、相手に当たるか問い合わせることです。Character MovementやProjectile Movementは移動先を調べるので、Query Onlyの相手でもBlockなら移動を止められます。
版によってProbe Onlyなどの項目もありますが、今回の実践では使いません。落とした箱を物理で転がす場合は、今回の弾とは別にPhysicsを含む設定とSimulate Physicsを考えます。
Hit通知も、移動の方法と合わせて確認します。Sweepでぶつかる場合に加え、物理シミュレーションの接触でも通知できます。後者では、そのComponentのSimulation Generates Hit Eventsを有効にします。
当たる前に分けるか、当たった後に分けるか
チャンネルは、判定の段階で「止める相手」「無視する相手」を分けたいときに使います。一方、「当たった敵が炎属性なら効果を変える」というように、接触後の処理だけを分けたい場合は、Gameplay Tagsなどで分類できます。
チャンネルを細かく増やす前に、実際に当たり方が違う種類かを考えます。敵1体ごとに名札を増やすより、「敵弾」という共通の種類で扱える部分をまとめると、反応表を追いやすくなります。Gameplay Tagsを付けるだけでコリジョンの応答が変わるわけではありません。
プロファイルを変更した後は、設定を確認する
Set Collision Profile Nameは、単に変数へ名前を保存する処理ではなく、Componentの当たり方を変更します。Customで調整していた応答も、選んだプロファイルの内容へ切り替わります。
意図した結果にならないときは、名前の綴りとTargetを確認します。Get Collision Profile Nameで適用中の名前を読み、Play中のComponentの詳細も見比べると、どの段階で設定が変わったかを調べられます。
まとめ
Object Typeで相手の種類を決め、Responseで種類ごとの反応を書き、プロファイルとして設定一式を保存します。うまく止まらないときは、自分と相手の両方の表を確認します。
シールドなら、敵弾を止める、解除すると本体へ届く、味方弾は通せる。この3つを同じ場所で比べると、設定の名前がゲーム中の結果とつながります。
参考:Collision Response Reference、Collision Enabledの種類、Projectile Movement、Overlapイベント、Hitイベント、Set Collision Profile Name。