A Basic Pc Controller for Mobile
Key RequiredUniversal

A Basic Pc Controller for Mobile

Universal ScriptNPC_PlayersNoobNPC_PlayersNoob 900 views 731 executesUpdated Mar 25, 2026
Unrated
00
Lua Script•181 lines (7278 chars)
--[[
    测试版 V2.9:UI 构造完全统一版
    - 修复:Jump 按钮改用与 WASD 相同的 Frame+TextLabel 构造
    - 保持:所有按钮字体比例 0.28
    - 保持:WASD 紧凑间距 (0.88),ShiftLock 功能
    - 位置:Jump 靠右 (0.88),Shift 位于右下
]]

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

local player = Players.LocalPlayer
local pGui = player:WaitForChild("PlayerGui")
local camera = workspace.CurrentCamera

-- 1. 屏蔽原生拉杆
RunService.Stepped:Connect(function()
    local touchGui = pGui:FindFirstChild("TouchGui")
    if touchGui then
        touchGui.Enabled = false
        local frame = touchGui:FindFirstChild("TouchControlFrame")
        if frame then frame.Position = UDim2.new(2, 0, 2, 0) end
    end
end)

-- 2. 清理旧 UI
if pGui:FindFirstChild("Beta_V2_9") then pGui.Beta_V2_9:Destroy() end

-- 3. 创建容器
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "Beta_V2_9"
ScreenGui.Parent = pGui
ScreenGui.ResetOnSpawn = false
ScreenGui.IgnoreGuiInset = true

-- 4. 参数设定
local screen = ScreenGui.AbsoluteSize
local btnSize = math.clamp(screen.X * 0.09, 70, 100) 
local gap = btnSize * 0.88 
local startX, startY = 0.15, 0.55

-- 5. 统一按钮创建函数 (核心:Frame + TextLabel + Stroke)
local function createStyledButton(name, text, pos, size)
    local frame = Instance.new("Frame")
    frame.Name = name
    frame.Size = size
    frame.Position = pos
    frame.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
    frame.BackgroundTransparency = 0.4
    frame.ZIndex = 10
    frame.Parent = ScreenGui

    local corner = Instance.new("UICorner")
    corner.CornerRadius = UDim.new(0.3, 0)
    corner.Parent = frame

    local txt = Instance.new("TextLabel")
    txt.Size = UDim2.new(1, 0, 1, 0)
    txt.Text = text
    txt.TextColor3 = Color3.new(1, 1, 1)
    txt.BackgroundTransparency = 1
    txt.Font = Enum.Font.GothamBold
    txt.TextSize = size.Y.Offset * 0.28 -- 统一比例
    txt.Parent = frame
    
    local stroke = Instance.new("UIStroke")
    stroke.Color = Color3.new(1, 1, 1)
    stroke.Thickness = 2.5
    stroke.Transparency = 0.6
    stroke.Parent = frame

    return frame
end

-- 6. 创建 WASD (视觉部分)
local KeysUI = {}
KeysUI.W = createStyledButton("W_Key", "W", UDim2.new(startX, 0, startY, -gap), UDim2.new(0, btnSize, 0, btnSize))
KeysUI.S = createStyledButton("S_Key", "S", UDim2.new(startX, 0, startY, gap), UDim2.new(0, btnSize, 0, btnSize))
KeysUI.A = createStyledButton("A_Key", "A", UDim2.new(startX, -gap, startY, 0), UDim2.new(0, btnSize, 0, btnSize))
KeysUI.D = createStyledButton("D_Key", "D", UDim2.new(startX, gap, startY, 0), UDim2.new(0, btnSize, 0, btnSize))

-- 7. WASD 拉杆感应逻辑层
local TouchArea = Instance.new("TextButton")
TouchArea.Name = "TouchSenseLayer"
local areaSize = gap * 3.0 
TouchArea.Size = UDim2.new(0, areaSize, 0, areaSize)
TouchArea.Position = UDim2.new(startX, -areaSize/2 + btnSize/2, startY, -areaSize/2 + btnSize/2)
TouchArea.BackgroundTransparency = 1
TouchArea.Text = ""
TouchArea.ZIndex = 15 
TouchArea.Parent = ScreenGui

local ActiveKeys = {W = false, A = false, S = false, D = false}
local function updateInput(inputPos)
    local center = Vector2.new(TouchArea.AbsolutePosition.X + TouchArea.AbsoluteSize.X/2, TouchArea.AbsolutePosition.Y + TouchArea.AbsoluteSize.Y/2)
    local delta = inputPos - center
    local threshold = gap * 0.32
    local newStates = {W = delta.Y < -threshold, S = delta.Y > threshold, A = delta.X < -threshold, D = delta.X > threshold}
    for k, isDown in pairs(newStates) do
        if ActiveKeys[k] ~= isDown then
            ActiveKeys[k] = isDown
            VirtualInputManager:SendKeyEvent(isDown, Enum.KeyCode[k], false, game)
            KeysUI[k].BackgroundColor3 = isDown and Color3.new(1, 1, 1) or Color3.fromRGB(30, 30, 30)
            KeysUI[k].TextLabel.TextColor3 = isDown and Color3.new(0, 0, 0) or Color3.new(1, 1, 1)
        end
    end
end

TouchArea.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch then updateInput(Vector2.new(input.Position.X, input.Position.Y)) end end)
TouchArea.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch then updateInput(Vector2.new(input.Position.X, input.Position.Y)) end end)
TouchArea.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.Touch then
        for k, v in pairs(ActiveKeys) do if v then ActiveKeys[k] = false VirtualInputManager:SendKeyEvent(false, Enum.KeyCode[k], false, game) KeysUI[k].BackgroundColor3 = Color3.fromRGB(30, 30, 30) KeysUI[k].TextLabel.TextColor3 = Color3.new(1, 1, 1) end end
    end
end)

-- 8. 【Jump 按钮】:构造完全模仿 WASD
local jumpSize = btnSize * 1.5
local JumpUI = createStyledButton("Jump_Visual", "JUMP", UDim2.new(0.88, -jumpSize/2, startY, 0), UDim2.new(0, jumpSize, 0, jumpSize))

local JumpHitbox = Instance.new("TextButton")
JumpHitbox.Name = "JumpHitbox"
JumpHitbox.Size = UDim2.new(1, 0, 1, 0)
JumpHitbox.BackgroundTransparency = 1
JumpHitbox.Text = ""
JumpHitbox.ZIndex = 20
JumpHitbox.Parent = JumpUI

JumpHitbox.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
        JumpUI.BackgroundColor3 = Color3.new(1, 1, 1)
        JumpUI.TextLabel.TextColor3 = Color3.new(0, 0, 0)
        VirtualInputManager:SendKeyEvent(true, Enum.KeyCode.Space, false, game)
    end
end)
JumpHitbox.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
        JumpUI.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
        JumpUI.TextLabel.TextColor3 = Color3.new(1, 1, 1)
        VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.Space, false, game)
    end
end)

-- 9. ShiftLock 按钮 (右下角)
local shiftSize = btnSize * 1.1
local isShiftLock = false
local ShiftUI = createStyledButton("Shift_Visual", "LOCK: OFF", UDim2.new(0.88, -shiftSize/2, startY + jumpSize*0.8, 0), UDim2.new(0, shiftSize, 0, shiftSize))
ShiftUI.BackgroundColor3 = Color3.fromRGB(150, 0, 0)
ShiftUI.TextLabel.TextSize = shiftSize * 0.2

local ShiftHitbox = Instance.new("TextButton")
ShiftHitbox.Size = UDim2.new(1,0,1,0)
ShiftHitbox.BackgroundTransparency = 1
ShiftHitbox.Text = ""
ShiftHitbox.ZIndex = 20
ShiftHitbox.Parent = ShiftUI

ShiftHitbox.MouseButton1Click:Connect(function()
    isShiftLock = not isShiftLock
    if isShiftLock then
        ShiftUI.TextLabel.Text = "LOCK: ON"
        ShiftUI.BackgroundColor3 = Color3.fromRGB(0, 150, 0)
    else
        ShiftUI.TextLabel.Text = "LOCK: OFF"
        ShiftUI.BackgroundColor3 = Color3.fromRGB(150, 0, 0)
    end
end)

RunService.RenderStepped:Connect(function()
    if isShiftLock then
        UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
        if player.Character and player.Character:FindFirstChild("HumanoidRootPart") then
            local lookVector = camera.CFrame.LookVector
            player.Character.HumanoidRootPart.CFrame = CFrame.new(player.Character.HumanoidRootPart.Position, player.Character.HumanoidRootPart.Position + Vector3.new(lookVector.X, 0, lookVector.Z))
        end
    end
end)

print("测试版 V2.9:Jump 按钮 UI 风格已与 WASD 完全统一。")

Features & Information

Pc Experience
#Controller

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts