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

作成: 2025-12-12最終更新: 2026-09-05

敵の弾だけをシールドで止め、味方の弾は通す。Object TypeとResponseの読み方、双方の設定によるBlock・Overlap・Ignoreの違いを整理し、弾を飛ばして結果を比べる手順まで解説します。

敵の弾はシールドで防ぎたい。でも、自分の弾は内側から外へ撃ち出したい。同じシールドでも、相手によって当たり方を変えられると、こうした仕掛けを作れます。

UEのコリジョンには、相手の種類ごとに「止める・重なりを調べる・無視する」を決める表があります。まずはこの表を読み、よく使う組み合わせに名前を付けて保存してみましょう。

この記事では、チャンネルとプロファイルの役割を整理し、敵弾だけを止めるシールドを作ります。最後は実際に2種類の弾を飛ばし、設定表と目の前の結果を対応させます。

同じシールドでも、相手によって弾を止めたり通したりする

この記事でわかること

  • Object Typeという「名札」と、相手ごとのResponseの読み方
  • Object ChannelとTrace Channelの使い分け
  • 双方の設定からBlock・Overlap・Ignoreが決まる仕組み
  • 敵弾だけを止めるシールドと、プロファイルの切り替え

Sponsored

チャンネルとプロファイル:名札と、設定一式

岩の当たり判定ならStatic Mesh Component、プレイヤー本体ならCapsuleComponent。こうした、当たり判定を持つ部品の詳細パネルで「Collision Presets」を開くと、Object TypeやResponseを確認できます。

Object Typeは、その部品が何者かを示す名札です。プレイヤーのカプセルならPawn、動かない壁ならWorldStatic、といった種類があります。自分でObject Channelを作ると、EnemyProjectileのような種類を増やせます。

Responseは、その種類の相手にどう反応するかです。たとえば敵弾なら「PlayerShieldにはBlock、PawnにはOverlap」というように、相手の名札ごとに設定します。

EnemyProjectileという名札と、相手ごとの反応表を分けて読む

この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を使います。

部品の種類を分けるObject Channelと、判定の目的を分けるTrace Channel

Ignore・Overlap・Blockを双方の表で読む

Responseの基本は3つです。まずは、ゲーム中に何が起こるかで比べましょう。

Ignoreは無視、Overlapは重なりを調べ、Blockは移動を遮る
応答当たり方通知を使う場面
Ignoreその相手との判定を無視する通ったことも調べなくてよい
Overlap重なりを調べる。進行は止めないアイテムに触れた、領域へ入ったなど
Block移動を遮る接触として扱う壁や、弾を防ぐシールドなど

Overlapは、重なったときに何をするかを書くための入口です。通知を受け取るには、両方のComponentでGenerate Overlap Eventsをオンにし、On Component Begin Overlapなどのイベントへ処理をつなぎます。設定をOverlapにするだけで、HPが減るわけではありません。

Blockも、設定だけで跳ね返しまで決まるわけではありません。Projectile Movementで弾を動かす場合、跳ね返すかはShould Bounceで選びます。Hit通知にも条件があるので、まずは「動きを遮ること」と「通知から処理を呼ぶこと」を分けて考えます。

片方だけBlockでは、止められない

シールドが敵弾をBlockにしていても、敵弾がシールドをIgnoreにしていれば通り抜けます。自分の表と、相手の表を合わせて読むのが大切です。

自分から相手へ相手から自分へ結果
BlockBlockBlock
BlockOverlapOverlap
BlockIgnoreIgnore
OverlapOverlapOverlap
OverlapIgnoreIgnore

左右を入れ替えても同じです。片方でもIgnoreなら無視し、Ignoreがなく片方がOverlapなら重なり、両方Blockなら遮ります。もちろん、判定そのものが無効になっている場合や、移動時に衝突を調べていない場合は、この表だけでは止まりません。

シールドと敵弾の両方がBlockなら止まり、片方がIgnoreなら通り抜ける

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

Enhanced Input入門のBP_InputPracticeを使います。白いキャラクターの周囲へ球形のシールドを付け、敵弾は外側から、味方弾は内側から飛ばします。

まずはシールドを有効にした状態と無効にした状態を、Playをやり直して比べます。基本の反応を確かめた後に、Qキーで切り替える処理を加えます。

有効なシールドは敵弾を外側で止め、解除すると本体へ届く。淡い弾は内側から外へ通る模式図

1. 3種類の名札を作る

「プロジェクト設定」→「Engine」→「Collision」のObject Channelsで「New Object Channel...」を押し、次の3種類を作ります。

名前Default Response
PlayerShieldIgnore
EnemyProjectileIgnore
PlayerProjectileIgnore

Default Responseは、新しく増えた種類へ、既存の設定がどのように反応するかの出発点です。今回は必要な相手だけを指定するためIgnoreから始めます。新しい項目が部品の詳細へ出ない場合は、Blueprintを閉じて開き直します。

2. 3つのプロファイルを保存する

同じ画面のPresetを開き、「New...」から次の3つを作ります。表の列が、1つのプロファイルです。

項目Shield_ActiveEnemy_BulletPlayer_Bullet
Collision EnabledQuery OnlyQuery OnlyQuery Only
Object TypePlayerShieldEnemyProjectilePlayerProjectile
PlayerShieldへのResponseIgnoreBlockIgnore
EnemyProjectileへのResponseBlockIgnoreIgnore
PlayerProjectileへのResponseIgnoreIgnoreIgnore
PawnへのResponseIgnoreOverlapIgnore
その他へのResponseIgnoreIgnoreIgnore

Query Onlyは、重なりや移動先の判定に参加する設定です。ここでは剛体の物理シミュレーションで弾を落とさず、Projectile Movementでまっすぐ動かします。

今回の弾は、シールドと本体の関係だけを観察するため、壁や床もIgnoreにします。普通の弾として壁で止めたい場合は、後で弾のWorldStaticをBlockにし、壁側も対応させます。

Sponsored

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です。

部品設定
BulletCollisionSphere Radius=10、Scale=1、Collision Presets=Enemy_Bullet
BulletCollisionGenerate Overlap Events=オン、Simulate Physics=オフ
BulletMeshRelative Location=0、見た目だけ。Collision Presets=NoCollision

さらにProjectile Movementを追加し、次の値にします。

項目
Initial Speed / Max Speed両方200
VelocityX=200、Y=0、Z=0
Initial Velocity in Local Spaceオン
Projectile Gravity Scale0
Should Bounceオフ
Sweep Collisionオン
Auto Activateオン

これで、Playが始まると弾自身の前方であるローカルX方向へ、毎秒200cmで進みます。 レベルへ置いた弾の向きを変えれば、飛ぶ向きも変わります。重力は0なので途中で落ちません。

Sweepは、移動前から移動先までの途中に、ぶつかるものがないかを調べることです。Projectile Movementは通常Rootを移動対象にするため、判定のあるBulletCollisionをRootへ置きました。見た目だけの部品を動かしていないかが、貫通するときの確認点になります。

RootのBulletCollisionをProjectile Movementで動かし、子のBulletMeshは見た目だけに使う

自分でSet Actor Locationなどを使う場合にもSweepの指定はあります。今回は弾の移動をProjectile Movementへ任せます。弾をゲーム中に生成する仕組みは、Spawn ActorとProjectileの記事で扱います。

5. 止まった場所と、本体への到達を表示する

BP_EnemyBulletでProjectile Movementを選び、詳細のイベントからOn Projectile Stopを追加します。そこからPrint Stringへつなぎ、敵弾が止まったを5秒表示します。止まった球は残して、位置を見られるようにします。

On Projectile StopからPrint Stringへつなぎ、敵弾の停止を表示する

続いてBulletCollisionを選び、On Component Begin Overlapを追加します。Other ActorをCast To BP_InputPracticeのObjectへつなぎ、白い線もイベントからCastへつなぎます。

Castの成功側からPrint Stringで敵弾が本体へ届いたを5秒表示し、その後にDestroy Actor(Target=self)を呼びます。Cast Failed側は何もつなぎません。

重なった相手をCastで確認し、成功時に到達を表示して敵弾自身を消す

ここでの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で結果が変わりました。

Sponsored

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を渡します。

StartedからBranchを呼び、bShieldOnがTrueならOFF、FalseならONへ進む
  • 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です。

True側ではShieldCollisionをNoCollisionへ変え、bShieldOnをfalseにする

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

False側ではShieldCollisionをShield_Activeへ戻し、bShieldOnをtrueにする

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 ReferenceCollision Enabledの種類Projectile MovementOverlapイベントHitイベントSet Collision Profile Name

Unreal Engine このセクションのノート98