PlayerCameraManager and Camera Shake¶
At a glance
Lives in: Blueprint API / Camera Shakes; target is
PlayerCameraManager - Returns: Start Camera Shake returns a camera
shake instance reference that can later be stopped; stop nodes return no
value - Fails by: no visible shake, returning None, or playing only
on the wrong local camera - Official docs:
Start Camera Shake,
Stop Camera Shake,
PlayerCameraManager,
and Cameras
The one-minute version¶
- A PlayerController owns a
PlayerCameraManager. That manager calculates the final camera view for that local player. Start Camera Shakeplays a shake on a specific PlayerCameraManager and returns the shake instance if one starts.- Camera shake is local presentation. In multiplayer, the server can decide that an explosion happened, but each affected client should play its own local shake.
Scalemultiplies shake intensity.Play Spacedecides what coordinate space the shake uses.Stop Camera Shakestops a specific returned instance and invalidates it.- Camera shake is not possession, not view target switching, and not a gameplay stun. It changes how the camera feels, not who controls the pawn.
What it actually does¶
The control chain is:
flowchart LR
PC[PlayerController] --> PCM[PlayerCameraManager]
PCM --> View[Final camera view]
Shake[Camera Shake asset/class] --> PCM
Target[View target / camera actor / pawn] --> PCM
Start Camera Shake asks the manager to create and run a camera shake pattern:
pseudocode of the engine behavior - not engine source
function PlayerCameraManager.StartCameraShake(ShakeClass, Scale, PlaySpace):
if ShakeClass is None:
return None
ShakeInstance = create shake pattern/instance
ShakeInstance.Scale = Scale
ShakeInstance.PlaySpace = PlaySpace
add ShakeInstance to this manager's active shakes
return ShakeInstance
function PlayerCameraManager.StopCameraShake(ShakeInstance, Immediately):
if ShakeInstance is active on this manager:
stop it
invalidate the instance reference
The shake modifies the final view this PlayerCameraManager produces. It does not move the pawn, CameraActor, spring arm, or view target actor in the world.
When it fails (and what failure does)¶
Common causes:
- No PlayerCameraManager target. You called the node without a valid local PlayerController/camera manager.
- Shake class is
Noneor not configured. Nothing useful can be created. - You ran it on the wrong machine. A server's non-local camera manager is not the remote client's screen. Use an owning-client RPC or local event for client presentation.
- Split-screen used the wrong player. Player 0's manager shakes player 0's view, not player 1's.
- Scale is too small or the asset is subtle. The call works but the effect is barely visible.
- You tried to stop a stale instance. A completed/stopped shake instance can already be invalid.
- The camera problem is view target/blend setup. Shake cannot fix looking through the wrong camera.
Failure does not damage the player, stun input, or replicate. It is only a local camera effect. Check the target PlayerController, net mode, local control, and returned instance before changing gameplay logic.
The pattern everyone actually uses¶
For local weapon fire:
Owning client fires weapon
-> local muzzle flash / sound
-> Get Player Controller
-> Get Player Camera Manager
-> Start Camera Shake(RecoilShake, Scale = 0.4)
For server-authoritative explosion with client presentation:
Server validates explosion
-> applies damage / replicated state
-> for affected owning players, Run on Owning Client: Client_PlayExplosionFeedback
Client_PlayExplosionFeedback
-> local sound/VFX
-> PlayerCameraManager Start Camera Shake(ExplosionShake, Scale by distance)
For a long shake you may stop:
Start low-health shake
-> promote Return Value to LowHealthShake
Health recovers
-> Is Valid LowHealthShake
-> Stop Camera Shake(LowHealthShake, Immediately = false)
-> clear LowHealthShake
The C++ twin, for the curious (our own example code):
void ATrainingPlayerController::ClientPlayImpactShake_Implementation()
{
if (!PlayerCameraManager || !ImpactShakeClass)
{
return;
}
ActiveImpactShake =
PlayerCameraManager->StartCameraShake(ImpactShakeClass, 0.75f);
}
Camera shake is not camera switching¶
Use camera shake when the player should feel recoil, impact, rumble-like screen motion, low-health instability, or nearby explosions.
Use Set View Target with Blend when the camera should actually look through another actor:
- death camera,
- inspection camera,
- security camera,
- cutscene shot,
- return to possessed pawn view.
You can combine them, but keep the responsibilities separate.
Lookalikes - which one do I want?¶
| Node / object | Changes / returns | Use when |
|---|---|---|
| Get Player Camera Manager | Local PlayerController's camera manager | You need to start shakes/fades/camera presentation on that player. |
| Start Camera Shake | Starts a shake; returns instance or None |
Recoil, damage, landing, explosion feedback. |
| Stop Camera Shake | Stops a specific returned shake instance | You stored the active shake and want that one stopped. |
| Stop All / Stop All Instances | Stops broader groups of shakes | Cleanup after death/menu/cutscene or ending a repeated effect. |
| Set View Target with Blend | Changes what actor the player views through | Camera cut/blend, death cam, inspection view. |
| Spring Arm lag | Smooths normal follow-camera movement | The gameplay camera should feel less stiff over time. |
| Force feedback / gamepad rumble | Controller haptics | You want physical gamepad feedback, not camera motion. |
Rule of thumb: Camera shake is local view feel. View target is what camera you look through. Possession is what body you control.
Going deeper¶
- Set View Target with Blend - camera view switching without possession.
- Spring Arm + Camera - normal third-person camera rig setup.
- First weapon fire pattern and impact cleanup
- local feedback versus server gameplay results.
- Has Authority / Switch Has Authority / Is Locally Controlled
- choosing the right machine for camera presentation.
- Create Local Player / Get Num Player Controllers
- split-screen player indexes and local cameras.
- Official docs: Start Camera Shake, Stop Camera Shake, APlayerCameraManager, and Cameras.
- Engine source (requires engine access - we do not reproduce it here):
APlayerCameraManager::StartCameraShake,APlayerCameraManager::StopCameraShake,APlayerCameraManager::StopAllInstancesOfCameraShake, andAPlayerCameraManager::UpdateCamerainEngine/Source/Runtime/Engine/Private/PlayerCameraManager.cpp; camera shake base classes underEngine/Source/Runtime/Engine/Classes/Camera/.