
KeylessUniversal

-- Freecam – Studio Style Camera
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local CoreGui = game:GetService("CoreGui")
local TweenService = game:GetService("TweenService")
local StarterGui = game:GetService("StarterGui")
local LocalPlayer = Players.LocalPlayer
local Camera = workspace.CurrentCamera
local Character = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid")
local freecamEnabled = false
local freecamPos = Vector3.zero
local pitchAngle = 0
local yawAngle = 0
local baseSpeed = 50
local shiftSpeed = 150
local currentSpeed = baseSpeed
local keysPressed = {}
local mobileMoveStick = nil
local mobileLookStick = nil
local mobileTouches = {}
local function enableFreecam()
freecamEnabled = true
freecamPos = Camera.CFrame.Position
local look = Camera.CFrame.LookVector
yawAngle = math.atan2(look.X, -look.Z)
pitchAngle = math.asin(look.Y)
Camera.CameraType = Enum.CameraType.Scriptable
Humanoid.AutoRotate = false
Humanoid.WalkSpeed = 0
Humanoid.JumpPower = 0
end
local function disableFreecam()
freecamEnabled = false
Camera.CameraType = Enum.CameraType.Custom
Camera.CameraSubject = Humanoid
Humanoid.AutoRotate = true
Humanoid.WalkSpeed = 16
Humanoid.JumpPower = 50
mobileMoveStick = nil
mobileLookStick = nil
mobileTouches = {}
end
local function toggleFreecam()
if freecamEnabled then
disableFreecam()
toggleBtn.Text = "TOGGLE"
toggleBtn.BackgroundColor3 = Color3.fromRGB(30,30,30)
else
enableFreecam()
toggleBtn.Text = "TOGGLE [ON]"
toggleBtn.BackgroundColor3 = Color3.fromRGB(25,45,25)
end
end
local function teleportToCamera()
if not freecamEnabled then
StarterGui:SetCore("SendNotification", {
Title = "FREECAM",
Text = "Freecam is not enabled!",
Duration = 3
})
return
end
local HRP = Character and Character:FindFirstChild("HumanoidRootPart")
if HRP then
HRP.CFrame = CFrame.new(freecamPos)
end
disableFreecam()
toggleBtn.Text = "TOGGLE"
toggleBtn.BackgroundColor3 = Color3.fromRGB(30,30,30)
end
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed then return end
if input.UserInputType == Enum.UserInputType.Keyboard then
keysPressed[input.KeyCode] = true
elseif input.UserInputType == Enum.UserInputType.Touch then
mobileTouches[input] = { startPos = input.Position, currentPos = input.Position, startTime = tick() }
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Keyboard then
keysPressed[input.KeyCode] = nil
elseif input.UserInputType == Enum.UserInputType.Touch then
mobileTouches[input] = nil
-- Проверяем, остались ли ещё касания на левой/правой стороне
local hasLeft = false
local hasRight = false
for _, touch in pairs(mobileTouches) do
if touch.startPos.X < Camera.ViewportSize.X / 2 then
hasLeft = true
else
hasRight = true
end
end
if not hasLeft then mobileMoveStick = nil end
if not hasRight then mobileLookStick = nil end
end
end)
UserInputService.InputChanged:Connect(function(input)
if not freecamEnabled then return end
if input.UserInputType == Enum.UserInputType.Touch then
local touch = mobileTouches[input]
if not touch then return end
touch.currentPos = input.Position
touch.delta = input.Delta or (input.Position - touch.currentPos)
-- Левый стик - движение
if touch.startPos.X < Camera.ViewportSize.X / 2 then
if not mobileMoveStick then
mobileMoveStick = { position = Vector2.zero }
end
mobileMoveStick.position = input.Position - touch.startPos
end
-- Правый стик - поворот
if touch.startPos.X > Camera.ViewportSize.X / 2 then
if not mobileLookStick then
mobileLookStick = { position = Vector2.zero }
end
local delta = input.Delta
if delta.Magnitude > 0 then
yawAngle = yawAngle - delta.X * 0.005
pitchAngle = math.clamp(pitchAngle - delta.Y * 0.005, -1.4, 1.4)
end
end
elseif input.UserInputType == Enum.UserInputType.MouseMovement and not UserInputService.TouchEnabled then
local delta = input.Delta
yawAngle = yawAngle - delta.X * 0.003
pitchAngle = math.clamp(pitchAngle - delta.Y * 0.003, -1.4, 1.4)
end
end)
local function getMovementDirection()
local dir = Vector3.zero
local pitchCF = CFrame.Angles(pitchAngle, 0, 0)
local yawCF = CFrame.Angles(0, yawAngle, 0)
local camCF = yawCF * pitchCF
local forward = camCF.LookVector
local right = camCF.RightVector
-- ПК клавиши
if keysPressed[Enum.KeyCode.W] then dir = dir + forward end
if keysPressed[Enum.KeyCode.S] then dir = dir - forward end
if keysPressed[Enum.KeyCode.A] then dir = dir - right end
if keysPressed[Enum.KeyCode.D] then dir = dir + right end
if keysPressed[Enum.KeyCode.E] then dir = dir + Vector3.new(0, 1, 0) end
if keysPressed[Enum.KeyCode.Q] then dir = dir + Vector3.new(0, -1, 0) end
-- Мобильный стик
if mobileMoveStick then
local moveDir = mobileMoveStick.position
if moveDir.Magnitude > 5 then
local n = moveDir.Unit
dir = dir + forward * (-n.Y) + right * n.X
end
end
return dir.Magnitude > 0 and dir.Unit or Vector3.zero
end
RunService.RenderStepped:Connect(function(dt)
if not freecamEnabled then return end
local moveDir = getMovementDirection()
local targetSpeed = (keysPressed[Enum.KeyCode.LeftShift] or UserInputService.TouchEnabled) and shiftSpeed or baseSpeed
if moveDir.Magnitude > 0 then
currentSpeed = math.min(currentSpeed + dt * 200, targetSpeed)
freecamPos = freecamPos + moveDir * currentSpeed * dt
else
currentSpeed = baseSpeed
end
local pitchCF = CFrame.Angles(pitchAngle, 0, 0)
local yawCF = CFrame.Angles(0, yawAngle, 0)
Camera.CFrame = CFrame.new(freecamPos) * yawCF * pitchCF
local HRP = Character and Character:FindFirstChild("HumanoidRootPart")
if HRP and HRP.Velocity.Magnitude > 0 then
HRP.Velocity = Vector3.zero
end
end)
if CoreGui:FindFirstChild("FreecamUI") then CoreGui.FreecamUI:Destroy() end
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "FreecamUI"
screenGui.ResetOnSpawn = false
screenGui.IgnoreGuiInset = true
screenGui.Parent = CoreGui
local mainFrame = Instance.new("Frame")
mainFrame.Size = UDim2.new(0, 160, 0, 85)
mainFrame.Position = UDim2.new(0.5, -80, 0, 50)
mainFrame.BackgroundColor3 = Color3.fromRGB(12, 12, 12)
mainFrame.BorderSizePixel = 0
mainFrame.ZIndex = 100
mainFrame.ClipsDescendants = true
mainFrame.Parent = screenGui
local function addBorder(parent)
local t = 1
local l = Instance.new("Frame"); l.Size = UDim2.new(0, t, 1, 0); l.BackgroundColor3 = Color3.fromRGB(50,50,50); l.BorderSizePixel=0; l.ZIndex=200; l.Parent=parent
local tp = Instance.new("Frame"); tp.Size = UDim2.new(1,0,0,t); tp.BackgroundColor3 = Color3.fromRGB(50,50,50); tp.BorderSizePixel=0; tp.ZIndex=200; tp.Parent=parent
local r = Instance.new("Frame"); r.Size = UDim2.new(0, t, 1, 0); r.Position=UDim2.new(1,-t,0,0); r.BackgroundColor3 = Color3.fromRGB(50,50,50); r.BorderSizePixel=0; r.ZIndex=200; r.Parent=parent
local b = Instance.new("Frame"); b.Size = UDim2.new(1,0,0,t); b.Position=UDim2.new(0,0,1,-t); b.BackgroundColor3 = Color3.fromRGB(50,50,50); b.BorderSizePixel=0; b.ZIndex=200; b.Parent=parent
end
addBorder(mainFrame)
local titleBar = Instance.new("Frame")
titleBar.Size = UDim2.new(1, -2, 0, 20)
titleBar.Position = UDim2.new(0, 1, 0, 1)
titleBar.BackgroundColor3 = Color3.fromRGB(12,12,12)
titleBar.BorderSizePixel = 0
titleBar.ZIndex = 101
titleBar.Parent = mainFrame
local titleLabel = Instance.new("TextLabel")
titleLabel.Size = UDim2.new(1, -30, 1, 0)
titleLabel.Position = UDim2.new(0, 6, 0, 0)
titleLabel.BackgroundTransparency = 1
titleLabel.Text = "Freecam"
titleLabel.TextColor3 = Color3.fromRGB(180,180,180)
titleLabel.Font = Enum.Font.Code
titleLabel.TextSize = 11
titleLabel.TextXAlignment = Enum.TextXAlignment.Left
titleLabel.ZIndex = 102
titleLabel.Parent = titleBar
local collapseButton = Instance.new("TextButton")
collapseButton.Size = UDim2.new(0, 20, 0, 20)
collapseButton.Position = UDim2.new(1, -20, 0, 0)
collapseButton.BackgroundColor3 = Color3.fromRGB(25,25,25)
collapseButton.BorderSizePixel = 0
collapseButton.Text = "-"
collapseButton.TextColor3 = Color3.fromRGB(200,200,200)
collapseButton.Font = Enum.Font.Code
collapseButton.TextSize = 12
collapseButton.ZIndex = 102
collapseButton.Parent = titleBar
addBorder(collapseButton)
local titleDivider = Instance.new("Frame")
titleDivider.Size = UDim2.new(1, -2, 0, 1)
titleDivider.Position = UDim2.new(0, 1, 0, 21)
titleDivider.BackgroundColor3 = Color3.fromRGB(50,50,50)
titleDivider.BorderSizePixel = 0
titleDivider.ZIndex = 200
titleDivider.Parent = mainFrame
local contentFrame = Instance.new("Frame")
contentFrame.Size = UDim2.new(1, -2, 1, -23)
contentFrame.Position = UDim2.new(0, 1, 0, 22)
contentFrame.BackgroundTransparency = 1
contentFrame.ZIndex = 101
contentFrame.Parent = mainFrame
local toggleBtn = Instance.new("TextButton")
toggleBtn.Size = UDim2.new(0, 145, 0, 24)
toggleBtn.Position = UDim2.new(0.5, -72, 0, 3)
toggleBtn.BackgroundColor3 = Color3.fromRGB(30,30,30)
toggleBtn.Text = "TOGGLE"
toggleBtn.TextColor3 = Color3.fromRGB(200,200,200)
toggleBtn.Font = Enum.Font.Code
toggleBtn.TextSize = 11
toggleBtn.BorderSizePixel = 0
toggleBtn.ZIndex = 150
toggleBtn.Parent = contentFrame
addBorder(toggleBtn)
local tpBtn = Instance.new("TextButton")
tpBtn.Size = UDim2.new(0, 145, 0, 24)
tpBtn.Position = UDim2.new(0.5, -72, 0, 30)
tpBtn.BackgroundColor3 = Color3.fromRGB(30,30,30)
tpBtn.Text = "TP TO CAM"
tpBtn.TextColor3 = Color3.fromRGB(200,200,200)
tpBtn.Font = Enum.Font.Code
tpBtn.TextSize = 11
tpBtn.BorderSizePixel = 0
tpBtn.ZIndex = 150
tpBtn.Parent = contentFrame
addBorder(tpBtn)
toggleBtn.MouseButton1Click:Connect(toggleFreecam)
tpBtn.MouseButton1Click:Connect(teleportToCamera)
local isDragging = false
local dragStartPos = nil
local frameStartPos = nil
titleBar.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
isDragging = true
dragStartPos = input.Position
frameStartPos = mainFrame.Position
end
end)
titleBar.InputEnded:Connect(function() isDragging = false end)
UserInputService.InputChanged:Connect(function(input)
if isDragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - dragStartPos
mainFrame.Position = UDim2.new(frameStartPos.X.Scale, frameStartPos.X.Offset + delta.X, frameStartPos.Y.Scale, frameStartPos.Y.Offset + delta.Y)
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then isDragging = false end
end)
local menuCollapsed = false
collapseButton.MouseButton1Click:Connect(function()
menuCollapsed = not menuCollapsed
if menuCollapsed then
mainFrame:TweenSize(UDim2.new(0, 160, 0, 22), "Out", "Quad", 0.2, true)
collapseButton.Text = "+"
contentFrame.Visible = false
else
mainFrame:TweenSize(UDim2.new(0, 160, 0, 85), "Out", "Quad", 0.2, true)
collapseButton.Text = "-"
contentFrame.Visible = true
end
end)
LocalPlayer.CharacterAdded:Connect(function(newChar)
Character = newChar
Humanoid = newChar:WaitForChild("Humanoid")
if freecamEnabled then
disableFreecam()
toggleBtn.Text = "TOGGLE"
toggleBtn.BackgroundColor3 = Color3.fromRGB(30,30,30)
end
end)
script.Destroying:Connect(function()
disableFreecam()
if screenGui then screenGui:Destroy() end
end)



i can't turn my camera to look behind me?