Making Hits Feel Good in UE5: Hitstop, Camera Shake, and Knockback

Created: 2026-07-20

Solve the "my attacks don't feel like they connect" problem by layering effects. Covers the difference between Global and Custom Time Dilation for hitstop (including how timers get caught in the crossfire), Camera Shake with Start Camera Shake, and knockback via Launch Character, while delegating light, sound, and numbers to dedicated articles so you can focus on the mix.

You hit an enemy, damage lands, and HP drops. And yet somehow it doesn't feel like it connected. The numbers move but the impact feels weightless, and that's where progress stalls.

The cause isn't one missing feature. That sense of impact comes from layering small effects at the same instant: freezing briefly, shaking the screen, launching the target, flashing them, playing a sound. This article covers building the three at the core of that (hitstop, camera shake, and knockback), delegates the rest to dedicated articles, and focuses on how to layer and balance them.

Freeze, shake, knockback, light, and sound all layering onto the single instant an attack connects

What You'll Learn

  • Impact comes from layering several effects, not one feature
  • The key to hitstop: the difference between Global and Custom Time Dilation
  • Camera shake (Camera Shake) and knockback (Launch Character)
  • Light, sound, effects, and numbers get delegated to dedicated articles so you can focus on the mix
  • Hands-on: layer "freeze + shake + launch" at the moment of impact

Sponsored

"Feeling the Hit" Is a Composite

Start with the premise. A satisfying attack isn't built from a single feature. At the moment of impact, several small effects happen simultaneously.

Exploded diagram showing layers of freeze, shake, knockback, flash, effects, sound, and damage numbers stacking vertically from a single moment of impact

Here are the common ones.

EffectRoleCovered here?
HitstopFreeze briefly to sell the biteBuilt in this article
Camera shakeShake the camera on impactBuilt in this article
KnockbackLaunch the target backwardBuilt in this article
Hit flashFlash the target for an instantDelegated to a dedicated article
Hit effectSparks, slash arcsDelegated to a dedicated article
Sound effectPlay an impact soundDelegated to a dedicated article
Damage numbersPop numbers outDelegated to a dedicated article

What matters is layering these at the same instant, in the right amounts. One alone isn't enough, and maxing everything out breaks the screen. So this article builds the three core ones (freeze, shake, launch) yourself, and combines tools from existing articles for the rest.

Note that this article assumes you can already detect that an attack connected. The mechanism for applying damage and reducing HP is covered in the health and damage article.

Sponsored

Hitstop: Two Kinds of Time Dilation

Hitstop is freezing time for just a few frames when an attack connects. That bite you feel the instant a punch or slash "lands" is almost entirely this.

UE has two ways to change the speed of time, and they differ in scope. Mixing them up is the first stumbling block.

Comparison diagram: Global Time Dilation freezing the whole screen on the left, Custom Time Dilation freezing only one enemy while the player still moves on the right
MethodWhat slows downWhen to use it
Set Global Time DilationThe whole worldBullet time, global slow-mo
An Actor's Custom Time DilationOnly that ActorFreezing just the target that got hit

Set Global Time Dilation is a GameplayStatics node where 1.0 is normal and 0.05 is 5% speed (slow motion). But it slows down literally everything, including the player and effects.

Actors, meanwhile, have a Custom Time Dilation property you can change individually with Set Custom Time Dilation. An Actor's actual time speed is Global × Custom, so leaving Global at 1.0 and setting the struck target's Custom to 0.15 freezes that target alone for an instant while you keep moving normally.

The Timer Trap

Here's where a lot of people get caught. Timers and Delays are affected by Global Time Dilation.

Diagram showing that with Global Time Dilation at 0.05, a timer set to 0.1 seconds takes about 2 seconds in real time

Say you set Global to 0.05 and set a timer to restore it after 0.1 seconds. That 0.1 seconds is 0.1 seconds inside the slowed world, so in real time it stays frozen for roughly 2 seconds (0.1 ÷ 0.05). That's what's behind "I meant to freeze for an instant and it never came back."

The reliable way to avoid it is to use Custom Time Dilation for hit reactions. Timers obey Global Time Dilation, but they do not obey an Actor's Custom Time Dilation. Leave Global at 1.0 and lower only the target's Custom, and your restore timer runs on real time and comes back cleanly.

GoalWhat to useHow to restore
Freeze only the struck target brieflyCustom Time DilationA timer, on real time
Slow the whole screen (a set piece)Global Time DilationRestore on input or an event (avoid short fixed timers)

Camera Shake

Camera shake is a brief tremor on impact. Building it takes two steps.

  1. Author the shake: Create a Blueprint Class with Legacy Camera Shake as the parent and name it CS_Hit (this is the one whose details panel exposes shake values directly; using Camera Shake Base as the parent requires Root Shake Pattern setup, described below)
  2. Play it: Call Start Camera Shake at the moment the attack connects
Diagram of CS_Hit's Oscillation settings card next to the node calling Start Camera Shake on the Player Camera Manager

Choosing Legacy Camera Shake puts the shake settings (Oscillation Duration, Rot Oscillation) directly in the class's details panel. Adding a light rotational shake (Rotation Oscillation) first is the easiest thing to work with.

Note: If you parent to the newer Camera Shake Base, values don't appear directly in the details panel. You assign a Wave Oscillator (or Perlin Noise) to Root Shake Pattern and set Amplitude and Frequency on that Pattern. The workflow differs, so starting with the more straightforward Legacy Camera Shake is the recommendation.

SettingBallpark valueMeaning
Oscillation Duration0.15How long it shakes (seconds)
Rotation Oscillation → Pitch → Amplitude1.0–3.0Size of the vertical shake
Rotation Oscillation → Pitch → Frequency20–40Speed of the shake
Blend In Time / Blend Out Time0.05 / 0.1Ramp up and settle

To play it, call Start Camera Shake on the Player Camera Manager. Get it with Get Player Camera Manager, pass CS_Hit to Shake Class and a strength to Scale (1.0 is the baseline). You can also use Client Start Camera Shake from the Player Controller (use that in multiplayer when you only want that client's camera affected).

Leading with rotational shake (Rotation Oscillation) rather than positional shake (Location Oscillation) is easier on the stomach and loses less on-screen information. Save strong positional shake for limited moments like large explosions.

Knockback

Knockback launches the target backward. If the target is a Character (something with Character Movement), Launch Character is the easiest option.

Diagram of the Blueprint feeding forward vector × 600 into Launch Character's Launch Velocity with XY Override on, and the resulting character sliding back
PinTypeMeaning
Launch VelocityVectorLaunch speed (cm/s). Direction × magnitude
XY Overridebooltrue overrides horizontal speed, false adds to it
Z Overridebooltrue overrides vertical speed, false adds to it

Launch Velocity is a direction × magnitude vector. Multiply the attacker's forward vector (Get Actor Forward Vector) by 600 and the target flies the way you swung. That only works correctly while the attacker is facing the enemy, though. To launch "outward from the source" regardless of facing, use the normalized direction of target position − attacker position.

Setting XY Override to true ignores the target's current walking speed so it launches cleanly. For Z Override, if you don't want any vertical component, set Launch Velocity's Z to 0 and leave it false (false means "add," so any Z value gets summed in).

If the target isn't a Character (a plain Static Mesh or a trap), Launch Character isn't available. In that case you enable physics simulation and use Add Impulse. How Character velocity works is covered in the Character Movement article.

Sponsored

Light, Sound, Effects, and Numbers Live Elsewhere

With freeze, shake, and launch as your foundation, the rest of the presentation is just layering tools from articles that already exist. Rather than building everything here, we delegate and focus on the combination.

EffectToolReference article
Hit flash (a brief white flash)Dynamic Material InstanceThe Dynamic Material Instance article
Hit effects (sparks, slash arcs)NiagaraThe Niagara article
Sound effects (impact sounds)Sound Cue / MetaSoundsThe Sound Cue article
Damage numbersWidget Component / screen projectionThe overhead bars and damage numbers article
Pinpointing the moment of impactAnim NotifyThe Animation Montage article

The standard hit flash is to make the target's material a Dynamic Material Instance and briefly raise an emissive scalar before bringing it back. Timeline interpolation is well-suited to bringing the value back smoothly. Sparks at the moment of impact go to Niagara, impact sounds to the Sound Cue article, and popping damage numbers to overhead bars and damage numbers.

Once you have the foundation of game feel in place, finishing the screen is just a matter of adding one part at a time from each of those articles.


Hands-On: Build the Instant a Slash Connects

A punch in a beat-em-up, a slash in an ARPG, a stomp in a 2D action game. How you present the 0.1 seconds after an attack connects shapes the feel in any genre. Here we'll layer "freeze + shake + launch" all at the moment of impact.

What It Looks Like Running

With no effects, the enemy just stands there when hit. Layer all three and the screen jolts once on impact, the enemy freezes for an instant, and then slides backward.

Before/after comparison of a screen where the enemy doesn't react versus one where freeze, shake, and knockback combine to make the enemy recoil

Setup

Create a new project from the Third Person template and prepare the following. For attack hit detection and Apply Damage, you can use the hands-on from the health and damage article as-is.

What you needDetails
BP_EnemyAn enemy with Character as its parent class (Character is required for knockback)
CS_HitA shake with Legacy Camera Shake as its parent (configured with the values in the table above)
Attack inputAn attack on BP_ThirdPersonCharacter that fires a Line Trace forward

Give the attacking BP_ThirdPersonCharacter these variables.

VariableTypeDefaultPurpose
HitStopScaleFloat0.15Custom Time Dilation while frozen
HitStopTimeFloat0.07Freeze duration (seconds, real time)
KnockbackStrengthFloat600.0Knockback strength
ShakeScaleFloat0.5Camera shake strength
LastHitActorActor (reference)NoneRemembers who to restore on recovery

The Graph at the Moment of Impact

Right after the Line Trace hits the enemy and you've sent Apply Damage, build the following while still holding Hit Actor. The camera belongs to the attacker, so all the presentation lives on the attacker's side.

Blueprint node graph branching from On Hit into Custom Time Dilation freeze, a recovery timer, Start Camera Shake, and Launch Character
On Hit Confirmed (holding Hit Actor)
  → Set LastHitActor = Hit Actor
  // (1) Hitstop: freeze only the target and self. Don't touch Global
  → Set Custom Time Dilation (Target = Hit Actor, Value = HitStopScale 0.15)
  → Set Custom Time Dilation (Target = Self,      Value = HitStopScale 0.15)
  → Set Timer by Event (Time = HitStopTime 0.07, Looping = false) → EndHitStop
  // (2) Camera shake
  → Get Player Camera Manager → Start Camera Shake (Shake Class = CS_Hit, Scale = ShakeScale 0.5)
  // (3) Knockback
  → Cast Hit Actor To Character
        → Launch Character
              Launch Velocity = Get Actor Forward Vector(Self) × KnockbackStrength(600)
              XY Override = true / Z Override = false

Custom Event EndHitStop
  → Set Custom Time Dilation (Target = LastHitActor, Value = 1.0)
  → Set Custom Time Dilation (Target = Self,         Value = 1.0)

Using Custom Time Dilation for the freeze is the key point. Because Global is untouched, the recovery Set Timer by Event fires EndHitStop after a real-time 0.07 seconds and restores cleanly. Swap it for Set Global Time Dilation and, as described above, the recovery timer slows down too and never comes back.

Verify It

Hit Play and slash the enemy.

  • On impact → The screen jolts once (about 0.15 seconds)
  • At the same time → The enemy and player freeze for 0.07 seconds, and immediately after, the enemy is launched backward (how far it travels depends on floor friction and deceleration as well as initial speed, so tune the feel with Launch Velocity's magnitude)
  • Compared to no effects → The sense that it "landed" is obvious

Here's how to narrow it down when something goes wrong.

  • No shakeStart Camera Shake's target isn't the Player Camera Manager, or Shake Class is empty
  • No freeze → You used Set Global Time Dilation where you meant Set Custom Time Dilation (Global freezes the whole screen)
  • Frozen forever → You wrote the recovery with Delay and also lowered Global Time Dilation. The Delay slows down too and never returns. Switch to Custom + Timer
  • No knockback → The target isn't a Character. Launch Character is Character-only (Static Meshes need physics + Add Impulse)
  • Enemy flies too far / doesn't slide → It's either KnockbackStrength's magnitude or how you're handling XY Override (true overrides, false adds)

Two things to take away.

  • Custom for freezing, Global for slow-mo: Freezing only the target with Custom Time Dilation keeps the recovery timer out of the crossfire. Use Global only when you want a full-screen bullet time
  • The first few frames do the most work: Layer hitstop 0.07 seconds, shake 0.5, and knockback at the same instant, then add light and sound on top (Niagara, Sound Cue). Max everything out and the player can't read what happened (next section)
Sponsored

How to Tell When It's Too Much

More effects don't automatically mean better. Max everything out and the screen fills with information, and the impact actually disappears.

  • Hitstop that's too long: Past 0.3 seconds it stops reading as "heavy" and starts reading as "sluggish." Around 0.05–0.1 seconds for normal attacks, slightly longer for specials
  • Shake that's too strong: A big shake every time makes people motion sick. Keep Scale low as a baseline and raise it only for heavy attacks
  • Grade the intensity: Putting a real gap in the amount of presentation between light attacks, heavy attacks, and specials communicates their relative power through feel. If everything is maxed, that information is gone

Game feel is about distribution, not addition. Grade it, like hitstop alone for light attacks and shake plus knockback for heavy ones, and the screen becomes both readable and satisfying.

Bonus: Good to Know for Later

  • Pinpoint impact with Anim Notify: Firing the presentation on the frame the attack button is pressed makes it trigger even on a whiff, which kills the effect. The moment the sword actually touches is best captured with an Anim Notify in the attack animation
  • Don't shake the camera in Tick: Shake built by offsetting the camera position yourself every frame in Event Tick behaves differently at different frame rates. Camera Shake is time-based and stays stable (→ designing without Tick)
  • Timers keep running during hitstop: The reason to use a Timer rather than a Delay for recovery is to avoid the Global Time Dilation crossfire described above. With Custom Time Dilation, the recovery timer runs on real time
  • Knockback direction should be "outward from the source": You can build it from the attacker's forward vector or from the direction of target position − attacker position. The latter is more natural when the source is a point, like an explosion (→ Damage Causer in the damage article)
  • When it feels weak, remove rather than add: The reflex when impact feels weak is to add more presentation, but sometimes the existing effects cancel each other out. Turn everything off once and rebuild starting from hitstop alone, and you'll see which pieces are actually working

Summary

  • "Feeling the hit" isn't one feature, it comes from layering freeze, shake, launch, flash, and sound
  • Hitstop is safest when you freeze only the target with Custom Time Dilation. Global drags in the whole screen and your timers with it
  • Camera shake is Legacy Camera Shake + Start Camera Shake (target: Player Camera Manager)
  • Knockback is Launch Character, usable when the target is a Character
  • Light, sound, effects, and numbers are delegated to dedicated articles, so this article focuses on layering and balance
  • It's distribution, not addition. Max everything out and the impact disappears instead

In the attack you're building now, does anything on screen move when it connects? Start by adding a single hitstop.