LightCameraShake
Key RequiredUniversal

LightCameraShake

Universal Scripttheflaviantheflavian 460 views 687 executesUpdated Oct 7, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•110 lines (3541 chars)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")

local player = Players.LocalPlayer
local camera = workspace.CurrentCamera

local character, humanoid, rootPart, rootJoint
local originalRootC0 = CFrame.new()

local jumpOffset = 0
local jumpVelocity = 0

local function setupCharacter(char)
 character = char
 humanoid = char:WaitForChild("Humanoid")
 rootPart = char:WaitForChild("HumanoidRootPart")
 
 rootJoint = rootPart:FindFirstChild("RootJoint") 
  or (char:FindFirstChild("LowerTorso") and char.LowerTorso:FindFirstChild("RootJoint"))
 
 if rootJoint then
  originalRootC0 = rootJoint.C0
 end

 humanoid.StateChanged:Connect(function(_, newState)
  if newState == Enum.HumanoidStateType.Jumping then
   jumpVelocity = -0.15
  elseif newState == Enum.HumanoidStateType.Landed then
   local fallSpeed = math.abs(rootPart.AssemblyLinearVelocity.Y)
   local impact = math.clamp(fallSpeed / 35, 0.15, 0.45)
   jumpVelocity = -impact
  end
 end)
end

if player.Character then setupCharacter(player.Character) end
player.CharacterAdded:Connect(setupCharacter)

local WALK_INTENSITY = 0.16
local WALK_FREQ = 10

local RUN_INTENSITY = 0.30
local RUN_FREQ = 14

local TILT_INTENSITY = 0.06
local LERP_SPEED = 0.18

local tickCounter = 0
local lastCameraRotation = camera.CFrame
local currentCameraTilt = 0
local currentBobOffset = Vector3.new()
local currentBodyTilt = Vector3.new()

RunService.RenderStepped:Connect(function(deltaTime)
 if not humanoid or not rootPart or humanoid.Health <= 0 then return end

 local velocity = rootPart.AssemblyLinearVelocity * Vector3.new(1, 0, 1)
 local currentSpeed = velocity.Magnitude
 local isGrounded = humanoid.FloorMaterial ~= Enum.Material.Air

 if currentSpeed > 0.5 and isGrounded then
  local isRunning = currentSpeed > 18
  local intensity = isRunning and RUN_INTENSITY or WALK_INTENSITY
  local freq = isRunning and RUN_FREQ or WALK_FREQ

  tickCounter += deltaTime * freq

  local bobX = math.cos(tickCounter * 0.5) * (intensity * 0.65)
  local bobY = math.abs(math.sin(tickCounter)) * intensity

  currentBobOffset = currentBobOffset:Lerp(Vector3.new(bobX, bobY, 0), LERP_SPEED)
 else
  tickCounter = 0
  currentBobOffset = currentBobOffset:Lerp(Vector3.new(), LERP_SPEED)
 end

 local springStiffness = 180
 local springDamping = 12
 local force = -springStiffness * jumpOffset - springDamping * jumpVelocity
 jumpVelocity += force * deltaTime
 jumpOffset += jumpVelocity * deltaTime

 local deltaCFrame = camera.CFrame:ToObjectSpace(lastCameraRotation)
 local _, yawDelta = deltaCFrame:ToEulerAnglesYXZ()
 lastCameraRotation = camera.CFrame

 local targetCamTilt = math.clamp(yawDelta * 1.5, -TILT_INTENSITY, TILT_INTENSITY)
 currentCameraTilt = currentCameraTilt + (targetCamTilt - currentCameraTilt) * LERP_SPEED

 camera.CFrame = camera.CFrame 
  * CFrame.new(currentBobOffset.X, currentBobOffset.Y + jumpOffset, 0)
  * CFrame.Angles(0, 0, currentCameraTilt)

 if rootJoint then
  local localVel = rootPart.CFrame:VectorToObjectSpace(velocity)
  
  local targetBodyX = -localVel.Z * 0.015
  local targetBodyZ = localVel.X * 0.015
  local targetBodyY = -yawDelta * 0.5

  currentBodyTilt = currentBodyTilt:Lerp(Vector3.new(targetBodyX, targetBodyY, targetBodyZ), LERP_SPEED)

  local bodyBobY = (currentBobOffset.Y * 0.5) + (jumpOffset * 0.7)
  local bodyBobX = currentBobOffset.X * 0.3

  rootJoint.C0 = originalRootC0 
   * CFrame.new(bodyBobX, bodyBobY, 0)
   * CFrame.Angles(currentBodyTilt.X, currentBodyTilt.Y, currentBodyTilt.Z)
 end
end)

Features & Information

A lightweight Roblox LocalScript providing smooth walk and run camera bobbing, mouse-turn camera tilt, spring-driven jump and landing impact without camera pitch distortion, and procedural character body leaning for both R6 and R15 rigs.

Community Comments (1)

voltexvoltexOct 13, 2026

cool

More Scripts for Universal Scripts