Fly GUI [GTFA]
Key RequiredUniversal

Fly GUI [GTFA]

Universal ScriptGTFAGTFA 5 views 0 executesUpdated Oct 6, 2026
Unrated
00
Lua Script•278 lines (8344 chars)
-- FlyGui LocalScript
-- Put this in: StarterPlayer > StarterPlayerScripts (as a LocalScript)

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")

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

-- Settings
local flySpeed = 50
local MIN_SPEED, MAX_SPEED = 1, 1000
local flying = false
local flyConnection
local bodyVelocity, bodyGyro

-- ========== GUI ==========
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "FlyGui"
screenGui.ResetOnSpawn = false
screenGui.Parent = player:WaitForChild("PlayerGui")

local mainFrame = Instance.new("Frame")
mainFrame.Name = "Main"
mainFrame.Size = UDim2.new(0, 260, 0, 150)
mainFrame.Position = UDim2.new(0.5, -130, 0.4, 0)
mainFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 38)
mainFrame.BorderSizePixel = 0
mainFrame.ClipsDescendants = true
mainFrame.Parent = screenGui
Instance.new("UICorner", mainFrame).CornerRadius = UDim.new(0, 8)

-- Title bar (drag handle)
local titleBar = Instance.new("Frame")
titleBar.Name = "TitleBar"
titleBar.Size = UDim2.new(1, 0, 0, 30)
titleBar.BackgroundColor3 = Color3.fromRGB(45, 45, 58)
titleBar.BorderSizePixel = 0
titleBar.Parent = mainFrame

local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -80, 1, 0)
title.Position = UDim2.new(0, 10, 0, 0)
title.BackgroundTransparency = 1
title.Text = "Fly GUI"
title.TextColor3 = Color3.new(1, 1, 1)
title.Font = Enum.Font.GothamBold
title.TextSize = 14
title.TextXAlignment = Enum.TextXAlignment.Left
title.Parent = titleBar

-- Close (X) button - top right
local closeBtn = Instance.new("TextButton")
closeBtn.Name = "Close"
closeBtn.Size = UDim2.new(0, 30, 0, 30)
closeBtn.Position = UDim2.new(1, -30, 0, 0)
closeBtn.BackgroundColor3 = Color3.fromRGB(200, 60, 60)
closeBtn.BorderSizePixel = 0
closeBtn.Text = "X"
closeBtn.TextColor3 = Color3.new(1, 1, 1)
closeBtn.Font = Enum.Font.GothamBold
closeBtn.TextSize = 14
closeBtn.Parent = titleBar

-- Minimize (-) button - next to X
local minBtn = Instance.new("TextButton")
minBtn.Name = "Minimize"
minBtn.Size = UDim2.new(0, 30, 0, 30)
minBtn.Position = UDim2.new(1, -60, 0, 0)
minBtn.BackgroundColor3 = Color3.fromRGB(90, 90, 110)
minBtn.BorderSizePixel = 0
minBtn.Text = "-"
minBtn.TextColor3 = Color3.new(1, 1, 1)
minBtn.Font = Enum.Font.GothamBold
minBtn.TextSize = 18
minBtn.Parent = titleBar

-- Content area
local content = Instance.new("Frame")
content.Name = "Content"
content.Size = UDim2.new(1, 0, 1, -30)
content.Position = UDim2.new(0, 0, 0, 30)
content.BackgroundTransparency = 1
content.Parent = mainFrame

local speedLabel = Instance.new("TextLabel")
speedLabel.Size = UDim2.new(0, 90, 0, 30)
speedLabel.Position = UDim2.new(0, 15, 0, 15)
speedLabel.BackgroundTransparency = 1
speedLabel.Text = "Fly Speed:"
speedLabel.TextColor3 = Color3.new(1, 1, 1)
speedLabel.Font = Enum.Font.Gotham
speedLabel.TextSize = 14
speedLabel.TextXAlignment = Enum.TextXAlignment.Left
speedLabel.Parent = content

local speedBox = Instance.new("TextBox")
speedBox.Name = "SpeedBox"
speedBox.Size = UDim2.new(0, 120, 0, 30)
speedBox.Position = UDim2.new(0, 120, 0, 15)
speedBox.BackgroundColor3 = Color3.fromRGB(55, 55, 70)
speedBox.BorderSizePixel = 0
speedBox.Text = tostring(flySpeed)
speedBox.PlaceholderText = "Type speed"
speedBox.TextColor3 = Color3.new(1, 1, 1)
speedBox.Font = Enum.Font.Gotham
speedBox.TextSize = 14
speedBox.ClearTextOnFocus = false
speedBox.Parent = content
Instance.new("UICorner", speedBox).CornerRadius = UDim.new(0, 6)

local flyBtn = Instance.new("TextButton")
flyBtn.Name = "FlyToggle"
flyBtn.Size = UDim2.new(1, -30, 0, 38)
flyBtn.Position = UDim2.new(0, 15, 0, 62)
flyBtn.BackgroundColor3 = Color3.fromRGB(200, 60, 60)
flyBtn.BorderSizePixel = 0
flyBtn.Text = "Fly: OFF"
flyBtn.TextColor3 = Color3.new(1, 1, 1)
flyBtn.Font = Enum.Font.GothamBold
flyBtn.TextSize = 16
flyBtn.Parent = content
Instance.new("UICorner", flyBtn).CornerRadius = UDim.new(0, 6)

-- ========== FLY LOGIC ==========
local function getCharacterParts()
	local char = player.Character
	if not char then return end
	local root = char:FindFirstChild("HumanoidRootPart")
	local hum = char:FindFirstChildOfClass("Humanoid")
	return char, root, hum
end

local function stopFly()
	flying = false
	if flyConnection then
		flyConnection:Disconnect()
		flyConnection = nil
	end
	if bodyVelocity then bodyVelocity:Destroy() bodyVelocity = nil end
	if bodyGyro then bodyGyro:Destroy() bodyGyro = nil end

	local _, _, hum = getCharacterParts()
	if hum then hum.PlatformStand = false end

	flyBtn.Text = "Fly: OFF"
	flyBtn.BackgroundColor3 = Color3.fromRGB(200, 60, 60)
end

local function startFly()
	local _, root, hum = getCharacterParts()
	if not root or not hum then return end

	flying = true
	hum.PlatformStand = true

	bodyVelocity = Instance.new("BodyVelocity")
	bodyVelocity.MaxForce = Vector3.new(1e9, 1e9, 1e9)
	bodyVelocity.Velocity = Vector3.zero
	bodyVelocity.Parent = root

	bodyGyro = Instance.new("BodyGyro")
	bodyGyro.MaxTorque = Vector3.new(1e9, 1e9, 1e9)
	bodyGyro.P = 9e4
	bodyGyro.CFrame = camera.CFrame
	bodyGyro.Parent = root

	flyBtn.Text = "Fly: ON"
	flyBtn.BackgroundColor3 = Color3.fromRGB(60, 180, 90)

	flyConnection = RunService.RenderStepped:Connect(function()
		local _, r, h = getCharacterParts()
		if not r or not h or not bodyVelocity then
			stopFly()
			return
		end

		camera = workspace.CurrentCamera
		local camCF = camera.CFrame
		local direction = Vector3.zero

		-- WASD / mobile thumbstick (relative to where the camera looks)
		local moveDir = h.MoveDirection
		if moveDir.Magnitude > 0 then
			local flatLook = Vector3.new(camCF.LookVector.X, 0, camCF.LookVector.Z)
			local flatRight = Vector3.new(camCF.RightVector.X, 0, camCF.RightVector.Z)
			if flatLook.Magnitude > 0.001 then flatLook = flatLook.Unit end
			if flatRight.Magnitude > 0.001 then flatRight = flatRight.Unit end
			local forwardAmt = moveDir:Dot(flatLook)
			local rightAmt = moveDir:Dot(flatRight)
			direction = camCF.LookVector * forwardAmt + camCF.RightVector * rightAmt
		end

		-- Up / down (only when not typing in a textbox)
		if not UserInputService:GetFocusedTextBox() then
			if UserInputService:IsKeyDown(Enum.KeyCode.Space) then
				direction += Vector3.new(0, 1, 0)
			end
			if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl)
				or UserInputService:IsKeyDown(Enum.KeyCode.LeftShift) then
				direction -= Vector3.new(0, 1, 0)
			end
		end

		if direction.Magnitude > 0 then
			direction = direction.Unit
		end

		bodyVelocity.Velocity = direction * flySpeed
		bodyGyro.CFrame = camCF
	end)
end

local function toggleFly()
	if flying then
		stopFly()
	else
		startFly()
	end
end

-- ========== BUTTON EVENTS ==========
flyBtn.MouseButton1Click:Connect(toggleFly)

speedBox.FocusLost:Connect(function()
	local value = tonumber(speedBox.Text)
	if value then
		flySpeed = math.clamp(value, MIN_SPEED, MAX_SPEED)
	end
	speedBox.Text = tostring(flySpeed) -- reset invalid input to the current speed
end)

local minimized = false
minBtn.MouseButton1Click:Connect(function()
	minimized = not minimized
	content.Visible = not minimized
	mainFrame.Size = minimized and UDim2.new(0, 260, 0, 30) or UDim2.new(0, 260, 0, 150)
	minBtn.Text = minimized and "+" or "-"
end)

closeBtn.MouseButton1Click:Connect(function()
	stopFly()
	screenGui:Destroy()
end)

-- Turn fly off if the character respawns
player.CharacterAdded:Connect(function()
	if flying then stopFly() end
end)

-- ========== DRAGGING ==========
local dragging, dragStart, startPos

titleBar.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1
		or input.UserInputType == Enum.UserInputType.Touch then
		dragging = true
		dragStart = input.Position
		startPos = mainFrame.Position
		input.Changed:Connect(function()
			if input.UserInputState == Enum.UserInputState.End then
				dragging = false
			end
		end)
	end
end)

UserInputService.InputChanged:Connect(function(input)
	if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement
		or input.UserInputType == Enum.UserInputType.Touch) then
		local delta = input.Position - dragStart
		mainFrame.Position = UDim2.new(
			startPos.X.Scale, startPos.X.Offset + delta.X,
			startPos.Y.Scale, startPos.Y.Offset + delta.Y
		)
	end
end)

Features & Information

[+] Fly GUI [+] Custom Speed [+] Universal
#Universal#Keyless

Community Comments (1)

VAHcommunityVAHcommunityOct 11, 2026

Ai🥀

More Scripts for Universal Scripts