[UE5] Designing Who Collides With What Using Collision Channels and Profiles

Created: 2025-12-12Last updated: 2026-09-05

Stop only enemy bullets with a shield while letting friendly bullets through. Covers how to read Object Type and Response, how both sides' settings decide Block, Overlap, and Ignore, and how to fire bullets and compare the results.

You want a shield that blocks enemy bullets. But you also want to fire your own bullets outward from inside it. Being able to vary how the same shield collides depending on the other party is what makes mechanisms like this possible.

UE's collision has a table deciding "block, check for overlap, or ignore" per kind of other party. Start by reading that table and saving frequently used combinations under a name.

This article organizes the roles of channels and profiles and builds a shield that stops only enemy bullets. At the end we actually fire two kinds of bullet and map the settings table to what we see.

The same shield stopping bullets from one side while letting others through

What You'll Learn

  • How to read the "name tag" of Object Type and the per-target Response
  • When to use an Object Channel versus a Trace Channel
  • How Block, Overlap, and Ignore are decided from both sides' settings
  • A shield that stops only enemy bullets, and switching profiles

Sponsored

Channels and profiles: the name tag and the settings set

A Static Mesh Component for a rock's collision, a CapsuleComponent for the player's body. Open "Collision Presets" in the details panel of such a collision-bearing part and you can see the Object Type and Responses.

The Object Type is a name tag saying what that part is. The player's capsule is Pawn, an immovable wall is WorldStatic, and so on. Create your own Object Channels and you can add kinds such as EnemyProjectile.

The Response is how it reacts to a target of that kind. An enemy bullet, for example, is configured per name tag: "Block against PlayerShield, Overlap against Pawn."

Reading the EnemyProjectile name tag separately from the per-target response table

Bundling that Object Type, the per-target Responses, and settings like Collision Enabled that decide the query purpose gives you a collision profile. Name that settings set Enemy_Bullet and you can apply the same settings to several bullets.

For a quick test, setting a part's Collision Presets to "Custom..." and configuring directly works too. The reason to make a profile is to avoid rewriting the same table by hand repeatedly and to be able to reselect it by name later.

Creating a channel does not automatically distinguish friend from foe. You also configure which part claims that kind and how the other party reacts.

Object Channels and Trace Channels

Channels come in two kinds: classifying parts, and separating query purposes.

KindWhat it separatesExamples
Object ChannelThe kind of a collision-bearing partPawn, WorldStatic, your own EnemyProjectile
Trace ChannelThe purpose of a queryVisibility, Camera, your own Interact

Object Channels apply to invisible trigger parts too. Rather than whether it is drawn on screen, think in terms of what you classify a collision-bearing part as.

A trace, meanwhile, extends a line or shape to inspect what lies along it. Use a Trace Channel when you want different targets to respond to "what is beyond the crosshair" versus "is there a wall in front of the camera."

Line Trace by Channel's Trace Channel takes the latter. Line-based queries can also select targets by Object Type, so there is no need to memorize "lines always mean Trace Channels." Line Trace Basics covers when each is used.

Create new kinds under "Edit" → "Project Settings" → "Engine" → "Collision." For our bullets and shield, we use Object Channels.

Object Channels separate part kinds while Trace Channels separate query purposes

Reading Ignore, Overlap, and Block from both tables

There are three basic Responses. Start by comparing what happens in game.

Ignore ignores, Overlap checks the overlap, and Block obstructs movement
ResponseHow it collidesWhen you use the notification
IgnoreIgnores queries against that targetYou do not even need to know it passed
OverlapChecks the overlap. Does not stop movementTouching an item, entering a volume
BlockTreated as contact that obstructs movementWalls, or a shield that stops bullets

Overlap is the entry point for writing what happens when things overlap. To receive notifications, turn on Generate Overlap Events on both Components and connect logic to events such as On Component Begin Overlap. Setting Overlap alone does not reduce HP.

Block, too, does not by itself decide bouncing. When moving a bullet with Projectile Movement, whether it bounces is chosen by Should Bounce. Hit notifications also have conditions, so start by separating "obstructing motion" from "calling logic from a notification."

Block on one side alone cannot stop anything

Even if the shield Blocks enemy bullets, an enemy bullet that Ignores the shield passes through. Reading your own table together with the other party's is what matters.

You → themThem → youResult
BlockBlockBlock
BlockOverlapOverlap
BlockIgnoreIgnore
OverlapOverlapOverlap
OverlapIgnoreIgnore

Swapping left and right gives the same result. If either side is Ignore it is ignored; with no Ignore and one side Overlap it overlaps; with both Block it obstructs. Of course, when collision itself is disabled or movement is not checking for collisions, this table alone will not stop anything.

The shield stops bullets when both are Block, and lets them through when either is Ignore

Hands-On: building a shield that blocks only enemy bullets

We use BP_InputPractice from Enhanced Input Basics. We put a spherical shield around the white character, with enemy bullets flying in from outside and friendly bullets from inside.

First, compare the shield enabled and disabled by restarting Play. After confirming the basic responses, we add toggling with the Q key.

An enabled shield stops the enemy bullet outside, and removing it lets the bullet reach the body. A schematic showing the pale bullet passing outward from inside

1. Create three name tags

Press "New Object Channel..." under Object Channels in "Project Settings" → "Engine" → "Collision" and create these three.

NameDefault Response
PlayerShieldIgnore
EnemyProjectileIgnore
PlayerProjectileIgnore

Default Response is the starting point for how existing settings react to a newly added kind. Since we specify only the targets we need, we start from Ignore. If the new entries do not appear in a part's details, close and reopen the Blueprint.

2. Save three profiles

Open Presets on the same screen and create these three from "New...". Each column of the table is one profile.

ItemShield_ActiveEnemy_BulletPlayer_Bullet
Collision EnabledQuery OnlyQuery OnlyQuery Only
Object TypePlayerShieldEnemyProjectilePlayerProjectile
Response to PlayerShieldIgnoreBlockIgnore
Response to EnemyProjectileBlockIgnoreIgnore
Response to PlayerProjectileIgnoreIgnoreIgnore
Response to PawnIgnoreOverlapIgnore
Response to everything elseIgnoreIgnoreIgnore

Query Only participates in overlap and destination queries. Here we do not drop bullets with rigid-body physics simulation; we move them straight with Projectile Movement.

Since these bullets exist to observe the shield-body relationship, we Ignore walls and floors too. To stop them at walls like a normal bullet, set the bullet's WorldStatic to Block later and configure the wall side as well.

Sponsored

3. Attach the shield to the character

Add a Sphere Collision as a child of BP_InputPractice's CapsuleComponent and name it ShieldCollision. Set Relative Location all to 0, Scale all to 1, and Sphere Radius to 150.

Set ShieldCollision's Collision Presets to Shield_Active and turn Generate Overlap Events off. We do not use the shield's overlap notifications here; it only stops bullets.

If you want to see the sphere's extent during practice, turn off ShieldCollision's Hidden in Game. That outline is a debug display and separate from the finished shield's appearance.

Next select the body's CapsuleComponent. Set Collision Presets to "Custom..." and change only the Response to EnemyProjectile to Overlap, leaving Object Type as Pawn. Turn on Generate Overlap Events too. Leave the original responses such as WorldStatic for walking on floors.

Since we made the new channels' Default Response Ignore, without this change the body would ignore enemy bullets too. The shield and the body are parts of the same Actor, but their response tables are separate.

4. Build a flying enemy bullet

Create a Blueprint with Actor as parent and name it BP_EnemyBullet. First add a Sphere Collision named BulletCollision, drag it onto DefaultSceneRoot, and make it the Root.

Add a Static Mesh Component BulletMesh as its child and choose a Sphere for the visual. With the Sphere from the engine's BasicShapes, setting Scale to 0.2 on all axes gives a diameter of about 20. If you cannot find it, turn on "Show Engine Content" in the asset picker's settings. BulletMesh's Collision Presets is NoCollision.

PartSetting
BulletCollisionSphere Radius = 10, Scale = 1, Collision Presets = Enemy_Bullet
BulletCollisionGenerate Overlap Events on, Simulate Physics off
BulletMeshRelative Location 0, visual only. Collision Presets = NoCollision

Also add a Projectile Movement with these values.

ItemValue
Initial Speed / Max Speed200 for both
VelocityX=200, Y=0, Z=0
Initial Velocity in Local SpaceOn
Projectile Gravity Scale0
Should BounceOff
Sweep CollisionOn
Auto ActivateOn

Now, once Play starts, it travels 200 cm per second along its own local X, which is forward for the bullet. Change the placed bullet's rotation and its travel direction changes too. Gravity is 0, so it does not drop along the way.

Sweep means checking whether anything is hit between the pre-move and post-move positions. Projectile Movement normally moves the Root, so we put the collision-bearing BulletCollision at the Root. Whether you are moving a visual-only part is the thing to check when things pass through.

Projectile Movement moves the Root BulletCollision, while the child BulletMesh is visual only

Sweep can also be specified when you use Set Actor Location yourself. Here we leave bullet movement to Projectile Movement. Spawning bullets during the game is covered in the Spawn Actor and Projectile article.

5. Display where it stopped and when it reached the body

Select Projectile Movement in BP_EnemyBullet and add On Projectile Stop from the events in the details. Connect it to a Print String showing Enemy bullet stopped for 5 seconds. Leave the stopped sphere in place so you can see its position.

Connecting On Projectile Stop to a Print String showing the enemy bullet stopping

Next select BulletCollision and add On Component Begin Overlap. Connect Other Actor to Cast To BP_InputPractice's Object, and the white line from the event to the Cast.

From the Cast's success side, Print String Enemy bullet reached the body for 5 seconds, then call Destroy Actor (Target = self). Leave the Cast Failed side unconnected.

Confirming the overlapped party with a Cast, and on success displaying the arrival and destroying the enemy bullet

The Cast here confirms whether the overlapped party is the practice character. It distinguishes the case where the shield did not stop it and it reached the body. Here we stop at confirming arrival; combine it with the health and damage article for HP reduction.

6. Place the enemy bullet and compare the two states

Use a spot with a flat floor at height 0 and place the PlayerStart at Location = (0, 0, 100), Rotation = (0, 0, 0). The GameMode is BP_InputPracticeGameMode from Enhanced Input Basics. The character spawns from the PlayerStart, so do not add one by hand.

Place BP_EnemyBullet at Location = (800, 0, 88) with Rotation Yaw = 180 and Pitch and Roll = 0. That puts it 8 m in front of the character, flying toward you. Leave no obstacles between the bullet and the PlayerStart, and observe without moving or jumping during Play.

First, with Shield_Active still set, compile, save, and Play. If the enemy bullet approaches and stops on the sphere in front of the character's body, "Enemy bullet stopped" appears.

Next stop Play, change only BP_InputPractice's ShieldCollision to NoCollision, and Play again. This time it does not stop at the sphere; it reaches the character, "Enemy bullet reached the body" appears, and the bullet vanishes.

If you turned off Hidden in Game, the debug outline remains even with NoCollision. Outline display and collision being enabled are separate, so compare the results by the bullet's position and the notification.

We restart Play each time to test the same conditions with a fresh bullet. A bullet that stopped once does not fly again automatically when you disable the shield.

7. Confirm friendly bullets can leave from inside

Stop Play and set ShieldCollision back to Shield_Active. Duplicate BP_EnemyBullet as BP_PlayerBullet and change BulletCollision's Collision Presets to Player_Bullet.

Delete the copied On Projectile Stop and On Component Begin Overlap events, and the Print, Cast, and Destroy logic from them, on the BP_PlayerBullet side. That keeps enemy-bullet notifications from firing on the friendly bullet. Leave the movement settings as they are.

Place BP_PlayerBullet in the level at Location = (80, 60, 88), Rotation = (0, 0, 0). That puts it inside the shield, flying forward.

A top-down layout: the player at the shield's center, the friendly bullet flying right from inside, and the enemy bullet flying left from a distance

Save, Play, and watch whether the inner friendly bullet travels outward while the incoming enemy bullet stops on the sphere. Even with identical collision shapes, the per-target Response changed the result.

Sponsored

8. Toggle the shield with Q

Once that is confirmed, add runtime toggling. Create a Digital (Bool) IA_Shield in the InputPractice folder with Modifiers and Triggers empty. Add a Q key binding to IMC_Common.

Create a Boolean variable bShieldOn in BP_InputPractice with initial value true. Align ShieldCollision's initial profile to Shield_Active as well.

Connect IA_Shield's Started to a Branch with Get bShieldOn on the Condition.

From Started, calling a Branch that goes to OFF when bShieldOn is True and ON when False
  • True side: Set Collision Profile Name to NoCollision → Set bShieldOn = false → Print String "Shield OFF"
  • False side: Set Collision Profile Name to Shield_Active → Set bShieldOn = true → Print String "Shield ON"

Both Set Collision Profile Name nodes have Get ShieldCollision as Target. Enter the name in In Collision Profile Name and turn Update Overlaps on. The Print Duration is 2.

On the True side, changing ShieldCollision to NoCollision and setting bShieldOn to false

Reselecting a profile switches that part's whole settings set. It is not an operation that changes the sphere's size or the settings of the body, which is a different part.

On the False side, restoring ShieldCollision to Shield_Active and setting bShieldOn to true

Click the Play view and press Q before the enemy bullet arrives. Turn it OFF and you can confirm arrival at the body; leave it ON and you confirm the stop at the sphere. Restart Play when repeating.

Common Pitfalls

SymptomWhere to check
The enemy bullet passes through the shieldWhether Shield_Active and Enemy_Bullet Block each other's Object Type. Whether ShieldCollision is still NoCollision
Disabling the shield gives no arrival messageWhether the Capsule's EnemyProjectile is Overlap. Whether Generate Overlap Events is on for both the Capsule and BulletCollision
The bullet doesn't moveCheck Projectile Movement's Auto Activate, Velocity, and Initial Speed
The bullet flies elsewhere or dropsCheck the bullet's Yaw, Initial Velocity in Local Space, and Gravity Scale = 0
It's Block but movement passes throughWhether Sweep Collision is on, whether BulletCollision is the Root, whether Simulate Physics is off
Friendly bullets stop tooWhether BP_PlayerBullet's Object Type is PlayerProjectile. Whether BulletMesh has its own collision
Q doesn't toggleCheck IMC_Common's Q binding, Started, bShieldOn's initial value, and the Set's Target and name
The bullet passes somewhere other than the bodyThe PlayerStart's position and rotation, the bullet's height, the floor height, and whether you moved the character during Play

If the shape itself does not fit, also check choosing between Simple and Complex. Looking at shape, response to targets, and movement method in order lets you find the cause without changing settings all at once.

Bonus: organizing query purpose and classification

Query Only can still stop movement

Collision Enabled chooses what the collision is used for. Start by distinguishing these four common kinds.

SettingHow it is used
No CollisionDisables collision
Query OnlyTraces, overlaps, and destination checks via Sweep
Physics OnlyRigid-body physics simulation
Collision Enabled (Query and Physics)Both queries and physics simulation

A query asks whether a specified position and shape hits something. Character Movement and Projectile Movement check their destinations, so they can be stopped by a Query Only target that Blocks.

Some versions also have entries such as Probe Only, but we do not use them here. To roll a dropped box with physics, consider a setting including Physics and Simulate Physics separately from the bullets here.

Also confirm Hit notifications alongside the movement method. Beyond hitting during a Sweep, contact during physics simulation can also notify. For the latter, enable that Component's Simulation Generates Hit Events.

Separate before the hit, or after the hit

Channels are for separating "targets to block" from "targets to ignore" at the query stage. When you only want to branch post-contact logic — "if the enemy hit is fire-attributed, change the effect" — you can classify with Gameplay Tags instead.

Before adding lots of channels, consider whether the kinds actually collide differently. Rather than a name tag per enemy, grouping what can be handled as a shared "enemy bullet" kind makes the response table easier to follow. Adding Gameplay Tags does not change collision responses.

Confirm settings after changing a profile

Set Collision Profile Name is not merely storing a name in a variable; it changes the Component's collision behavior. Responses you had adjusted with Custom also switch to the chosen profile's contents.

When the result is not what you intended, check the name's spelling and the Target. Reading the applied name with Get Collision Profile Name and comparing against the running Component's details lets you investigate at which stage the settings changed.

Summary

Object Type decides a target's kind, Response writes the reaction per kind, and a profile saves the settings set. When something does not stop, check both your table and the other party's.

For the shield: enemy bullets stop, disabling it lets them reach the body, and friendly bullets get through. Comparing those three in the same place connects the setting names to what happens in game.

References: Collision Response Reference, Collision Enabled types, Projectile Movement, Overlap events, Hit events, Set Collision Profile Name.

Unreal Engine Notes in this section98