Zooming script
Key RequiredUniversal

Zooming script

Universal ScriptUgwdubwUgwdubw 1.6K views 587 executesUpdated Jun 27, 2026
Unrated
00
Lua Script•248 lines (8482 chars)
-- Services
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")
local RunService = game:GetService("RunService")

local LocalPlayer = Players.LocalPlayer
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")
local Camera = Workspace.CurrentCamera or Workspace:WaitForChild("CurrentCamera")

-- Universal execution parent detection
local TargetParent = PlayerGui
if typeof(gethui) == "function" then
    TargetParent = gethui()
elseif pcall(function() local _ = game:GetService("CoreGui").Name end) and not RunService:IsStudio() then
    TargetParent = game:GetService("CoreGui")
end

-- Clean up older UI instances to prevent layering duplicates
if TargetParent:FindFirstChild("LiquidFOVZoomGui") then
    TargetParent["LiquidFOVZoomGui"]:Destroy()
end

-- Create ScreenGui Container
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "LiquidFOVZoomGui"
ScreenGui.ResetOnSpawn = false
ScreenGui.Parent = TargetParent

-- Main Draggable Interface Window (Liquid Glass Design)
local MainFrame = Instance.new("Frame")
MainFrame.Name = "MainFrame"
MainFrame.Size = UDim2.new(0, 240, 0, 140)
MainFrame.Position = UDim2.new(0.5, -120, 0.4, -70)
MainFrame.BackgroundColor3 = Color3.fromRGB(20, 24, 35)
MainFrame.BackgroundTransparency = 0.35 -- Translucent glass effect
MainFrame.BorderSizePixel = 0
MainFrame.Active = true
MainFrame.Parent = ScreenGui

local MainCorner = Instance.new("UICorner")
MainCorner.CornerRadius = UDim.new(0, 14)
MainCorner.Parent = MainFrame

-- Glass Border Highlight
local MainStroke = Instance.new("UIStroke")
MainStroke.Thickness = 1.5
MainStroke.Color = Color3.fromRGB(255, 255, 255)
MainStroke.Transparency = 0.75 -- Subtle light reflection edge
MainStroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border
MainStroke.Parent = MainFrame

-- Liquid Sheen Gradient
local MainGradient = Instance.new("UIGradient")
MainGradient.Color = ColorSequence.new({
    ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 255, 255)),
    ColorSequenceKeypoint.new(1, Color3.fromRGB(130, 140, 160))
})
MainGradient.Rotation = 45
MainGradient.Parent = MainFrame

-- Top Panel Header
local Title = Instance.new("TextLabel")
Title.Name = "Title"
Title.Size = UDim2.new(1, 0, 0, 35)
Title.BackgroundTransparency = 1
Title.Text = "GLASS FOV CONTROLLER"
Title.TextColor3 = Color3.fromRGB(240, 240, 255)
Title.TextSize = 11
Title.Font = Enum.Font.GothamBold
Title.TextTransparency = 0.3
Title.Parent = MainFrame

-- Zoom Inverted Display Indicator
local DisplayLabel = Instance.new("TextLabel")
DisplayLabel.Name = "DisplayLabel"
DisplayLabel.Size = UDim2.new(1, 0, 0, 40)
DisplayLabel.Position = UDim2.new(0, 0, 0, 30)
DisplayLabel.BackgroundTransparency = 1
DisplayLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
DisplayLabel.TextSize = 32
DisplayLabel.Font = Enum.Font.GothamBlack
DisplayLabel.Parent = MainFrame

-- Zoom Out Button (Minus)
local MinusBtn = Instance.new("TextButton")
MinusBtn.Name = "MinusBtn"
MinusBtn.Size = UDim2.new(0, 50, 0, 45)
MinusBtn.Position = UDim2.new(0.15, 0, 0, 75)
MinusBtn.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
MinusBtn.BackgroundTransparency = 0.85
MinusBtn.Text = "-"
MinusBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
MinusBtn.TextSize = 28
MinusBtn.Font = Enum.Font.GothamBold
MinusBtn.AutoButtonColor = false
MinusBtn.Parent = MainFrame

local MinusCorner = Instance.new("UICorner")
MinusCorner.CornerRadius = UDim.new(0, 10)
MinusCorner.Parent = MinusBtn

local MinusStroke = Instance.new("UIStroke")
MinusStroke.Thickness = 1
MinusStroke.Color = Color3.fromRGB(255, 255, 255)
MinusStroke.Transparency = 0.8
MinusStroke.Parent = MinusBtn

-- Zoom In Button (Plus)
local PlusBtn = Instance.new("TextButton")
PlusBtn.Name = "PlusBtn"
PlusBtn.Size = UDim2.new(0, 50, 0, 45)
PlusBtn.Position = UDim2.new(0.65, 0, 0, 75)
PlusBtn.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
PlusBtn.BackgroundTransparency = 0.85
PlusBtn.Text = "+"
PlusBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
PlusBtn.TextSize = 24
PlusBtn.Font = Enum.Font.GothamBold
PlusBtn.AutoButtonColor = false
PlusBtn.Parent = MainFrame

local PlusCorner = Instance.new("UICorner")
PlusCorner.CornerRadius = UDim.new(0, 10)
PlusCorner.Parent = PlusBtn

local PlusStroke = Instance.new("UIStroke")
PlusStroke.Thickness = 1
PlusStroke.Color = Color3.fromRGB(255, 255, 255)
PlusStroke.Transparency = 0.8
PlusStroke.Parent = PlusBtn

---------------------------------------------------------
-- FOV Modulating & Continuous Hold Logic
---------------------------------------------------------
local currentFOV = math.clamp(Camera.FieldOfView, 1, 100)
local holdingPlus = false
local holdingMinus = false

local function updateCameraZoom()
    Camera.FieldOfView = currentFOV
    -- Linear Inversion Formula: 1 FOV = 100x zoom, 100 FOV = 1x zoom
    local calculatedZoom = 101 - currentFOV
    DisplayLabel.Text = tostring(calculatedZoom) .. "x Zoom"
end

-- Force layout config step
updateCameraZoom()

-- Dynamic hold action processor loop
local function startZoomLoop(direction)
    task.spawn(function()
        while (direction == "in" and holdingPlus) or (direction == "out" and holdingMinus) do
            if direction == "in" then
                currentFOV = math.clamp(currentFOV - 1, 1, 100)
            elseif direction == "out" then
                currentFOV = math.clamp(currentFOV + 1, 1, 100)
            end
            updateCameraZoom()
            task.wait(0.02) -- Smooth incremental loop delay
        end
    end)
end

-- Input Listeners for Plus Button
PlusBtn.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        holdingPlus = true
        PlusBtn.BackgroundTransparency = 0.7
        startZoomLoop("in")
    end
end)

PlusBtn.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        holdingPlus = false
        PlusBtn.BackgroundTransparency = 0.85
    end
end)

-- Input Listeners for Minus Button
MinusBtn.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        holdingMinus = true
        MinusBtn.BackgroundTransparency = 0.7
        startZoomLoop("out")
    end
end)

MinusBtn.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        holdingMinus = false
        MinusBtn.BackgroundTransparency = 0.85
    end
end)

-- Global safety release override to prevent locking loop if focus drops mid-click
UserInputService.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        holdingPlus = false
        holdingMinus = false
        PlusBtn.BackgroundTransparency = 0.85
        MinusBtn.BackgroundTransparency = 0.85
    end
end)

-- Locking Camera configuration layer safely across frame iterations
Camera:GetPropertyChangedSignal("FieldOfView"):Connect(function()
    if Camera.FieldOfView ~= currentFOV then
        Camera.FieldOfView = currentFOV
    end
end)

---------------------------------------------------------
-- Universal Drag Engine
---------------------------------------------------------
local dragToggle = false
local dragStart, startPos

local function updatePosition(input)
    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

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

UserInputService.InputChanged:Connect(function(input)
    if dragToggle and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
        updatePosition(input)
    end
end)

Features & Information

It lets you zoom with fov changing

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts