Run it
Copy the script and paste it into your executor.
uis = :()
rs = :()
plr = .Players.LocalPlayer
cam = .CurrentCamera
pg = plr:()
char = plr.Character plr.CharacterAdded:()
hrp = char:()
screenGui = .()
screenGui.Name =
screenGui.Parent = pg
mainFrame = .()
mainFrame.Size = .(,,,)
mainFrame.Position = .(,-,,-)
mainFrame.BackgroundColor3 = .(,,)
mainFrame.BorderSizePixel =
mainFrame.Parent = screenGui
cornerMain = .()
cornerMain.CornerRadius = .(,)
cornerMain.Parent = mainFrame
title = .()
title.Size = .(,,,)
title.BackgroundTransparency =
title.Text =
title.TextColor3 = .(,,)
title.Font = .Font.SourceSansSemibold
title.TextScaled =
title.Parent = mainFrame
pcButton = .()
pcButton.Size = .(,-,,)
pcButton.Position = .(,,,)
pcButton.BackgroundColor3 = .(,,)
pcButton.Text =
pcButton.TextColor3 = .(,,)
pcButton.Font = .Font.SourceSansSemibold
pcButton.TextScaled =
pcButton.Parent = mainFrame
cornerPC = .()
cornerPC.CornerRadius = .(,)
cornerPC.Parent = pcButton
mobileButton = .()
mobileButton.Size = .(,-,,)
mobileButton.Position = .(,,,)
mobileButton.BackgroundColor3 = .(,,)
mobileButton.Text =
mobileButton.TextColor3 = .(,,)
mobileButton.Font = .Font.SourceSansSemibold
mobileButton.TextScaled =
mobileButton.Parent = mainFrame
cornerM = .()
cornerM.CornerRadius = .(,)
cornerM.Parent = mobileButton
freecam =
speed =
lookSpeed =
rotX,rotY = ,
fov =
defaultFOV =
camPos
rightHold =
speedFrame
speedLabel
dragging =
dragStart
startPos
mobileControls = {}
moveVector = .zero
lookTouch =
lastPos
(msg)
.StarterGui:(,{Title=,Text=msg,Duration=})
()
freecam = freecam
freecam
cam.CameraType = .CameraType.Scriptable
hrp.Anchored =
camPos = cam.CFrame.Position
rotX,rotY = ,
cam.FieldOfView = fov
speedFrame speedFrame.Visible =
_,v (mobileControls) v.Visible =
cam.CameraType = .CameraType.Custom
hrp.Anchored =
cam.FieldOfView = defaultFOV
speedFrame speedFrame.Visible =
_,v (mobileControls) v.Visible =
(move,delta,dt)
rightHold lookTouch
rotX = .(rotX - delta.Y * lookSpeed, -.(), .())
rotY = rotY - delta.X * lookSpeed
camPos += move * speed * dt
rot = .(,rotY,) * .(rotX,,)
cam.CFrame = .(camPos) * rot
(frame)
frame.InputBegan:((input)
input.UserInputType == .UserInputType.MouseButton1
dragging =
dragStart = input.Position
startPos = frame.Position
)
frame.InputChanged:((input)
input.UserInputType == .UserInputType.MouseMovement dragging
delta = input.Position - dragStart
frame.Position = .(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
)
uis.InputEnded:((input)
input.UserInputType == .UserInputType.MouseButton1
dragging =
)
()
speedFrame = .()
speedFrame.Size = .(,,,)
speedFrame.Position = .(,,,)
speedFrame.BackgroundColor3 = .(,,)
speedFrame.BorderSizePixel =
speedFrame.Visible =
speedFrame.Parent = screenGui
cornerS = .()
cornerS.CornerRadius = .(,)
cornerS.Parent = speedFrame
speedLabel = .()
speedLabel.Size = .(,,,)
speedLabel.Position = .(,,,)
speedLabel.BackgroundTransparency =
speedLabel.Text = ..(speed)
speedLabel.TextColor3 = .(,,)
speedLabel.Font = .Font.SourceSansSemibold
speedLabel.TextScaled =
speedLabel.Parent = speedFrame
speedUp = .()
speedUp.Size = .(,-,,)
speedUp.Position = .(,,,)
speedUp.BackgroundColor3 = .(,,)
speedUp.Text =
speedUp.TextColor3 = .(,,)
speedUp.Font = .Font.SourceSansSemibold
speedUp.TextScaled =
speedUp.Parent = speedFrame
cU = .()
cU.CornerRadius = .(,)
cU.Parent = speedUp
speedDown = .()
speedDown.Size = .(,-,,)
speedDown.Position = .(,,,)
speedDown.BackgroundColor3 = .(,,)
speedDown.Text =
speedDown.TextColor3 = .(,,)
speedDown.Font = .Font.SourceSansSemibold
speedDown.TextScaled =
speedDown.Parent = speedFrame
cD = .()
cD.CornerRadius = .(,)
cD.Parent = speedDown
speedUp.MouseButton1Click:(()
speed = speed +
speedLabel.Text = ..(speed)
)
speedDown.MouseButton1Click:(()
speed = .(,speed-)
speedLabel.Text = ..(speed)
)
(speedFrame)
()
mainFrame.Visible =
()
()
uis.InputBegan:((input,gp)
gp
input.UserInputType == .UserInputType.MouseButton2
rightHold =
uis.MouseBehavior = .MouseBehavior.LockCurrentPosition
input.KeyCode == .KeyCode.F
()
input.KeyCode == .KeyCode.Up freecam
fov = .(fov+,,)
cam.FieldOfView = fov
input.KeyCode == .KeyCode.Down freecam
fov = .(fov-,,)
cam.FieldOfView = fov
)
uis.InputEnded:((input,gp)
input.UserInputType == .UserInputType.MouseButton2
rightHold =
uis.MouseBehavior = .MouseBehavior.Default
)
rs.RenderStepped:((dt)
freecam
move = .zero
uis:(.KeyCode.W) move += cam.CFrame.LookVector
uis:(.KeyCode.S) move -= cam.CFrame.LookVector
uis:(.KeyCode.A) move -= cam.CFrame.RightVector
uis:(.KeyCode.D) move += cam.CFrame.RightVector
uis:(.KeyCode.E) move += cam.CFrame.UpVector
uis:(.KeyCode.Q) move -= cam.CFrame.UpVector
delta = uis:()
(move,delta,dt)
)
()
mainFrame.Visible =
()
()
toggleButton = .()
toggleButton.Size = .(,,,)
toggleButton.Position = .(,-,,-)
toggleButton.BackgroundColor3 = .(,,)
toggleButton.Text =
toggleButton.TextColor3 = .(,,)
toggleButton.Font = .Font.SourceSansSemibold
toggleButton.TextScaled =
toggleButton.Parent = screenGui
cornerT = .()
cornerT.CornerRadius = .(,)
cornerT.Parent = toggleButton
fovUp = .()
fovUp.Size = .(,,,)
fovUp.Position = .(,-,,-)
fovUp.BackgroundColor3 = .(,,)
fovUp.Text =
fovUp.TextColor3 = .(,,)
fovUp.Font = .Font.SourceSansSemibold
fovUp.TextScaled =
fovUp.Parent = screenGui
cornerU = .()
cornerU.CornerRadius = .(,)
cornerU.Parent = fovUp
fovUp.Visible =
fovDown = .()
fovDown.Size = .(,,,)
fovDown.Position = .(,-,,-)
fovDown.BackgroundColor3 = .(,,)
fovDown.Text =
fovDown.TextColor3 = .(,,)
fovDown.Font = .Font.SourceSansSemibold
fovDown.TextScaled =
fovDown.Parent = screenGui
cornerD = .()
cornerD.CornerRadius = .(,)
cornerD.Parent = fovDown
fovDown.Visible =
movePad = .()
movePad.Size = .(,,,)
movePad.Position = .(,,,-)
movePad.BackgroundColor3 = .(,,)
movePad.BackgroundTransparency =
movePad.Parent = screenGui
cornerMove = .()
cornerMove.CornerRadius = .(,)
cornerMove.Parent = movePad
movePad.Visible =
lookPad = .()
lookPad.Size = .(,,,)
lookPad.Position = .(,-,,-)
lookPad.BackgroundColor3 = .(,,)
lookPad.BackgroundTransparency =
lookPad.Parent = screenGui
cornerLook = .()
cornerLook.CornerRadius = .(,)
cornerLook.Parent = lookPad
lookPad.Visible =
toggleButton.MouseButton1Click:(()
()
toggleButton.Text = freecam
fovUp.Visible = freecam
fovDown.Visible = freecam
movePad.Visible = freecam
lookPad.Visible = freecam
speedFrame speedFrame.Visible = freecam
)
fovUp.MouseButton1Click:(()
freecam
fov = .(fov+,,)
cam.FieldOfView = fov
)
fovDown.MouseButton1Click:(()
freecam
fov = .(fov-,,)
cam.FieldOfView = fov
)
movePad.InputBegan:((input)
input.UserInputType == .UserInputType.Touch
lastPos = input.Position
)
movePad.InputChanged:((input)
input.UserInputType == .UserInputType.Touch
delta = (input.Position - lastPos) /
moveVector = .(delta.X,,-delta.Y)
)
movePad.InputEnded:((input)
input.UserInputType == .UserInputType.Touch
moveVector = .zero
)
lookPad.InputBegan:((input)
input.UserInputType == .UserInputType.Touch
lookTouch = input
lastPos = input.Position
)
lookPad.InputChanged:((input)
input == lookTouch
delta = input.Position - lastPos
lastPos = input.Position
(moveVector,.(delta.X,delta.Y),rs.RenderStepped:())
)
lookPad.InputEnded:((input)
input == lookTouch
lookTouch =
)
rs.RenderStepped:((dt)
freecam
(moveVector,.(),dt)
)
pcButton.MouseButton1Click:(setupPC)
mobileButton.MouseButton1Click:(setupMobile)
This script creates a full freecam system that works on both PC and mobile. On PC you can toggle freecam with the F key, move with WASD and QE, change FOV with the arrow keys, and look around by holding right click. There is also a camera speed panel you can drag around that lets you increase or decrease how fast the camera moves. On mobile there is a toggle button that lets you enter and exit freecam. When freecam is on you will see buttons for changing FOV, a camera speed panel, and two touch pads. The left pad is for moving and the right pad is for looking around, just like a thumbstick setup. When you leave freecam those extra controls hide again and your camera goes back to normal. The GUI uses a clean black and white style with rounded corners and a professional font. Everything the script needs is created by itself so you can just drop it in as a LocalScript inside StarterGui and it will work right away. BE WARNED THIS SCRIPT IS STILL IN BETA!!!