Universal Spectate Gui
Key RequiredUniversal

Universal Spectate Gui

Universal ScriptTyrone_darealestTyrone_darealest 2.4K views 428 executesUpdated Sep 28, 2025
Unrated
00
Lua Script•301 lines (10567 chars)
--// Universal Spectate GUI Made by Tyrone_darealest 


local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")

local toggleKey = Enum.KeyCode.RightShift


local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "SpectateUI"
ScreenGui.Parent = (gethui and gethui()) or game.CoreGui 

local MainFrame = Instance.new("Frame")
MainFrame.Name = "MainFrame"
MainFrame.Size = UDim2.new(0, 300, 0, 180)
MainFrame.Position = UDim2.new(0.5, -150, 0.5, -90)
MainFrame.BackgroundColor3 = Color3.fromRGB(35, 35, 35)
MainFrame.Active = true
MainFrame.Visible = true
MainFrame.Parent = ScreenGui

local UICorner = Instance.new("UICorner", MainFrame)
UICorner.CornerRadius = UDim.new(0, 12)


local TopBar = Instance.new("Frame")
TopBar.Name = "TopBar"
TopBar.Size = UDim2.new(1, 0, 0, 30)
TopBar.BackgroundColor3 = Color3.fromRGB(25, 25, 25)
TopBar.Parent = MainFrame
local TopBarCorner = Instance.new("UICorner", TopBar)
TopBarCorner.CornerRadius = UDim.new(0, 12)

local Title = Instance.new("TextLabel")
Title.Size = UDim2.new(1, -40, 1, 0)
Title.Position = UDim2.new(0, 10, 0, 0)
Title.Text = "Spectate GUI"
Title.TextColor3 = Color3.fromRGB(255, 255, 255)
Title.TextSize = 16
Title.BackgroundTransparency = 1
Title.Font = Enum.Font.GothamBold
Title.TextXAlignment = Enum.TextXAlignment.Left
Title.Parent = TopBar


local Minimize = Instance.new("TextButton")
Minimize.Size = UDim2.new(0, 30, 0, 30)
Minimize.Position = UDim2.new(1, -35, 0, 0)
Minimize.Text = "-"
Minimize.TextColor3 = Color3.fromRGB(255, 255, 255)
Minimize.TextSize = 18
Minimize.BackgroundTransparency = 1
Minimize.Parent = TopBar


do
    local dragging, dragStart, startPos
    TopBar.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 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)
    TopBar.InputChanged:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseMovement then
            if dragging and dragStart and startPos 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
    end)
end


local PlayerBox = Instance.new("TextBox")
PlayerBox.Size = UDim2.new(0.9, 0, 0, 30)
PlayerBox.Position = UDim2.new(0.05, 0, 0, 40)
PlayerBox.PlaceholderText = "Enter player name (full or partial)"
PlayerBox.Text = ""
PlayerBox.TextSize = 14
PlayerBox.TextColor3 = Color3.fromRGB(255, 255, 255)
PlayerBox.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
PlayerBox.Font = Enum.Font.Gotham
PlayerBox.ClearTextOnFocus = false
PlayerBox.Parent = MainFrame
Instance.new("UICorner", PlayerBox).CornerRadius = UDim.new(0, 8)

local SpectateButton = Instance.new("TextButton")
SpectateButton.Size = UDim2.new(0.4, 0, 0, 30)
SpectateButton.Position = UDim2.new(0.05, 0, 0, 80)
SpectateButton.Text = "Spectate"
SpectateButton.TextColor3 = Color3.fromRGB(255, 255, 255)
SpectateButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
SpectateButton.Font = Enum.Font.Gotham
SpectateButton.TextSize = 14
SpectateButton.Parent = MainFrame
Instance.new("UICorner", SpectateButton).CornerRadius = UDim.new(0, 8)


local StopButton = Instance.new("TextButton")
StopButton.Size = UDim2.new(0.4, 0, 0, 30)
StopButton.Position = UDim2.new(0.55, 0, 0, 80)
StopButton.Text = "Stop"
StopButton.TextColor3 = Color3.fromRGB(255, 255, 255)
StopButton.BackgroundColor3 = Color3.fromRGB(150, 50, 50)
StopButton.Font = Enum.Font.Gotham
StopButton.TextSize = 14
StopButton.Parent = MainFrame
Instance.new("UICorner", StopButton).CornerRadius = UDim.new(0, 8)


local KeybindButton = Instance.new("TextButton")
KeybindButton.Size = UDim2.new(0.9, 0, 0, 30)
KeybindButton.Position = UDim2.new(0.05, 0, 0, 120)
KeybindButton.Text = "Set Toggle Key (Current: RightShift)"
KeybindButton.TextColor3 = Color3.fromRGB(255, 255, 255)
KeybindButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
KeybindButton.Font = Enum.Font.Gotham
KeybindButton.TextSize = 14
KeybindButton.Parent = MainFrame
Instance.new("UICorner", KeybindButton).CornerRadius = UDim.new(0, 8)

local Camera = workspace.CurrentCamera
local spectating = false
local targetPlayer = nil

local function findPlayer(query)
    if not query or query == "" then return nil end
    query = query:lower()
    for _, plr in pairs(Players:GetPlayers()) do
        if plr.Character then
            local name = plr.Name:lower()
            local dname = tostring(plr.DisplayName or ""):lower()
            if name:find(query, 1, true) or dname:find(query, 1, true) then
                return plr
            end
        end
    end
    return nil
end

SpectateButton.MouseButton1Click:Connect(function()
    local q = PlayerBox.Text
    local plr = findPlayer(q)
    if plr and plr.Character then
        targetPlayer = plr
        spectating = true
        local hum = plr.Character:FindFirstChildWhichIsA("Humanoid")
        if hum then Camera.CameraSubject = hum end
    else
      
        KeybindButton.Text = "No player found"
        delay(1.2, function()
            KeybindButton.Text = ("Bound: %s"):format(toggleKey and toggleKey.Name or "None")
        end)
    end
end)

StopButton.MouseButton1Click:Connect(function()
    spectating = false
    targetPlayer = nil
    local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildWhichIsA("Humanoid")
    if hum then Camera.CameraSubject = hum end
end)


RunService.RenderStepped:Connect(function()
    if spectating and targetPlayer and targetPlayer.Character then
        local hum = targetPlayer.Character:FindFirstChildWhichIsA("Humanoid")
        if hum then Camera.CameraSubject = hum end
    end
end)


local children = {PlayerBox, SpectateButton, StopButton, KeybindButton}
local originalProps = {}
for _, v in ipairs(children) do
    originalProps[v] = {
        Visible = v.Visible,
        BackgroundTransparency = (v.BackgroundTransparency or 0),
        TextTransparency = (v.TextTransparency or 0),
        Position = v.Position,
        Size = v.Size
    }
end

local minimized = false
local tweenTime = 0.22

local function hideChildren()
    for _, v in ipairs(children) do
        if v and v.Parent then
            v.Active = false
         
            local props = {}
            if v:IsA("TextBox") or v:IsA("TextLabel") or v:IsA("TextButton") then
                props.TextTransparency = 1
                props.BackgroundTransparency = 1
            else
                props.BackgroundTransparency = 1
            end
            TweenService:Create(v, TweenInfo.new(tweenTime, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), props):Play()
            delay(tweenTime + 0.01, function()
                if v and v.Parent then v.Visible = false end
            end)
        end
    end
end

local function showChildren()
    for _, v in ipairs(children) do
        if v and v.Parent then
            v.Visible = true
            local props = {}
            props.TextTransparency = originalProps[v].TextTransparency or 0
            props.BackgroundTransparency = originalProps[v].BackgroundTransparency or 0
        
            TweenService:Create(v, TweenInfo.new(tweenTime, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), props):Play()
            delay(tweenTime + 0.01, function()
                if v and v.Parent then v.Active = true end
            end)
        end
    end
end

Minimize.MouseButton1Click:Connect(function()
    minimized = not minimized
    Minimize.Text = minimized and "+" or "-"
    if minimized then
       
        TweenService:Create(MainFrame, TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = UDim2.new(0, 300, 0, 30)}):Play()
        hideChildren()
    else

        TweenService:Create(MainFrame, TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = UDim2.new(0, 300, 0, 180)}):Play()
        showChildren()
    end
end)


local bindingConnection
local function setKeybindText()
    local text = toggleKey and toggleKey.Name or "None"
    KeybindButton.Text = ("Bound: %s"):format(text)
end
setKeybindText()

KeybindButton.MouseButton1Click:Connect(function()
    KeybindButton.Text = "Press a key..."
    if bindingConnection then bindingConnection:Disconnect() end
    bindingConnection = UserInputService.InputBegan:Connect(function(input, gpe)
        if gpe then return end
        local newKey = nil
        if input.UserInputType == Enum.UserInputType.Keyboard then
            newKey = input.KeyCode
        elseif input.UserInputType == Enum.UserInputType.MouseButton1 then
            newKey = Enum.KeyCode.MouseButton1
        elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
            newKey = Enum.KeyCode.MouseButton2
        elseif input.UserInputType == Enum.UserInputType.MouseButton3 then
            newKey = Enum.KeyCode.MouseButton3
        elseif input.UserInputType == Enum.UserInputType.Gamepad1 or input.UserInputType.Name:match("Gamepad") then
          
            newKey = input.KeyCode ~= Enum.KeyCode.Unknown and input.KeyCode or nil
        end

        if newKey then
            toggleKey = newKey
            setKeybindText()
        else
            KeybindButton.Text = "Bound: " .. tostring(toggleKey.Name)
        end

        if bindingConnection then bindingConnection:Disconnect() bindingConnection = nil end
    end)
end)


UserInputService.InputBegan:Connect(function(input, gpe)
    if gpe then return end
    -- compare by KeyCode; for mouse buttons they will map to MouseButton1/2/3
    if input.KeyCode == toggleKey or (input.UserInputType == Enum.UserInputType.MouseButton1 and toggleKey == Enum.KeyCode.MouseButton1) or
       (input.UserInputType == Enum.UserInputType.MouseButton2 and toggleKey == Enum.KeyCode.MouseButton2) or
       (input.UserInputType == Enum.UserInputType.MouseButton3 and toggleKey == Enum.KeyCode.MouseButton3) then
        MainFrame.Visible = not MainFrame.Visible
      
        if MainFrame.Visible and not minimized then
            showChildren()
        end
    end
end)

Features & Information

--// Universal Spectate GUI Made by Tyrone_darealest -- Partial/abbreviated name detection (any substring in Name or DisplayName) -- Open Sourced Gui
#Free#Universal

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts