
KeylessUniversal

-- Serviços necessários
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local LocalPlayer = Players.LocalPlayer
local Camera = workspace.CurrentCamera
-- Desativa o controle de toque padrão do Roblox para o script assumir
LocalPlayer.DevTouchMovementMode = Enum.DevTouchMovementMode.Scriptable
-- Criação da Interface (GUI)
local gui = Instance.new("ScreenGui")
gui.Name = "AnalogicoDeltaCustomizado"
gui.ResetOnSpawn = false
-- Tenta colocar no CoreGui (esconde do jogo) ou no PlayerGui
local success = pcall(function()
gui.Parent = gethui and gethui() or game:GetService("CoreGui")
end)
if not success then
gui.Parent = LocalPlayer:WaitForChild("PlayerGui")
end
-- 1. ZONA DE TOQUE E ANALÓGICO (Totalmente invisível e livre de visão)
local zonaToque = Instance.new("TextButton")
zonaToque.Size = UDim2.new(0, 240, 0, 240)
zonaToque.Position = UDim2.new(0, 10, 1, -230) -- Fixo na marcação branca
zonaToque.BackgroundTransparency = 1
zonaToque.Text = ""
zonaToque.AutoButtonColor = false
zonaToque.Active = true
zonaToque.Parent = gui
local fundoAnalogico = Instance.new("Frame")
fundoAnalogico.Size = UDim2.new(0, 140, 0, 140)
fundoAnalogico.Position = UDim2.new(0.5, -70, 0.5, -70)
fundoAnalogico.BackgroundTransparency = 1
fundoAnalogico.AnchorPoint = Vector2.new(0, 0)
fundoAnalogico.Visible = true
fundoAnalogico.Parent = zonaToque
-- 2. PINO DO ANALÓGICO (Botão Verde)
local pinoAnalogico = Instance.new("Frame")
pinoAnalogico.Size = UDim2.new(0, 50, 0, 50)
pinoAnalogico.BackgroundColor3 = Color3.new(0, 1, 0)
pinoAnalogico.BackgroundTransparency = 0.3
pinoAnalogico.AnchorPoint = Vector2.new(0.5, 0.5)
pinoAnalogico.Position = UDim2.new(0.5, 0, 0.5, 0)
pinoAnalogico.Parent = fundoAnalogico
local cantoPino = Instance.new("UICorner")
cantoPino.CornerRadius = UDim.new(1, 0)
cantoPino.Parent = pinoAnalogico
-- 3. BOTÃO DE PULO CUSTOMIZADO (Simples e funcional)
local botaoPuloCustom = Instance.new("ImageButton")
botaoPuloCustom.Name = "JumpButtonCustom"
botaoPuloCustom.Size = UDim2.new(0, 70, 0, 70)
botaoPuloCustom.Position = UDim2.new(1, -110, 1, -130)
botaoPuloCustom.BackgroundColor3 = Color3.fromRGB(45, 45, 45)
botaoPuloCustom.BackgroundTransparency = 0.3
botaoPuloCustom.Image = "rbxassetid://6074252252"
botaoPuloCustom.AutoButtonColor = true
botaoPuloCustom.Parent = gui
local cantoPulo = Instance.new("UICorner")
cantoPulo.CornerRadius = UDim.new(1, 0)
cantoPulo.Parent = botaoPuloCustom
local bordaPulo = Instance.new("UIStroke")
bordaPulo.Color = Color3.fromRGB(80, 80, 80)
bordaPulo.Thickness = 2
bordaPulo.Parent = botaoPuloCustom
-- Variável para controlar o pulo contínuo sem delay
local estaPulando = false
botaoPuloCustom.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
estaPulando = true
end
end)
local function soltarPulo(input)
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
estaPulando = false
end
end
botaoPuloCustom.InputEnded:Connect(soltarPulo)
UserInputService.InputEnded:Connect(soltarPulo)
-- Variáveis de controle de movimento do analógico
local toqueAtual = nil
local vetorMovimento = Vector2.new(0, 0)
local raioMaximo = 35 -- Raio menor: anda devagar só pertinho do centro e atinge velocidade máxima rapidamente
-- Detecta quando o dedo/mouse pressiona a zona do analógico
zonaToque.InputBegan:Connect(function(input)
if (input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1) and toqueAtual == nil then
toqueAtual = input
vetorMovimento = Vector2.new(0, 0)
end
end)
-- Detecta o dedo/mouse arrastando
UserInputService.InputChanged:Connect(function(input)
if input == toqueAtual and (input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement) then
local absPos = fundoAnalogico.AbsolutePosition
local absSize = fundoAnalogico.AbsoluteSize
local centroX = absPos.X + (absSize.X / 2)
local centroY = absPos.Y + (absSize.Y / 2)
local delta = Vector2.new(input.Position.X, input.Position.Y) - Vector2.new(centroX, centroY)
local distancia = delta.Magnitude
-- O pino verde continua indo longe livremente (até 110 pixels)
local raioVisualMax = 110
local pinoDelta = delta
if distancia > raioVisualMax then
pinoDelta = delta.Unit * raioVisualMax
end
pinoAnalogico.Position = UDim2.new(0.5, pinoDelta.X, 0.5, pinoDelta.Y)
-- Movimento limpo: Lento apenas bem perto do centro (zona morta de 4 pixels), rápido no resto
if distancia > 4 then
vetorMovimento = delta / raioMaximo
if vetorMovimento.Magnitude > 1 then
vetorMovimento = vetorMovimento.Unit
end
else
vetorMovimento = Vector2.new(0, 0)
end
end
end)
-- Função para soltar o analógico
local function soltarAnalogico(input)
if input == toqueAtual then
toqueAtual = nil
vetorMovimento = Vector2.new(0, 0)
pinoAnalogico.Position = UDim2.new(0.5, 0, 0.5, 0)
end
end
zonaToque.InputEnded:Connect(soltarAnalogico)
UserInputService.InputEnded:Connect(soltarAnalogico)
-- Loop principal: Movimento fluido e limpo
RunService.RenderStepped:Connect(function()
local personagem = LocalPlayer.Character
if personagem and personagem:FindFirstChild("Humanoid") then
if vetorMovimento.Magnitude > 0 then
local lookVector = Camera.CFrame.LookVector
local rightVector = Camera.CFrame.RightVector
local frente = Vector3.new(lookVector.X, 0, lookVector.Z).Unit
local direita = Vector3.new(rightVector.X, 0, rightVector.Z).Unit
local direcaoMundo = (frente * -vetorMovimento.Y) + (direita * vetorMovimento.X)
personagem.Humanoid:Move(direcaoMundo, false)
else
personagem.Humanoid:Move(Vector3.new(0, 0, 0), false)
end
if estaPulando then
personagem.Humanoid.Jump = true
end
end
end)No comments yet for this script.



