local input = game:GetService("UserInputService") local player = game.Players.LocalPlayer local camera = workspace.CurrentCamera local speed = 1 local rotspeed = math.rad(2) -- Use radians for rotation speed local fly = false -- Camera rotation state local yaw = 0 local pitch = 0 local pitchMin = math.rad(-80) local pitchMax = math.rad(80) -- Camera position state local camPos = nil local oldspeed = 0 local character = nil local hum = nil local function intro() local gui = Instance.new("ScreenGui", player.PlayerGui) gui.SafeAreaCompatibility = Enum.SafeAreaCompatibility.None gui.ScreenInsets = Enum.ScreenInsets.None gui.ClipToDeviceSafeArea = false local text = Instance.new("TextLabel", gui) text.Position = UDim2.new(0, 0, 0.917, 0) text.Size = UDim2.new(0, 342, 0, 50) text.BackgroundTransparency = 1 text.TextColor3 = Color3.new(1,1,1) text.TextScaled = true text.Text = "Fly Camera Script by Cheedabob" task.wait(2) text.Text = "Press G to camera fly" task.wait(2) text.Text = "WASD to move" task.wait(2) text.Text = "Arrow keys to rotate" task.wait(2) text.Text = "Enjoy :)" task.wait(2) gui:Destroy() end local function resetFly() if fly then fly = false if hum then hum.WalkSpeed = oldspeed end camera.CameraType = Enum.CameraType.Custom if character then character:PivotTo(camera.CFrame) end end end local function onCharacterAdded(char) character = char hum = character:FindFirstChildOfClass("Humanoid") if hum then hum.Died:Connect(function() resetFly() end) end end -- Initial character setup if player.Character then onCharacterAdded(player.Character) end player.CharacterAdded:Connect(onCharacterAdded) --switch input.InputBegan:Connect(function(key) if key.KeyCode == Enum.KeyCode.G then if not character or not hum then return end fly = not fly if fly then camera.CameraType = Enum.CameraType.Scriptable oldspeed = hum.WalkSpeed hum.WalkSpeed = 0 local look = camera.CFrame.LookVector yaw = math.atan2(look.X, look.Z) pitch = math.asin(look.Y) camPos = camera.CFrame.Position else hum.WalkSpeed = oldspeed camera.CameraType = Enum.CameraType.Custom if character then character:PivotTo(camera.CFrame) end end end end) local w = false local a = false local s = false local d = false local left = false local right = false local up = false local down = false local function SetKey(inputObj, bool) local key = inputObj.KeyCode if key == Enum.KeyCode.W then w = bool elseif key == Enum.KeyCode.A then a = bool elseif key == Enum.KeyCode.S then s = bool elseif key == Enum.KeyCode.D then d = bool elseif key == Enum.KeyCode.Left then left = bool elseif key == Enum.KeyCode.Right then right = bool elseif key == Enum.KeyCode.Up then up = bool elseif key == Enum.KeyCode.Down then down = bool end end --movement input.InputBegan:Connect(function(key) SetKey(key, true) end) input.InputEnded:Connect(function(key) SetKey(key, false) end) local run = game:GetService("RunService") run.RenderStepped:Connect(function() if fly and camPos then -- Update yaw/pitch if left then yaw = yaw + rotspeed end if right then yaw = yaw - rotspeed end if up then pitch = math.clamp(pitch + rotspeed, pitchMin, pitchMax) end if down then pitch = math.clamp(pitch - rotspeed, pitchMin, pitchMax) end -- Calculate new camera rotation local rotCFrame = CFrame.Angles(0, yaw, 0) * CFrame.Angles(pitch, 0, 0) -- Move camera relative to look direction local moveDir = Vector3.new() local camCF = CFrame.new(camPos) * rotCFrame if w then moveDir = moveDir + camCF.LookVector end if s then moveDir = moveDir - camCF.LookVector end if a then moveDir = moveDir - camCF.RightVector end if d then moveDir = moveDir + camCF.RightVector end if moveDir.Magnitude > 0 then moveDir = moveDir.Unit camPos = camPos + moveDir * speed end -- Set camera CFrame camera.CFrame = CFrame.new(camPos) * rotCFrame end end) intro()