「敵の弾はシールドで防ぎたいけれど、味方の弾は通したい」「このトリガーはプレイヤーだけに反応してほしい」——ゲームが形になってくると、必ずこういう要求が出てきます。ところが Block と Overlap を切り替えるだけでは、「全部当たる」か「全部すり抜ける」かにしかなりません。
ここで効くのが コリジョンチャンネル と コリジョンプロファイル です。UEの当たり判定は「当たるか否か」の1軸ではなく、 相手ごとに反応を変えられる表 としてできています。
この記事では、その表の読み方と設計手順を解説します。最後に 敵の弾だけを防ぐシールド をゼロから組む実践も紹介します。
この記事でわかること
- チャンネル= 自分が何者かの名札 、プロファイル= 誰にどう反応するかの表
- Object Channel と Trace Channel は目的が違う
Ignore/Overlap/Blockの3択が何を意味するか- 当たり判定は 双方向 で、片方がIgnoreなら成立しないこと
- 実践:敵の弾だけを防ぐシールドを組む
チャンネルとプロファイル:名札と、反応表
この2つの区別がつかないうちは、設定画面を開いても迷い続けます。まずここをはっきりさせましょう。

- コリジョンチャンネル = 自分が何者かを名乗る名札 。「私はPawnです」「私は敵の弾です」と表明するだけで、それ以上のことはしません
- コリジョンプロファイル = その名札を持つ人が、どの相手にどう反応するかをまとめた表 。「Pawnには当たる、WorldStaticは無視する」といった行が並んでいます
大事なのは、 チャンネルを作っただけでは何も起きない ということです。名札を新調しただけでは行動は変わりません。応答を決めた表(プロファイル)を作り、それをコンポーネントに適用して、はじめて挙動が変わります。
そしてもう1つ、初心者がほぼ全員つまずくポイントがあります。
応答は双方の設定から決まります。 AとBの設定を突き合わせ、 弱いほうが採用される と考えてください。
Ignoreが片方でもあればIgnore、片方がBlockでも相手がOverlapならOverlap、 両方がBlockのときだけBlockです。「設定したのに止まらない」の多くはここが原因です。
Object ChannelとTrace Channel
チャンネルには2種類あり、目的がはっきり分かれています。

| 種類 | 何を表すか | 例 |
|---|---|---|
| Object Channel | コリジョンを持つComponentの種類 。見えないトリガーにも付く | Pawn、WorldStatic、(自作)EnemyProjectile |
| Trace Channel | 線を飛ばして調べるときの目的 。モノには付けない | Visibility、Camera、(自作)Interact |
見分け方はシンプルです。 レベルに置かれるものならObject、Line Trace の引数に渡すものならTrace 。
弾やシールド、見えないトリガーボリュームなど レベルに存在するもの はObject Channel、「目の前に調べられるものがあるか」を確かめる処理はTrace Channelで作ります。この2つを取り違えると、「チャンネルは作ったのにドロップダウンに出てこない」という形で詰まります。
プロジェクト設定(Edit → Project Settings → Engine → Collision)で、どちらも新規作成できます。上限は Object と Trace の合計で18個 なので、無計画に増やすと後で困ります。
Ignore / Overlap / Block の3択
応答は3つしかありません。ここを正確に押さえると、設定表が一気に読めるようになります。

| 応答 | 物理的にどうなるか | イベント | 使いどころ |
|---|---|---|---|
| Ignore | すり抜ける | 何も飛ばない | 関係ない相手。 基本はこれ |
| Overlap | すり抜ける | On Component Begin Overlap が飛ぶ | 通過を検知したい(トリガー、アイテム取得、ダメージ判定) |
| Block | 止まる(跳ね返りは別途 Projectile Movement の設定が必要) | 条件を満たせば On Component Hit | 壁、床、防ぐもの |
Ignore と Overlap はどちらもすり抜けます。違うのは 通知が飛ぶかどうか だけ。「通り抜けさせたいけれど、通ったことは知りたい」場面がOverlapの出番です。
2つ注意点があります。1つは、Overlapの通知を受け取るには 両方のComponentで Generate Overlap Events が有効 である必要があること。もう1つは、Block は「止める」だけで 跳ね返しはしない ことです。弾を跳ね返したいなら Projectile Movement の Should Bounce を使います。
Default Responseは「どちらの事故が嫌か」で決める。 未知の相手に対して 意図しない衝突 が起きるほうが困るなら
Ignore始まり、逆に 意図しないすり抜け のほうが困るならBlock始まりです。弾やシールドのように「特定の相手とだけ関係する」ものはIgnoreから始めて必要な穴だけ開けると管理が楽で、壁のように「基本は何でも止め たい」ものはBlock始まりが自然です。
実践:敵の弾だけを防ぐシールドを組む
シューティングのバリア、アクションRPGの魔法障壁、ローグライトの反射シールド——「特定の相手だけを止める」仕掛けは、どのジャンルにも出てきます。ここでは 敵の弾は防ぐが、プレイヤー本体と味方の弾は通す シールドを作ります。
再現用の準備: シールドは別Actorにせず、 プレイヤーのComponentとして持たせます 。こうすると追従もキー入力も自然に解決します。
| 場所 | 名前 | 設定 |
|---|---|---|
BP_Player | ShieldCollision | Sphere Collision Component。Sphere Radius = 150.0(見た目が要るなら装飾用のStatic Meshを別に足す) |
BP_Player | bShieldOn | Boolean / 初期値 false |
BP_EnemyBullet | BulletCollision | Sphere Collision(Radius 10)をRootに置き、 Projectile Movement を追加。Initial Speed = 2000 |
BP_PlayerBullet | BulletCollision | 同上 |
Projectile Movement を入れるのが重要です。これがないと弾は飛ばず、自前で位置を動かしてもSweepが効かないため Blockしていても貫通します 。
ステップ1:名札を3枚作る。 Edit → Project Settings → Engine → Collision を開き、Object Channels で New Object Channel... を3回押します。
| チャンネル名 | Default Response |
|---|---|
PlayerShield | Ignore |
EnemyProjectile | Ignore |
PlayerProjectile | Ignore |
味方弾にも専用チャンネルを作ります。標準の Projectile プロファイルは どのプロジェクトにも必ずあるわけではない ので、自分で用意するほうが確実です。
ステップ2:反応表を作る。 同じ画面の Preset で New... を押します。 相手側の表も必ず書く のを忘れないでください。
Shield_Active(シールド用):
| 項目 | 値 |
|---|---|
| Collision Enabled | Query Only |
| Object Type | PlayerShield |
EnemyProjectile | Block ← 敵弾はここで止まる |
PlayerProjectile | Ignore ← 味方弾は通す |
Pawn | Ignore |
| その他すべて | Ignore |
Enemy_Bullet(敵弾用):
| 項目 | 値 |
|---|---|
| Collision Enabled | Query Only |
| Object Type | EnemyProjectile |
PlayerShield | Block ← 双方向で合わせる |
Pawn | Overlap ← 本体に当たったらダメージ |
WorldStatic | Block ← 壁で消える |
| その他すべて | Ignore |
Player_Bullet(味方弾用)は Object Type を PlayerProjectile にし、PlayerShield を Ignore 、WorldStatic を Block にします。
ステップ3:忘れやすい「相手側」を開ける。 ここが最大の落とし穴です。 プレイヤー本体のCapsuleが EnemyProjectile を Ignore のままだと、敵弾は素通りしてダメージも入りません 。
BP_Player の CapsuleComponent を選び、Collision Presets を Custom... にして EnemyProjectile を Overlap に変更します。あわせて、Capsuleと弾の 両方で Generate Overlap Events にチェック が入っているか確認してください。

ステップ4:コンポーネントに適用する。 ShieldCollision の Collision Presets を Shield_Active に、BP_EnemyBullet の BulletCollision を Enemy_Bullet に、BP_PlayerBullet を Player_Bullet に設定します。
ステップ5:シールドをON/OFFする。 BP_Player のイベントグラフで、キー入力に応じてプロファイルを差し替えます。プレイヤー自身に書くので、Enhanced Inputのイベントがそのまま使えます。

Enhanced Input Action IA_Shield
Started
→ Branch(Condition: bShieldOn)
False → Set Collision Profile Name(Target: ShieldCollision, In Collision Profile Name: "Shield_Active")
→ Set bShieldOn(true)
True → Set Collision Profile Name(Target: ShieldCollision, In Collision Profile Name: "NoCollision")
→ Set bShieldOn(false)
bShieldOn の初期値 false と、ShieldCollision の初期プロファイル NoCollision を そろえておく のを忘れないでください。ここがずれると、最初の入力で意図と逆になります。
Playして敵に撃たせてみてください。 シールドを張っている間は敵弾が球の表面で止まり、解くと本体に当たってOverlapが飛びます 。また 味方弾はシールドを張ったままでも撃ち出せます 。この3つが確認できれば成功です。
うまくいかないときは、この順で切り分けます。
- 敵弾がシールドを素通りする → 表の片方が
Blockになっていません。 両方 を確認 - 敵弾がシールドで止まるが、解いてもダメージが入らない → プレイヤーCapsule側の
EnemyProjectileがIgnoreのままです(ステップ3) - 弾が何にも当たらず飛び続ける →
Projectile Movementが無いか、Updated Componentがコリジョンを持つComponentになっていません - 味方弾も止まる → 味方弾のObject Typeが誤って
EnemyProjectileになっていないか確認
ポイントは2つです。
- Blockは両者の合意が要る:
Ignoreが片方でもあればIgnoreです。「当たらない」ときは自分の設定ではなく 相手側の表 を開くのが、最短の切り分けです - プロファイルは名前で差し替えられる:
Set Collision Profile Nameを使えば、当たり方そのものをゲーム中に切り替えられます。無敵時間、すり抜け床、フェーズで硬さが変わるボスなど、応用範囲は広いです
シールドが弾を止めた瞬間にエフェクトを出したいな ら On Component Hit を使いますが、Hitイベントが飛ぶには Sweepを伴う移動 が必要です(Projectile Movement を使っていれば満たされます)。当たり判定の 形 のほうが合わない場合は、SimpleとComplexの使い分け を参照してください。
おまけ:先に知っておくと良いこと
Collision Enabled の4択も一緒に覚えると迷いません。 プロファイルの先頭にあるこの項目は、当たり判定を何に使うかを決めています。
| 設定 | 何ができるか |
|---|---|
| No Collision | 何もしない |
| Query Only | トレース・Overlap・Sweepに参加する( 剛体シミュレーションはしない ) |
| Physics Only | 剛体シミュレーションだけ |
| Collision Enabled | 両方 |
誤解しやすいのが Query Only です。 物理を切っても「止まる」ことはできます 。Character MovementやProjectile MovementはSweepで移動するので、Query Onlyの壁にもきちんとぶつかります。弾やトリガーは Query Only で十分です。
チャンネルは増 やす前に「タグで足りないか」を疑ってください。 上限18個は意外とすぐ埋まります。チャンネルの出番は コリジョンの段階で当たり方やトレース対象を分けたいとき 。一方、「この敵は炎属性」のように 当たったあとの処理を変えたいだけ なら Gameplay Tags の仕事で、Gameplay Tagsを付けてもコリジョンの応答は変わりません。
C++で書くとどうなるか。 コンストラクタや任意の関数から、コンポーネントに対して1行で指定できます。
// コンストラクタでの初期設定
ShieldMesh->SetCollisionProfileName(TEXT("Shield_Active"));
// ゲーム中の切り替え
void AMyCharacter::SetShieldEnabled(bool bEnabled)
{
ShieldMesh->SetCollisionProfileName(bEnabled ? TEXT("Shield_Active") : TEXT("NoCollision"));
}
FName で名前を渡すだけで、やっていることはBlueprintの Set Collision Profile Name とまったく同じです。存在しない名前を渡すと 意図した設定が適用されないまま進んでしまう ので、綴りには注意してください。心配なら Get Collision Profile Name で実際に何が入っているか確認できます。
まとめ
コリジョン設計は、次の3ステップで考えると迷いません。
| ステップ | やること | 落とし穴 |
|---|---|---|
| ① 名札を決める | Object Channelを作る(デフォルトは Ignore) | Trace Channelと取り違える |
| ② 反応表を作る | Presetを作り、必要な相手だけ Block / Overlap に | 片側だけ設定して当たらない |
| ③ 適用する | コンポーネントの Collision Presets に設定 | チャンネルを作っただけで満足する |
そして忘れてはいけないのが、 当たり判定は双方向の合意で決まる ということ。うまく当たらないときは、自分の設定ではなく 相手の表 を開いてください。
あなたのゲームで「この相手だけ、すり抜けてほしい」ものは何でしょうか?