【Unreal Engine】コリジョンチャンネルとプロファイルで「当たる相手」を設計する

作成: 2025-12-12最終更新: 2026-07-19

「味方の弾だけすり抜けさせたい」を実現するのがカスタムコリジョンチャンネル。Object TypeとResponseの読み方を表で整理し、シールドが敵弾だけ防ぐ仕掛けをゼロから組む実践つき。

「敵の弾はシールドで防ぎたいけれど、味方の弾は通したい」「このトリガーはプレイヤーだけに反応してほしい」——ゲームが形になってくると、必ずこういう要求が出てきます。ところが BlockOverlap を切り替えるだけでは、「全部当たる」か「全部すり抜ける」かにしかなりません。

ここで効くのが コリジョンチャンネルコリジョンプロファイル です。UEの当たり判定は「当たるか否か」の1軸ではなく、 相手ごとに反応を変えられる表 としてできています。

この記事では、その表の読み方と設計手順を解説します。最後に 敵の弾だけを防ぐシールド をゼロから組む実践も紹介します。

「自分は何者か」の名札と、「誰にどう反応するか」の表が並んでいるイメージ

この記事でわかること

  • チャンネル= 自分が何者かの名札 、プロファイル= 誰にどう反応するかの表
  • Object ChannelTrace Channel は目的が違う
  • Ignore / Overlap / Block の3択が何を意味するか
  • 当たり判定は 双方向 で、片方がIgnoreなら成立しないこと
  • 実践:敵の弾だけを防ぐシールドを組む

Sponsored

チャンネルとプロファイル:名札と、反応表

この2つの区別がつかないうちは、設定画面を開いても迷い続けます。まずここをはっきりさせましょう。

胸に名札を付けた人形と、その手元にある「誰にどう反応するか」の表を描いた図
  • コリジョンチャンネル自分が何者かを名乗る名札 。「私はPawnです」「私は敵の弾です」と表明するだけで、それ以上のことはしません
  • コリジョンプロファイルその名札を持つ人が、どの相手にどう反応するかをまとめた表 。「Pawnには当たる、WorldStaticは無視する」といった行が並んでいます

大事なのは、 チャンネルを作っただけでは何も起きない ということです。名札を新調しただけでは行動は変わりません。応答を決めた表(プロファイル)を作り、それをコンポーネントに適用して、はじめて挙動が変わります。

そしてもう1つ、初心者がほぼ全員つまずくポイントがあります。

応答は双方の設定から決まります。 AとBの設定を突き合わせ、 弱いほうが採用される と考えてください。Ignore が片方でもあれば Ignore 、片方が Block でも相手が Overlap なら Overlap両方が Block のときだけ Block です。「設定したのに止まらない」の多くはここが原因です。

Object ChannelとTrace Channel

チャンネルには2種類あり、目的がはっきり分かれています。

レベルに置かれたモノに名札が付いているObject Channelと、線を飛ばして調べるTrace Channelの対比図
種類何を表すか
Object Channelコリジョンを持つComponentの種類 。見えないトリガーにも付くPawnWorldStatic、(自作)EnemyProjectile
Trace Channel線を飛ばして調べるときの目的 。モノには付けないVisibilityCamera、(自作)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、止まって跳ね返るBlockの3つを並べた図
応答物理的にどうなるかイベント使いどころ
Ignoreすり抜ける何も飛ばない関係ない相手。 基本はこれ
Overlapすり抜けるOn Component Begin Overlap が飛ぶ通過を検知したい(トリガー、アイテム取得、ダメージ判定)
Block止まる(跳ね返りは別途 Projectile Movement の設定が必要)条件を満たせば On Component Hit壁、床、防ぐもの

IgnoreOverlap はどちらもすり抜けます。違うのは 通知が飛ぶかどうか だけ。「通り抜けさせたいけれど、通ったことは知りたい」場面がOverlapの出番です。

2つ注意点があります。1つは、Overlapの通知を受け取るには 両方のComponentで Generate Overlap Events が有効 である必要があること。もう1つは、Block は「止める」だけで 跳ね返しはしない ことです。弾を跳ね返したいなら Projectile MovementShould Bounce を使います。

Default Responseは「どちらの事故が嫌か」で決める。 未知の相手に対して 意図しない衝突 が起きるほうが困るなら Ignore 始まり、逆に 意図しないすり抜け のほうが困るなら Block 始まりです。弾やシールドのように「特定の相手とだけ関係する」ものは Ignore から始めて必要な穴だけ開けると管理が楽で、壁のように「基本は何でも止めたい」ものは Block 始まりが自然です。

Sponsored

実践:敵の弾だけを防ぐシールドを組む

シューティングのバリア、アクションRPGの魔法障壁、ローグライトの反射シールド——「特定の相手だけを止める」仕掛けは、どのジャンルにも出てきます。ここでは 敵の弾は防ぐが、プレイヤー本体と味方の弾は通す シールドを作ります。

再現用の準備: シールドは別Actorにせず、 プレイヤーのComponentとして持たせます 。こうすると追従もキー入力も自然に解決します。

場所名前設定
BP_PlayerShieldCollisionSphere Collision Component。Sphere Radius = 150.0(見た目が要るなら装飾用のStatic Meshを別に足す)
BP_PlayerbShieldOnBoolean / 初期値 false
BP_EnemyBulletBulletCollisionSphere Collision(Radius 10)をRootに置き、 Projectile Movement を追加。Initial Speed = 2000
BP_PlayerBulletBulletCollision同上

Projectile Movement を入れるのが重要です。これがないと弾は飛ばず、自前で位置を動かしてもSweepが効かないため Blockしていても貫通します

ステップ1:名札を3枚作る。 Edit → Project Settings → Engine → Collision を開き、Object ChannelsNew Object Channel... を3回押します。

チャンネル名Default Response
PlayerShieldIgnore
EnemyProjectileIgnore
PlayerProjectileIgnore

味方弾にも専用チャンネルを作ります。標準の Projectile プロファイルは どのプロジェクトにも必ずあるわけではない ので、自分で用意するほうが確実です。

ステップ2:反応表を作る。 同じ画面の PresetNew... を押します。 相手側の表も必ず書く のを忘れないでください。

Shield_Active(シールド用):

項目
Collision EnabledQuery Only
Object TypePlayerShield
EnemyProjectileBlock ← 敵弾はここで止まる
PlayerProjectileIgnore ← 味方弾は通す
PawnIgnore
その他すべてIgnore

Enemy_Bullet(敵弾用):

項目
Collision EnabledQuery Only
Object TypeEnemyProjectile
PlayerShieldBlock ← 双方向で合わせる
PawnOverlap ← 本体に当たったらダメージ
WorldStaticBlock ← 壁で消える
その他すべてIgnore

Player_Bullet(味方弾用)は Object Type を PlayerProjectile にし、PlayerShieldIgnoreWorldStaticBlock にします。

ステップ3:忘れやすい「相手側」を開ける。 ここが最大の落とし穴です。 プレイヤー本体のCapsuleが EnemyProjectileIgnore のままだと、敵弾は素通りしてダメージも入りません

BP_PlayerCapsuleComponent を選び、Collision PresetsCustom... にして EnemyProjectileOverlap に変更します。あわせて、Capsuleと弾の 両方で Generate Overlap Events にチェック が入っているか確認してください。

シールド側の表と敵弾側の表が向かい合い、両方がBlockと書いているときだけ弾が止まることを示す図

ステップ4:コンポーネントに適用する。 ShieldCollisionCollision PresetsShield_Active に、BP_EnemyBulletBulletCollisionEnemy_Bullet に、BP_PlayerBulletPlayer_Bullet に設定します。

ステップ5:シールドをON/OFFする。 BP_Player のイベントグラフで、キー入力に応じてプロファイルを差し替えます。プレイヤー自身に書くので、Enhanced Inputのイベントがそのまま使えます。

キー入力からSet Collision Profile NameでShield_ActiveとNoCollisionを切り替えるノードグラフ
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側の EnemyProjectileIgnore のままです(ステップ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の使い分け を参照してください。

Sponsored

おまけ:先に知っておくと良いこと

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を作る(デフォルトは IgnoreTrace Channelと取り違える
② 反応表を作るPresetを作り、必要な相手だけ Block / Overlap片側だけ設定して当たらない
③ 適用するコンポーネントの Collision Presets に設定チャンネルを作っただけで満足する

そして忘れてはいけないのが、 当たり判定は双方向の合意で決まる ということ。うまく当たらないときは、自分の設定ではなく 相手の表 を開いてください。

あなたのゲームで「この相手だけ、すり抜けてほしい」ものは何でしょうか?