Advanced moving camera V5 (UPDATED)
Key RequiredUniversal

Advanced moving camera V5 (UPDATED)

Universal ScriptSkibidigionSpyMegaSkibidigionSpyMega 353 views 76 executesUpdated Feb 21, 2026
0.0/ 5(1 votes)
010% Positive
Lua Script•149 lines (5126 chars)
-- Delta V22.3: V19.9 MOTION | ROOT CAUSE PATCHED | ALL FEATURES LOCKED
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Lighting = game:GetService("Lighting")

local Player = Players.LocalPlayer
local Camera = workspace.CurrentCamera

-- [[ THE V19.9 REAL-LIFE SETTINGS - EXACT ]]
local V_BOB = 0.35        
local H_BOB = 0.15        
local SHAKE_SPEED = 1.1   
local TILT_LIMIT = 2.0    

-- [[ FEATURE: SHADOW FIX ]]
Lighting.GlobalShadows = true
Lighting.ShadowSoftness = 0.3
if not Lighting:FindFirstChildOfClass("Atmosphere") then
	local atm = Instance.new("Atmosphere", Lighting)
	atm.Density = 0.25
end

-- Variables
local tickCount = 0
local swingIntensity, landOffset, landTilt = 0, 0, 0
local leanAmount, camRoll, camPitch = 0, 0, 0
local lastRot = Camera.CFrame.LookVector
local sprintLerp, stopLerp = 0, 0

local unshakenCFrame -- Variable to store the pure camera

local function Initialize(Character)
	local Humanoid = Character:WaitForChild("Humanoid")
	local Root = Character:WaitForChild("HumanoidRootPart")
	
	Humanoid.CameraOffset = Vector3.new(0,0,0)
	unshakenCFrame = nil 
	
	RunService:UnbindFromRenderStep("CameraRestore")
	RunService:UnbindFromRenderStep("CameraEngine")

	-- [[ FIX 1: THE ANTI-SINK RESTORE ]]
	-- We restore the pure camera BEFORE Roblox runs its math.
	-- This kills the "Sinking" feedback loop entirely.
	RunService:BindToRenderStep("CameraRestore", Enum.RenderPriority.Camera.Value - 1, function()
		if unshakenCFrame then
			Camera.CFrame = unshakenCFrame
		end
	end)

	RunService:BindToRenderStep("CameraEngine", Enum.RenderPriority.Camera.Value + 1, function(dt)
		if not Character or not Humanoid or not Root or not Character.Parent then return end
		
		-- Save the pure camera CFrame before we touch it
		unshakenCFrame = Camera.CFrame
		
		local vel = Root.Velocity
		local speed = (vel * Vector3.new(1, 0, 1)).Magnitude
		local vVel = vel.Y
		local state = Humanoid:GetState()
		
		-- [[ FEATURE: UNIVERSAL CLIMBING DETECTION ]]
		local wallCheck = workspace:Raycast(Root.Position, Root.CFrame.LookVector * 1.5)
		local isClimbing = (state == Enum.HumanoidStateType.Climbing) or (wallCheck ~= nil)
		local isMoving = speed > 0.5
		local isSprinting = speed > 17.95
		
		-- [[ V19.9 INERTIA ]]
		local turn = Root.CFrame.RightVector:Dot(vel.Unit)
		if speed < 1 then turn = 0 end
		leanAmount = math.lerp(leanAmount, turn * 2.0, 0.2)
		
		-- Since look is taken from the pure camera, there is zero drift here
		local look = Camera.CFrame.LookVector
		camRoll = math.lerp(camRoll, look:Cross(lastRot).Y * 45, 0.2)
		camPitch = math.lerp(camPitch, (look.Y - lastRot.Y) * 30, 0.2)
		lastRot = look

		-- [[ V19.9 INTENSITY LOGIC ]]
		local targetInt, targetCycle = 0.1, 4 
		if isClimbing then
			targetInt = (math.abs(vVel) > 0.5) and 0.7 or 0.4
			targetCycle = (math.abs(vVel) > 0.5) and 8 or 4
			stopLerp = math.lerp(stopLerp, 1, 0.1)
		elseif isMoving then
			stopLerp = math.lerp(stopLerp, 1, 0.15)
			if isSprinting then
				targetInt = 0.75 + ((speed - 17.95) * 0.05) -- FEATURE: 0.05 Nerf
				targetCycle = 22
			else
				targetInt = 0.4
				targetCycle = 13
			end
		else
			stopLerp = math.lerp(stopLerp, 0.4, 0.05)
		end
		
		tickCount = tickCount + (dt * targetCycle * SHAKE_SPEED)
		swingIntensity = math.lerp(swingIntensity, targetInt, 0.15)
		
		-- [[ V19.9 MOTION MATH ]]
		local pulse = math.sin(tickCount * 0.5)
		local verticalHit = math.abs(pulse) * -V_BOB
		local horizontalHit = pulse * H_BOB
		
		local stepX = horizontalHit * swingIntensity * stopLerp
		local stepY = verticalHit * swingIntensity * stopLerp
		local stepRoll = pulse * (swingIntensity * TILT_LIMIT) * stopLerp
		
		-- [[ V19.9 LANDING/JUMP PHYSICS ]]
		landOffset = math.lerp(landOffset, 0, 0.1)
		landTilt = math.lerp(landTilt, 0, 0.1)
		
		-- [[ FIX 2: PITCH SAFETY CLAMP (Anti-Break) ]]
		local currentPitch = math.asin(look.Y) -- Find out how high/low the player is looking
		local appliedPitch = math.rad(landTilt - camPitch + (stepY * 5))
		
		-- Stop the pitch from pushing past 89 degrees (-1.55 radians) to prevent screen flips
		local maxDown = -1.55 - currentPitch
		local maxUp = 1.55 - currentPitch
		appliedPitch = math.clamp(appliedPitch, maxDown, maxUp)
		
		-- Apply the safe V19.9 Rotation
		local finalRotation = CFrame.Angles(
			appliedPitch, 
			0, 
			math.rad(stepRoll - (leanAmount * 1.5) - camRoll)
		)
		
		local finalPosition = Vector3.new(stepX - (leanAmount * 0.1), stepY + landOffset, 0)
		
		-- Execute V19.9 Math exactly
		Camera.CFrame = Camera.CFrame * finalRotation
		Humanoid.CameraOffset = Humanoid.CameraOffset:Lerp(finalPosition, 0.25)
	end)

	-- [[ V19.9 STATE CHANGES ]]
	Humanoid.StateChanged:Connect(function(_, new)
		if new == Enum.HumanoidStateType.Jumping then
			landOffset = 0.2; landTilt = 1.0
		elseif new == Enum.HumanoidStateType.Landed then 
			landOffset = -0.5; landTilt = -2.5; swingIntensity = 1.5 
		end
	end)
end

Player.CharacterAdded:Connect(Initialize)
if Player.Character then Initialize(Player.Character) end
print("Delta V22.3: Root Bugs Patched. V19.9 Motion Locked.")

Features & Information

Cool camera movents Only for games which doesn't have camera movent
#Advanced camera moving

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts