--// 🌈 ADVANCED MOBILE MOVEMENT CONTROLLER --// LocalScript -> StarterPlayer > StarterPlayerScripts local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local TweenService = game:GetService("TweenService") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") --================================================== -- CONFIGURAÇÕES --================================================== local BUTTON_SIZE = 62 local GAP = 7 local NORMAL_COLOR = Color3.fromRGB(35, 35, 45) local PRESSED_COLOR = Color3.fromRGB(70, 150, 255) local LOCK_COLOR = Color3.fromRGB(40, 200, 110) local RAINBOW_SPEED = 0.25 local RAINBOW_SATURATION = 0.85 local RAINBOW_VALUE = 1 local muted = false local locked = true local pressed = { W = false, A = false, S = false, D = false } --================================================== -- GUI --================================================== local gui = Instance.new("ScreenGui") gui.Name = "AdvancedMobileMovement" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.Parent = playerGui local controller = Instance.new("Frame") controller.Name = "Controller" controller.Size = UDim2.fromOffset( BUTTON_SIZE * 3 + GAP * 2, BUTTON_SIZE * 2 + GAP ) controller.Position = UDim2.new(0, 25, 1, -170) controller.BackgroundTransparency = 1 controller.Parent = gui --================================================== -- BOTÕES --================================================== local function makeButton(name, text, position) local button = Instance.new("TextButton") button.Name = name button.Size = UDim2.fromOffset(BUTTON_SIZE, BUTTON_SIZE) button.Position = position button.BackgroundColor3 = NORMAL_COLOR button.BackgroundTransparency = 0.08 button.Text = text button.TextColor3 = Color3.fromRGB(255,255,255) button.TextScaled = true button.Font = Enum.Font.GothamBold button.AutoButtonColor = false button.Parent = controller local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0,16) corner.Parent = button local stroke = Instance.new("UIStroke") stroke.Thickness = 2 stroke.Transparency = 0.2 stroke.Color = Color3.fromRGB(255,255,255) stroke.Parent = button local shadow = Instance.new("Frame") shadow.Name = "Shadow" shadow.Size = UDim2.new(1,4,1,4) shadow.Position = UDim2.fromOffset(3,5) shadow.BackgroundColor3 = Color3.fromRGB(0,0,0) shadow.BackgroundTransparency = 0.65 shadow.ZIndex = button.ZIndex - 1 shadow.Parent = button local shadowCorner = Instance.new("UICorner") shadowCorner.CornerRadius = UDim.new(0,16) shadowCorner.Parent = shadow return button end local W = makeButton( "W", "▲", UDim2.fromOffset(BUTTON_SIZE + GAP,0) ) local A = makeButton( "A", "◀", UDim2.fromOffset(0,BUTTON_SIZE + GAP) ) local S = makeButton( "S", "▼", UDim2.fromOffset(BUTTON_SIZE + GAP,BUTTON_SIZE + GAP) ) local D = makeButton( "D", "▶", UDim2.fromOffset((BUTTON_SIZE + GAP) * 2,BUTTON_SIZE + GAP) ) local buttons = { W = W, A = A, S = S, D = D } --================================================== -- 🔒 CADEADO --================================================== local lockButton = Instance.new("TextButton") lockButton.Name = "LockButton" lockButton.Size = UDim2.fromOffset(52,52) lockButton.Position = UDim2.new( 0,25, 1,-230 ) lockButton.BackgroundColor3 = LOCK_COLOR lockButton.BackgroundTransparency = 0.08 lockButton.Text = "🔒" lockButton.TextScaled = true lockButton.Font = Enum.Font.GothamBold lockButton.TextColor3 = Color3.new(1,1,1) lockButton.AutoButtonColor = false lockButton.Parent = gui local lockCorner = Instance.new("UICorner") lockCorner.CornerRadius = UDim.new(0,15) lockCorner.Parent = lockButton local lockStroke = Instance.new("UIStroke") lockStroke.Thickness = 2 lockStroke.Color = Color3.fromRGB(255,255,255) lockStroke.Transparency = 0.2 lockStroke.Parent = lockButton --================================================== -- 🔊 SONS --================================================== local pressSound = Instance.new("Sound") pressSound.Name = "PressSound" pressSound.SoundId = "rbxasset://sounds/electronicpingshort.wav" pressSound.Volume = 0.12 pressSound.Parent = gui local lockSound = Instance.new("Sound") lockSound.Name = "LockSound" lockSound.SoundId = "rbxasset://sounds/electronicpingshort.wav" lockSound.Volume = 0.15 lockSound.Parent = gui local function playSound(sound) if muted then return end local clone = sound:Clone() clone.Parent = gui clone.Volume = sound.Volume clone:Play() task.delay(1,function() if clone then clone:Destroy() end end) end --================================================== -- 🌈 EFEITO ARCO-ÍRIS --================================================== local rainbowObjects = { W, A, S, D, lockButton } task.spawn(function() local hue = 0 while gui.Parent do hue = (hue + RAINBOW_SPEED * 0.01) % 1 local rainbowColor = Color3.fromHSV( hue, RAINBOW_SATURATION, RAINBOW_VALUE ) for _,object in ipairs(rainbowObjects) do if object and object.Parent then if object == lockButton then if locked then object.BackgroundColor3 = rainbowColor end elseif not pressed[object.Name] then object.BackgroundColor3 = rainbowColor end end end task.wait(0.03) end end) --================================================== -- ANIMAÇÃO DOS BOTÕES --================================================== local function setButtonPressed(button,state) if state then TweenService:Create( button, TweenInfo.new(0.08), { BackgroundColor3 = PRESSED_COLOR, Size = UDim2.fromOffset( BUTTON_SIZE - 4, BUTTON_SIZE - 4 ) } ):Play() else TweenService:Create( button, TweenInfo.new(0.08), { Size = UDim2.fromOffset( BUTTON_SIZE, BUTTON_SIZE ) } ):Play() end end --================================================== -- MOVIMENTO --================================================== local activeTouches = {} local function setDirection(direction,state) if pressed[direction] == state then return end pressed[direction] = state local button = buttons[direction] if button then setButtonPressed(button,state) end if state then playSound(pressSound) end end for direction,button in pairs(buttons) do button.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then activeTouches[input] = direction setDirection(direction,true) end end) button.InputEnded:Connect(function(input) if activeTouches[input] == direction then activeTouches[input] = nil setDirection(direction,false) end end) end --================================================== -- 🎮 MOVIMENTO REAL DO PERSONAGEM --================================================== local function getHumanoid() local character = player.Character if not character then return nil end return character:FindFirstChildOfClass("Humanoid") end RunService.RenderStepped:Connect(function() local humanoid = getHumanoid() if not humanoid then return end local camera = workspace.CurrentCamera if not camera then return end local forward = 0 local right = 0 if pressed.W then forward += 1 end if pressed.S then forward -= 1 end if pressed.D then right += 1 end if pressed.A then right -= 1 end local direction = Vector3.new( right, 0, forward ) if direction.Magnitude > 0 then direction = direction.Unit local cameraForward = Vector3.new( camera.CFrame.LookVector.X, 0, camera.CFrame.LookVector.Z ) local cameraRight = Vector3.new( camera.CFrame.RightVector.X, 0, camera.CFrame.RightVector.Z ) if cameraForward.Magnitude > 0 then cameraForward = cameraForward.Unit end if cameraRight.Magnitude > 0 then cameraRight = cameraRight.Unit end local finalDirection = (cameraRight * direction.X) + (cameraForward * direction.Z) humanoid:Move(finalDirection,false) else humanoid:Move(Vector3.zero,false) end end) --================================================== -- 📱 ARRASTAR CONTROLE INTEIRO --================================================== local dragging = false local dragStart local startPosition local function updateController(input) local delta = input.Position - dragStart controller.Position = UDim2.new( startPosition.X.Scale, startPosition.X.Offset + delta.X, startPosition.Y.Scale, startPosition.Y.Offset + delta.Y ) end controller.InputBegan:Connect(function(input) if locked then return end if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true dragStart = input.Position startPosition = controller.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) UserInputService.InputChanged:Connect(function(input) if not dragging then return end if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement then updateController(input) end end) --================================================== -- 🔒 ABRIR / FECHAR CADEADO --================================================== lockButton.Activated:Connect(function() locked = not locked playSound(lockSound) if locked then lockButton.Text = "🔒" else lockButton.Text = "🔓" end end) --================================================== -- 🔇 MUTE / 🔊 UNMUTE --================================================== player.Chatted:Connect(function(message) message = string.lower(message) -- Remove espaços extras message = message:gsub("^%s*(.-)%s*$","%1") if message == "mute" then muted = true elseif message == "unmute" then muted = false end end) --================================================== -- SOLTAR BOTÕES --================================================== UserInputService.InputEnded:Connect(function(input) local direction = activeTouches[input] if direction then activeTouches[input] = nil setDirection(direction,false) end end) --================================================== -- RESETAR DEPOIS DA MORTE --================================================== player.CharacterAdded:Connect(function() for direction in pairs(pressed) do pressed[direction] = false if buttons[direction] then buttons[direction].Size = UDim2.fromOffset( BUTTON_SIZE, BUTTON_SIZE ) end end end)