Building Hit Feel in UE5: Hitstop, Screen Shake, and Knockback

Created: 2026-07-20Last updated: 2026-09-06

Convey attack impact with a brief slowdown, a screen shake, and knockback. Adds three effects to a Third Person practice dummy, diagramming the Blueprint wiring and how to tune them so they never overwhelm.

Landing an attack drops HP. But if the enemy just stands there, it is hard to tell the hit connected. In that case, alongside the damage number, build a reaction at the moment of impact .

Their motion dulls for an instant, the screen shakes slightly, and they get pushed back. From the same attack, where you hit and how hard becomes much clearer. Here we add all three to a practice dummy and compare.

A blue player striking a dummy, with a brief slowdown, screen shake, and knockback added

What You'll Learn

  • What hitstop, screen shake, and knockback each convey
  • Structuring the three effects so they fire only on a hit
  • Slowing only the target briefly and returning it to normal speed
  • Comparing effects one at a time to tune the feel

Three reactions convey the hit

The sensation returned to a player's input is called game feel . Within that, telling them an attack landed through motion, visuals, and sound is the hit feedback we build here.

EffectWhat it doesWhat it conveys
HitstopBriefly stops or slows motion at the moment of impactThe sense of the attack biting in
Screen shakeShakes the camera brieflyThe strength of the impact
KnockbackPushes or launches the target backThe direction of force and who was hit

You do not need all three at full strength. A light attack reads with just a small shake. A heavy blow can add a brief hitstop and a larger launch.

What matters is calling them at the moment a hit is confirmed, not the moment the attack button is pressed . Launching things or shaking hard on a whiff removes the cue that tells a hit apart.

From attack input into the hit check, calling the three reactions only when it connects
Sponsored

Hands-On prep: build a dummy that takes hits

Use a Third Person level where pressing E attacks a dummy in front of you. For the attacking side, prepare the attacker from the health and damage article. It extends a 500 cm line in front of the character and sends 20 damage to what it hits with Apply Damage .

This article builds only the receiving side: a dummy with no HP or death logic, so you can test the effects endlessly. It assumes you can create Blueprint variables and Custom Events, in single player.

  1. Create a Blueprint Class with "Character" as its parent and name it BP_HitFeedbackDummy . A Character is an Actor with walking and falling built in. The Launch Character we use later needs it, so do not choose a plain Actor.
  2. Add a "Static Mesh" component named Body as a child of the Capsule Component, with mesh Cube , Scale (0.6, 0.6, 1.8) , and Location (0, 0, -6) . If you cannot find Cube, turn on "Show Engine Content" and choose Engine/BasicShapes/Cube .
  3. Set the Capsule Component's Radius to 42 and Half Height to 96 . Change the Collision Preset from "Pawn" to "Custom" and set the Visibility response to Block so the attack line hits this capsule.
  4. Set Body's Collision Preset to "NoCollision" with Simulate Physics off. Leave movement and collision to the capsule.
  5. In Class Defaults, turn Can Be Damaged on and set Auto Possess Player and Auto Possess AI to "Disabled". In Character Movement, turn Run Physics With No Controller on so a dummy without AI still updates movement and falling.
  6. Compile and place it in the level. Put the capsule's center about 100 cm above the floor and about 300 cm from the player. If an earlier practice box exists, move it out of the attack line.
The Character-based dummy's setup and the settings needed for hit detection and movement

First walk toward the dummy and press E , confirming the debug line hits it. The attack direction is the character's forward, not the camera's. The dummy need not move at this stage.

All three effects go in BP_HitFeedbackDummy 's Event Graph. At the end we call them together from the hit event.

Screen shake: brief and small

Start with the shake, whose visual change is easiest to see. Camera Shake temporarily adds position and rotation changes to the camera. Here we use a short rotational shake, like a small nod.

Make the shake pattern an asset

  1. In the Blueprint Class creation screen, open "All Classes", search for CameraShakeBase , and choose it as the parent. Name it CS_HitFeedback .
  2. In the opened Blueprint's Class Defaults, set "Root Shake Pattern" to "Perlin Noise", one way of generating a shake.
  3. Set the following values, then compile and save. Expand Root Shake Pattern to find them.
SettingStarting valueMeaning
Single InstanceOnRestarts the same shake instead of stacking on mashing
Duration0.15Total length of the shake, in seconds
Blend In Time / Blend Out Time0.02 / 0.08Time easing the shake in and out
Rotation → Pitch → Amplitude1.0The vertical shake amount
Rotation → Pitch → Frequency25How fine the shake is
Rotation → Yaw / Roll → AmplitudeBoth 0No horizontal swing or tilt
Location → X / Y / Z → AmplitudeAll 0Do not shake the camera position
FOV → Amplitude0Do not change the field of view

Leave Rotation's Amplitude Multiplier and Frequency Multiplier at 1 . Amplitude is the shake amount and Frequency is how fine it is. Changing only the amount at first makes differences easy to grasp.

Setting Perlin Noise on CameraShakeBase and shaking only Pitch, briefly

Send the shake from the dummy to the camera

Create an argument-less Custom Event PlayLocalHitShake on BP_HitFeedbackDummy . A Custom Event here is an entry point you can call by name later.

Wire its white exec pin to Start Camera Shake with Shake Class CS_HitFeedback , Scale 0.5 , and Play Space "Camera Local". Scale is how many times over to apply this one shake.

Connect Get Player Camera Manager 's Return Value to Target with Player Index 0 . The Player Camera Manager manages the camera the player sees. Rather than targeting the dummy itself, we tell that manager to "shake the screen".

Calling Start Camera Shake from PlayLocalHitShake and passing Player Camera Manager to Target

As an interim check, place Event AnyDamage in the Event Graph and wire white exec to the PlayLocalHitShake call. Play, attack the dummy, and a small shake on impact means success. Disconnect that wire afterwards; we replace it with the three-effect call at the end.

Knockback: launch away from the attacker

Next we push the dummy. Launch Character gives velocity to a Character. That velocity is used on the next Character Movement update and puts the Character into Falling, the airborne state.

Rather than sliding along the ground, we make it rise slightly and fly back. First, build the launch direction.

Build the direction from the position difference

If the attacker is to the dummy's left, launch right; if to the right, launch left. So we build a vector from the attacker to the dummy with "dummy position − attacker position" . A vector here is an arrow representing "which way, and how far".

As the attacker's position changes, so does the direction away from them as seen from the dummy
  1. Create a Custom Event ApplyHitKnockback on BP_HitFeedbackDummy with an input SourceActor typed Actor Object Reference . It receives the attacker.
  2. Place two Get Actor Location nodes, one with Target Self and one connected to the SourceActor blue output pin on the Custom Event.
  3. In a Vector subtraction, connect Self's position to the upper A and SourceActor's position to the lower B. Reversing them would pull the dummy toward the attacker.
  4. Connect the subtraction result to Normalize 2D (Vector) 's A. It drops the vertical difference and normalizes the horizontal length to 1, so launch strength does not vary with distance.
  5. Multiply the result by Float 600 and add Vector (0, 0, 150) . That gives 600 horizontally and 150 upward. The unit is cm per second, not a distance of 600 cm .
Subtracting the attacker's position from the dummy's and normalizing the horizontal length to 1

With the direction decided, add strength to it.

Multiplying the normalized direction by 600 and adding an upward speed of 150

The two diagrams connect Normalize 2D (Vector) 's Return Value to the Vector input of the Vector-times-Float multiply.

Pass the velocity to the Character

Wire ApplyHitKnockback 's white line to Launch Character with Target Self and Launch Velocity from the vector computed above. Turn on both "XY Override" and "Z Override". Override means replacing the current movement speed with the specified velocity rather than adding to it.

Passing ApplyHitKnockback's exec wire and the computed velocity to Launch Character

For an interim check, wire Event AnyDamage 's white line to the ApplyHitKnockback call and Damage Causer to SourceActor. Damage Causer is the attacker passed as Self in the attacker's Apply Damage. In this practice attack, the player goes there.

Play and attack the dummy; rising slightly and flying away from the player means success. Hit from the other side and confirm the direction flips. Disconnect this temporary wiring afterwards.

Sponsored

Hitstop: slow the target for an instant

Finally, slow the dummy only at the moment of impact. Stretching the start of the push-back briefly shows the moment of contact. Rather than a full stop, we run the dummy at 0.05 times normal speed for 0.07 seconds .

Change the target's time multiplier, not the world's

Time Dilation is the multiplier applied to how time progresses. 1 is normal and 0.5 is half speed. UE has a Global one changing the world and a Custom one per Actor.

SettingMain useHere?
Global Time DilationSlowing the whole world togetherStays at 1
Custom Time DilationSlowing a specific Actor's Tick, Character movement, and moreSet the dummy to 0.05

Tick is the update logic that runs repeatedly as the game progresses. Custom Time Dilation changes the elapsed time passed to that Actor. It does not put sounds, timers, and physics related to the Actor all on the same multiplier. Here we apply it to a dummy that moves via Character Movement.

Comparing world-wide slow motion with our approach of slowing only the dummy's Character Movement

For restoring, use Set Timer by Event . It is a reservation that calls a connected event once the specified time arrives . Execution continues after reserving, so the screen shake and knockback can start on the same hit.

That timer is not slowed by the dummy's Custom Time Dilation. It is affected by Global Time Dilation and by pausing, though. Keep Global at 1 and test unpaused. This does not mean "Timers ignore time changes".

Remember the original speed and reserve the restore

Create these variables on BP_HitFeedbackDummy .

VariableTypeDefaultRole
SavedTimeDilationFloat1Remembers the multiplier before slowing
bHitStopActiveBooleanfalseRemembers whether a hitstop is already running

Then create two argument-less Custom Events named StartLocalHitStop and EndLocalHitStop . Wire the Start side in this order.

  1. StartLocalHitStopBranch with bHitStopActive into Condition. Leave True unconnected so a running hitstop does not start a new one.
  2. False → Set SavedTimeDilation , with Self's Get Custom Time Dilation as the value, saving the pre-change multiplier.
  3. Set bHitStopActive to true.
  4. Set Custom Time Dilation with Target Self and value 0.05 .
  5. Set Timer by Event with Time 0.07 and Looping off. Connect EndLocalHitStop 's red delegate output to the red Event input. A delegate is the pin passing "the event to call later" to the timer.
Checking with a Branch whether it is already running and saving the pre-change time multiplier only the first time

Once saved, actually slow it and reserve the restore.

Lowering the dummy's time multiplier to 0.05 and reserving a timer that calls EndLocalHitStop after 0.07 seconds

The images split one graph into a first and second half. Connect the first half's Set bHitStopActive exec output to the second half's Set Custom Time Dilation exec input. EndLocalHitStop is the same event used in the restore logic next.

When the time arrives, return to the saved speed

Wire EndLocalHitStop 's white line to Set Custom Time Dilation with Target Self and SavedTimeDilation as the value. Then set Set bHitStopActive to false so the next hitstop can be accepted.

Restoring the saved multiplier from EndLocalHitStop and clearing the hitstop flag

We do not write a fixed 1 here so it also restores correctly when the speed was already something else. And saving repeatedly during a hitstop would overwrite the original value with 0.05 . The first Branch prevents that.

Giving each dummy its own restore logic matters too. Relying on the attacker's "last target hit" variable can leave an earlier dummy unrestored once you hit another. This structure has each dummy remember and restore its own multiplier.

Call all three at the moment of impact

With the three effects built, wire them from BP_HitFeedbackDummy 's Event AnyDamage .

  1. Event AnyDamageBranch with Damage > 0 into Condition.
  2. True → the exec-pin Is Valid with Damage Causer into Input Object. That checks whether the Actor passed as the attacker is usable.
  3. Is Valid → Sequence . The invalid case and the first Branch's False can stay unconnected.
  4. Wire Sequence's Then 0 → StartLocalHitStop , Then 1 → PlayLocalHitShake , and Then 2 → the ApplyHitKnockback call. Add Then 2 with "Add pin".
  5. Connect Event AnyDamage's Damage Causer to ApplyHitKnockback 's SourceActor. Target on all three calls is Self.
Checking whether Event AnyDamage's Damage is greater than 0

Also confirm the attacker is valid.

Checking that Damage Causer is a valid Actor before continuing to the Sequence

Once both checks pass, call the three effects together.

Calling the effects from Sequence's Then 0, 1, and 2, passing the attacker to SourceActor

Wire the three diagrams as Branch's True → Is Valid's exec input, then Is Valid's success side → Sequence's exec input. The blue Damage Causer wire is used both for the Is Valid check and for passing SourceActor.

Sequence sends white exec through several outputs in order. After Then 0 reserves the timer, it continues to Then 1 and Then 2 without waiting for expiry. So the shake and knockback also start on this hit.

Play and attack, and the screen shakes slightly while the dummy moves slowly at first and then flies back. If the hitstop is hard to notice, temporarily raise the Timer's Time to 0.3 to see the boundary between slow and normal motion. Set it back to 0.07 afterwards.

This dummy is for practice, so it plays effects for any positive damage. Once real enemies have invincibility frames or guarding, move these three calls after the logic that actually accepted the damage . Event AnyDamage arriving does not guarantee HP drops.

Sponsored

How to tell when it is too much

Once it is done, before strengthening everything at once, compare by removing one effect at a time. Stop Play, disconnect one white wire from the Sequence to an effect, and play again to see that effect's role. Restore the connections after comparing.

What to compareWhat to watchWhere to tune
Hitstop on versus offWhether hits read better, or the attack flow feels heavyTimer's Time from 0.070.04
Shake on versus offWhether impact carries, or you lose track of the targetStart Camera Shake's Scale from 0.50.25
Knockback on versus offWhether you can tell who was hit, or your follow-up cannot reachThe horizontal multiplier from 600300

Stronger is not always better. In a combo, sending the target too far makes the second hit hard to land. Keeping normal attacks light and strengthening only the finisher creates contrast without fighting the controls.

Removing hitstop, shake, and knockback one at a time to compare, and lowering values when too strong

Duplicate the dummy, attack two in a row, and confirm both return to normal speed. This structure does not extend the time on an additional hit during a hitstop. It restores 0.07 seconds after the first hit, while the shake and knockback still fire on additional hits.

When you want to add light, sound, and numbers

With three reactions working, you can add more information. Deciding what you want to convey before choosing keeps things from getting merely noisy.

Reaction to addWhat it conveysHow to build it
Flash the target brieflyWhich target was hitChanging color with a Material Instance
Play a hit soundHits read even when your eyes are elsewherePlaying sound effects
Emit sparksWhere it hitHit effects with Niagara
Show damage numbersHow much it didFloating damage numbers

Add one and try the same attack a few times. You do not need sound, light, and numbers all at once; it is enough if what you want to convey reads.

What light, sound, sparks, and numbers each convey

Bonus: Good to Know Up Front

  • Anim Notify and the hit are separate. A Notify announces where in the attack animation the check happens. At that timing you run a Trace or Overlap, and when the target accepts damage, you call these effects.
  • Keep the Timer's Time positive. At 0 or below the timer is cleared. Setting Time to 0 to disable hitstop would lower the multiplier with no restore reserved. To compare, disconnect the call's white wire instead.
  • If other logic also changes Custom Time Dilation, adjust for it. If a slow spell expires during a hitstop, for instance, restoring the old multiplier alone leaves the state inconsistent. In this hands-on, hitstop is the only thing rewriting this dummy's multiplier.
  • Launch Character also changes the movement state. When combining it with AI move commands or ground sliding, also handle things like stopping the chase while launched. Physics-simulating boxes need a different mechanism.
  • Screen shake is a per-player effect. Player Index 0 here is the first local player in single player. In multiplayer, separate the side processing damage from the side shaking the screen. Letting players lower or disable shake intensity in settings makes tuning easier.

Official references: Camera Shakes, Start Camera Shake, Launch Character, Gameplay Timers. The hands-on is a Blueprint example based on those specifications and has not been verified on UE hardware.

Summary

Attack feel is built from reactions telling the player a hit landed. Here a brief slowdown showed the moment of impact, a screen shake added force, and knockback expressed the direction.

Confirm each on a practice dummy first, then gather them into the hit logic. Comparing against the version with an effect removed, not only adding effects, reveals the strength your game actually needs.

Unreal Engine Notes in this section98