Realistic Bodycam View
Key RequiredUniversal

Realistic Bodycam View

Universal Scriptallr359allr359 1.8K views 925 executesUpdated Feb 22, 2026
3.3/ 5(3 votes)
2167% Positive
Lua Script•316 lines (8080 chars)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local ContentProvider = game:GetService("ContentProvider")

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

--------------------------------------------------
-- SETTINGS
--------------------------------------------------

local sensitivity = 0.2
local yaw = 0
local pitch = 0
local camConnection
local moveTime = 0

local battery = 100
local trackingGlitch = false

--------------------------------------------------
-- CLEAN OLD GUI
--------------------------------------------------

local old = player:WaitForChild("PlayerGui"):FindFirstChild("BodyCamUI")
if old then old:Destroy() end

--------------------------------------------------
-- GUI ROOT
--------------------------------------------------

local gui = Instance.new("ScreenGui")
gui.Name = "BodyCamUI"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.Parent = player.PlayerGui

--------------------------------------------------
-- RIGHT SIDE INFO
--------------------------------------------------

local infoLabel = Instance.new("TextLabel")
infoLabel.Size = UDim2.fromScale(0.3,0.12)
infoLabel.Position = UDim2.fromScale(0.65,0.02)
infoLabel.BackgroundTransparency = 1
infoLabel.TextColor3 = Color3.new(1,1,1)
infoLabel.TextScaled = true
infoLabel.Font = Enum.Font.Code
infoLabel.TextXAlignment = Enum.TextXAlignment.Right
infoLabel.Parent = gui

--------------------------------------------------
-- REC INDICATOR
--------------------------------------------------

local recDot = Instance.new("Frame")
recDot.Size = UDim2.fromScale(0.015,0.03)
recDot.Position = UDim2.fromScale(0.62,0.035)
recDot.BackgroundColor3 = Color3.new(1,0,0)
recDot.BorderSizePixel = 0
recDot.Parent = gui

local recText = Instance.new("TextLabel")
recText.Size = UDim2.fromScale(0.05,0.05)
recText.Position = UDim2.fromScale(0.64,0.02)
recText.BackgroundTransparency = 1
recText.Text = "REC"
recText.TextColor3 = Color3.new(1,0,0)
recText.TextScaled = true
recText.Font = Enum.Font.Code
recText.TextXAlignment = Enum.TextXAlignment.Left
recText.Parent = gui

task.spawn(function()
	while true do
		recDot.Visible = not recDot.Visible
		task.wait(0.6)
	end
end)

--------------------------------------------------
-- FILM GRAIN
--------------------------------------------------

local grain = Instance.new("Frame")
grain.Size = UDim2.fromScale(1,1)
grain.BackgroundColor3 = Color3.new(1,1,1)
grain.BackgroundTransparency = 0.94
grain.BorderSizePixel = 0
grain.Parent = gui

--------------------------------------------------
-- VIGNETTE
--------------------------------------------------

local function makeEdge(pos, size, rotation)
	local edge = Instance.new("Frame")
	edge.Size = size
	edge.Position = pos
	edge.BackgroundColor3 = Color3.new(0,0,0)
	edge.BorderSizePixel = 0
	edge.Parent = gui

	local gradient = Instance.new("UIGradient")
	gradient.Color = ColorSequence.new(Color3.new(0,0,0), Color3.new(0,0,0))
	gradient.Transparency = NumberSequence.new{
		NumberSequenceKeypoint.new(0, 0.7),
		NumberSequenceKeypoint.new(1, 1)
	}
	gradient.Rotation = rotation
	gradient.Parent = edge
end

makeEdge(UDim2.fromScale(0,0), UDim2.fromScale(1,0.1), 90)
makeEdge(UDim2.fromScale(0,0.9), UDim2.fromScale(1,0.1), -90)
makeEdge(UDim2.fromScale(0,0), UDim2.fromScale(0.1,1), 0)
makeEdge(UDim2.fromScale(0.9,0), UDim2.fromScale(0.1,1), 180)

--------------------------------------------------
-- NO SIGNAL
--------------------------------------------------

local noSignal = Instance.new("Frame")
noSignal.Size = UDim2.fromScale(1,1)
noSignal.BackgroundColor3 = Color3.new(0,0,0)
noSignal.Visible = false
noSignal.BorderSizePixel = 0
noSignal.ZIndex = 20
noSignal.Parent = gui

local signalText = Instance.new("TextLabel")
signalText.Size = UDim2.fromScale(1,0.2)
signalText.Position = UDim2.fromScale(0,0.4)
signalText.BackgroundTransparency = 1
signalText.Text = "NO SIGNAL"
signalText.TextColor3 = Color3.new(1,1,1)
signalText.TextScaled = true
signalText.Font = Enum.Font.Arcade
signalText.ZIndex = 21
signalText.Parent = noSignal

--------------------------------------------------
-- WHITE NOISE STATIC
--------------------------------------------------

local staticSound = Instance.new("Sound")
staticSound.SoundId = "rbxassetid://76866707921480"
staticSound.Volume = 0.8
staticSound.Looped = true
staticSound.Parent = gui

ContentProvider:PreloadAsync({staticSound})

--------------------------------------------------
-- VHS TRACKING ERROR
--------------------------------------------------

local function triggerTrackingError()
	if trackingGlitch then return end
	trackingGlitch = true

	local duration = 0.4
	local start = tick()

	while tick() - start < duration do
		task.wait()
		local offsetX = math.random(-6,6)/100
		local offsetY = math.random(-3,3)/100
		camera.CFrame *= CFrame.new(offsetX, offsetY, 0)
	end

	trackingGlitch = false
end

--------------------------------------------------
-- CAMERA SYSTEM
--------------------------------------------------

local function startBodyCam(character)

	local humanoid = character:WaitForChild("Humanoid")
	local root = character:WaitForChild("HumanoidRootPart")
	local torso = character:FindFirstChild("UpperTorso") or character:FindFirstChild("Torso")

	camera.CameraType = Enum.CameraType.Scriptable
	camera.FieldOfView = 70
	UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
	UserInputService.MouseIconEnabled = false
	humanoid.AutoRotate = false

	yaw = 0
	pitch = 0
	moveTime = 0
	battery = 100

	local lastHealth = humanoid.Health

	if camConnection then
		camConnection:Disconnect()
	end

camConnection = RunService.RenderStepped:Connect(function(dt)

	if humanoid.Health <= 0 then return end

	-- Mouse
	local delta = UserInputService:GetMouseDelta()
	yaw -= delta.X * sensitivity
	pitch -= delta.Y * sensitivity
	pitch = math.clamp(pitch, -75, 75)

	-- Rotate body (updated)
local state = humanoid:GetState()

if state ~= Enum.HumanoidStateType.Physics
and state ~= Enum.HumanoidStateType.FallingDown
and state ~= Enum.HumanoidStateType.Ragdoll then
	
	root.CFrame =
		CFrame.new(root.Position)
		* CFrame.Angles(0, math.rad(yaw), 0)

end

	-- Movement sway
	local speed = root.Velocity.Magnitude
	local swayX, swayY = 0, 0

	if speed > 1 then
		moveTime += dt * 6
		swayX = math.sin(moveTime) * 0.03
		swayY = math.abs(math.cos(moveTime)) * 0.03
	end

	-- Damage glitch
	local glitchOffset = Vector3.new(0,0,0)
	if humanoid.Health < lastHealth then
		glitchOffset = Vector3.new(
			math.random(-2,2)/100,
			math.random(-2,2)/100,
			0
		)
	end
	lastHealth = humanoid.Health

	local camCF =
		torso.CFrame
		* CFrame.new(swayX, 0.4 + swayY, -0.75)
		* CFrame.Angles(math.rad(pitch), 0, 0)
		* CFrame.new(glitchOffset)

	camera.CFrame = camCF

	-- Film grain flicker
	grain.BackgroundTransparency = 0.93 + math.random() * 0.03

	-- Battery drain (1% per minute)
	battery -= (1/60) * dt
	battery = math.clamp(battery, 0, 100)

	-- Low battery color
	if battery <= 15 then
		infoLabel.TextColor3 = Color3.new(1,0,0)
	else
		infoLabel.TextColor3 = Color3.new(1,1,1)
	end

	-- Random VHS tracking error
	if not trackingGlitch then
		local chance = 0.001
		if battery < 20 then
			chance = 0.005
		end
		if math.random() < chance then
			task.spawn(triggerTrackingError)
		end
	end

	local dateNow = os.date("%d/%m/%Y")
	local timeNow = os.date("%H:%M:%S")

	infoLabel.Text =
		"BAT "..math.floor(battery).."%\n"
		..dateNow.."\n"
		..timeNow

	-- Battery death
	if battery <= 0 then
		noSignal.Visible = true
		staticSound:Play()
		camConnection:Disconnect()
	end

end)


	humanoid.Died:Connect(function()
		noSignal.Visible = true
		staticSound:Play()
	end)
end

--------------------------------------------------
-- RESPAWN
--------------------------------------------------

player.CharacterAdded:Connect(function(character)
	noSignal.Visible = false
	staticSound:Stop()
	startBodyCam(character)
end)

if player.Character then
	startBodyCam(player.Character)
end

Features & Information

Bodycam script that I made using ChatGPT. Features: *REC and info UI *"NO SIGNAL" screen on death *Battery drains each minute (you probably won't notice) and when it reaches 0 it will instantly show "NO SIGNAL" until you respawn *Bobbing on movement *Includes real time and date Recommended to use on R6, R15 will make you dizzy.
#realistic#bodycam#firstperson

Community Comments (4)

allr359allr359Feb 22, 2026

Script made by chatgpt. If you dont like it, ignore it.

Replying to @allr359
FlyingAlphiesFlyingAlphiesAug 19, 2026

Funktioniert iwi nicht

AIXZAIXZMar 7, 2026

works fine, but i cant move my mouse

Replying to @AIXZ
allr359allr359Mar 16, 2026

@XenoxX I recomend to use on pc. What device do you use?

More Scripts for Universal Scripts