Run it
Copy the script and paste it into your executor.
local Players = game:GetService("Players")
local RunService = :()
UserInputService = :()
player = Players.LocalPlayer
playerScripts = player:()
controls = (playerScripts:()):()
BIND_NAME =
DEADZONE =
SNAP_THRESHOLD =
humanoid
()
character = player.Character player.CharacterAdded:()
character:()
()
RunService:(BIND_NAME)
(vector)
flat = .(vector.X, , vector.Z)
flat.Magnitude > flat.Unit .zero
(x, z)
sx = .(x) > SNAP_THRESHOLD (x > -)
sz = .(z) > SNAP_THRESHOLD (z > -)
vector = .(sx, , sz)
vector.Magnitude > vector.Unit .zero
(character)
()
humanoid = character:()
UserInputService.TouchEnabled
RunService:(BIND_NAME, .RenderPriority.Input.Value + , ()
humanoid humanoid.Parent
()
camera = .CurrentCamera
camera
move = controls:()
move.Magnitude <= DEADZONE
forward = (camera.CFrame.LookVector)
right = (camera.CFrame.RightVector)
forward == .zero right == .zero
snapped = (move.X, move.Z)
finalMove
snapped ~= .zero
finalMove = (right * snapped.X) - (forward * snapped.Z)
finalMove = (right * move.X) - (forward * move.Z)
finalMove.Magnitude >
humanoid:(finalMove.Unit, )
)
player.CharacterAdded:(hookCharacter)
player.Character
(player.Character)
humanoid = ()
RunService.RenderStepped:(()
UserInputService.TouchEnabled
humanoid humanoid.Parent
camera = .CurrentCamera
camera
move = humanoid.MoveDirection
move.Magnitude <
forward = (camera.CFrame.LookVector)
right = (camera.CFrame.RightVector)
forward == .zero right == .zero
x = move:(right)
z = move:(forward)
snapped = (x, z)
snapped == .zero
finalMove = (right * snapped.X) + (forward * snapped.Z)
finalMove.Magnitude >
humanoid:(finalMove.Unit, )
)Just a silly script I put together. It makes your joystick behave more like WASD on a keyboard. It also supports proper diagonal movement, so inputs combine the same way WASD does.

Universal