FE Car Driving V2
Key RequiredUniversal

FE Car Driving V2

Universal ScriptPizzaScriptsPizzaScripts 2K views 2K executesUpdated Dec 24, 2025
5.0/ 5(4 votes)
40100% Positive
Lua Script•432 lines (12933 chars)
local player = game:GetService("Players").LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local rootPart = character:WaitForChild("HumanoidRootPart")
local userInputService = game:GetService("UserInputService")
local runService = game:GetService("RunService")

local drivingSpeed = 50
local turningSpeed = 3
local acceleration = 0.8
local deceleration = 1.2
local friction = 0.5
local isDriving = false
local originalWalkSpeed = 16
local originalJumpPower = 50

local carBase, bodyVelocity, bodyGyro, weld
local currentSpeed = 0
local targetRotation = 0

local keysPressed = {
	W = false,
	A = false,
	S = false,
	D = false
}

local screenGui = Instance.new("ScreenGui")
screenGui.Name = "DrivingGUI"
screenGui.ResetOnSpawn = false
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
screenGui.Parent = player:WaitForChild("PlayerGui")

local creditsFrame = Instance.new("Frame")
creditsFrame.Size = UDim2.new(0, 280, 0, 80)
creditsFrame.Position = UDim2.new(1, -300, 1, -100)
creditsFrame.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
creditsFrame.BorderSizePixel = 2
creditsFrame.BorderColor3 = Color3.fromRGB(100, 200, 255)
creditsFrame.ZIndex = 15
creditsFrame.Parent = screenGui

local creditsCorner = Instance.new("UICorner")
creditsCorner.CornerRadius = UDim.new(0, 10)
creditsCorner.Parent = creditsFrame

local creditsTitle = Instance.new("TextLabel")
creditsTitle.Size = UDim2.new(1, -30, 0, 25)
creditsTitle.Position = UDim2.new(0, 10, 0, 5)
creditsTitle.BackgroundTransparency = 1
creditsTitle.Text = "Script Credits"
creditsTitle.TextColor3 = Color3.fromRGB(100, 200, 255)
creditsTitle.TextSize = 16
creditsTitle.Font = Enum.Font.SourceSansBold
creditsTitle.TextXAlignment = Enum.TextXAlignment.Left
creditsTitle.ZIndex = 16
creditsTitle.Parent = creditsFrame

local creditsText = Instance.new("TextLabel")
creditsText.Size = UDim2.new(1, -30, 0, 45)
creditsText.Position = UDim2.new(0, 10, 0, 30)
creditsText.BackgroundTransparency = 1
creditsText.Text = "Idea by: FraudDeciever\nThank you for the concept!"
creditsText.TextColor3 = Color3.fromRGB(255, 255, 255)
creditsText.TextSize = 14
creditsText.Font = Enum.Font.SourceSans
creditsText.TextXAlignment = Enum.TextXAlignment.Left
creditsText.TextYAlignment = Enum.TextYAlignment.Top
creditsText.ZIndex = 16
creditsText.Parent = creditsFrame

local closeButton = Instance.new("TextButton")
closeButton.Size = UDim2.new(0, 25, 0, 25)
closeButton.Position = UDim2.new(1, -30, 0, 5)
closeButton.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
closeButton.BorderSizePixel = 0
closeButton.Text = "X"
closeButton.TextColor3 = Color3.fromRGB(255, 255, 255)
closeButton.TextSize = 16
closeButton.Font = Enum.Font.SourceSansBold
closeButton.ZIndex = 17
closeButton.Parent = creditsFrame

local closeCorner = Instance.new("UICorner")
closeCorner.CornerRadius = UDim.new(0, 6)
closeCorner.Parent = closeButton

closeButton.MouseButton1Click:Connect(function()
	creditsFrame:TweenPosition(
		UDim2.new(1, 20, 1, -100),
		Enum.EasingDirection.In,
		Enum.EasingStyle.Back,
		0.3,
		true,
		function()
			creditsFrame.Visible = false
		end
	)
end)

creditsFrame.Position = UDim2.new(1, 20, 1, -100)
task.wait(0.5)
creditsFrame:TweenPosition(
	UDim2.new(1, -300, 1, -100),
	Enum.EasingDirection.Out,
	Enum.EasingStyle.Back,
	0.5,
	true
)

local toggleButton = Instance.new("TextButton")
toggleButton.Size = UDim2.new(0, 150, 0, 60)
toggleButton.Position = UDim2.new(0.5, -75, 0.85, 0)
toggleButton.BackgroundColor3 = Color3.fromRGB(50, 150, 50)
toggleButton.BorderSizePixel = 3
toggleButton.BorderColor3 = Color3.fromRGB(255, 255, 255)
toggleButton.Text = "START DRIVING"
toggleButton.TextColor3 = Color3.fromRGB(255, 255, 255)
toggleButton.TextSize = 20
toggleButton.Font = Enum.Font.SourceSansBold
toggleButton.Modal = true
toggleButton.Active = true
toggleButton.ZIndex = 10
toggleButton.Parent = screenGui

local toggleCorner = Instance.new("UICorner")
toggleCorner.CornerRadius = UDim.new(0, 10)
toggleCorner.Parent = toggleButton

local speedometerFrame = Instance.new("Frame")
speedometerFrame.Size = UDim2.new(0, 200, 0, 80)
speedometerFrame.Position = UDim2.new(0.5, -100, 0, 20)
speedometerFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
speedometerFrame.BackgroundTransparency = 0.3
speedometerFrame.BorderSizePixel = 2
speedometerFrame.BorderColor3 = Color3.fromRGB(255, 255, 255)
speedometerFrame.Visible = false
speedometerFrame.ZIndex = 10
speedometerFrame.Parent = screenGui

local speedometerCorner = Instance.new("UICorner")
speedometerCorner.CornerRadius = UDim.new(0, 12)
speedometerCorner.Parent = speedometerFrame

local speedLabel = Instance.new("TextLabel")
speedLabel.Size = UDim2.new(1, 0, 0.6, 0)
speedLabel.Position = UDim2.new(0, 0, 0, 0)
speedLabel.BackgroundTransparency = 1
speedLabel.Text = "0"
speedLabel.TextColor3 = Color3.fromRGB(0, 255, 0)
speedLabel.TextSize = 36
speedLabel.Font = Enum.Font.SourceSansBold
speedLabel.ZIndex = 11
speedLabel.Parent = speedometerFrame

local unitLabel = Instance.new("TextLabel")
unitLabel.Size = UDim2.new(1, 0, 0.4, 0)
unitLabel.Position = UDim2.new(0, 0, 0.6, 0)
unitLabel.BackgroundTransparency = 1
unitLabel.Text = "Studs/Hour"
unitLabel.TextColor3 = Color3.fromRGB(200, 200, 200)
unitLabel.TextSize = 16
unitLabel.Font = Enum.Font.SourceSans
unitLabel.ZIndex = 11
unitLabel.Parent = speedometerFrame

local controlsFrame = Instance.new("Frame")
controlsFrame.Size = UDim2.new(0, 300, 0, 200)
controlsFrame.Position = UDim2.new(0, 20, 1, -220)
controlsFrame.BackgroundTransparency = 1
controlsFrame.Visible = false
controlsFrame.ZIndex = 5
controlsFrame.Parent = screenGui

local function createControlButton(text, position, size)
	local button = Instance.new("TextButton")
	button.Size = size or UDim2.new(0, 80, 0, 80)
	button.Position = position
	button.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
	button.BackgroundTransparency = 0.3
	button.BorderSizePixel = 2
	button.BorderColor3 = Color3.fromRGB(200, 200, 200)
	button.Text = text
	button.TextColor3 = Color3.fromRGB(255, 255, 255)
	button.TextSize = 24
	button.Font = Enum.Font.SourceSansBold
	button.Modal = true
	button.Active = true
	button.ZIndex = 10
	button.Parent = controlsFrame
	
	local corner = Instance.new("UICorner")
	corner.CornerRadius = UDim.new(0, 12)
	corner.Parent = button
	
	return button
end

local upButton = createControlButton("W", UDim2.new(0, 110, 0, 0))
local leftButton = createControlButton("A", UDim2.new(0, 20, 0, 90))
local downButton = createControlButton("S", UDim2.new(0, 110, 0, 90))
local rightButton = createControlButton("D", UDim2.new(0, 200, 0, 90))

local function setupMobileButton(button, key)
	local isPressed = false
	
	button.MouseButton1Down:Connect(function()
		isPressed = true
		keysPressed[key] = true
		button.BackgroundColor3 = Color3.fromRGB(100, 200, 100)
	end)
	
	button.MouseButton1Up:Connect(function()
		isPressed = false
		keysPressed[key] = false
		button.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
	end)
	
	button.InputBegan:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.Touch then
			isPressed = true
			keysPressed[key] = true
			button.BackgroundColor3 = Color3.fromRGB(100, 200, 100)
		end
	end)
	
	button.InputEnded:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.Touch then
			isPressed = false
			keysPressed[key] = false
			button.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
		end
	end)
	
	button.MouseLeave:Connect(function()
		if isPressed then
			isPressed = false
			keysPressed[key] = false
			button.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
		end
	end)
end

setupMobileButton(upButton, "W")
setupMobileButton(leftButton, "A")
setupMobileButton(downButton, "S")
setupMobileButton(rightButton, "D")

local function createCarBase()
	if carBase then
		pcall(function() carBase:Destroy() end)
	end
	
	carBase = Instance.new("Part")
	carBase.Name = "CarBase"
	carBase.Size = Vector3.new(6, 1, 10)
	carBase.Transparency = 1
	carBase.CanCollide = false
	carBase.Anchored = false
	carBase.CFrame = rootPart.CFrame
	carBase.Parent = workspace

	bodyVelocity = Instance.new("BodyVelocity")
	bodyVelocity.MaxForce = Vector3.new(100000, 0, 100000)
	bodyVelocity.Velocity = Vector3.new(0, 0, 0)
	bodyVelocity.Parent = carBase

	bodyGyro = Instance.new("BodyGyro")
	bodyGyro.MaxTorque = Vector3.new(0, 100000, 0)
	bodyGyro.P = 10000
	bodyGyro.Parent = carBase

	weld = Instance.new("Weld")
	weld.Part0 = carBase
	weld.Part1 = rootPart
	weld.C0 = CFrame.new(0, 3, 0)
	weld.Parent = carBase
	
	local yRotation = select(1, rootPart.CFrame:ToEulerAnglesYXZ())
	targetRotation = yRotation
end

local function toggleDriving()
	isDriving = not isDriving
	
	if isDriving then
		createCarBase()
		
		task.wait(0.05)
		
		humanoid.WalkSpeed = 0
		humanoid.JumpPower = 0
		humanoid.Sit = true
		
		toggleButton.Text = "STOP DRIVING"
		toggleButton.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
		controlsFrame.Visible = true
		speedometerFrame.Visible = true
	else
		if carBase then
			pcall(function() carBase:Destroy() end)
			carBase = nil
		end
		
		task.wait(0.05)
		
		humanoid.Sit = false
		humanoid.WalkSpeed = originalWalkSpeed
		humanoid.JumpPower = originalJumpPower
		
		currentSpeed = 0
		
		toggleButton.Text = "START DRIVING"
		toggleButton.BackgroundColor3 = Color3.fromRGB(50, 150, 50)
		controlsFrame.Visible = false
		speedometerFrame.Visible = false
		
		for key, _ in pairs(keysPressed) do
			keysPressed[key] = false
		end
		
		upButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
		leftButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
		downButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
		rightButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
	end
end

toggleButton.Activated:Connect(function()
	toggleDriving()
end)

userInputService.InputBegan:Connect(function(input, gameProcessed)
	if gameProcessed then return end
	
	if input.KeyCode == Enum.KeyCode.E then
		toggleDriving()
	end
	
	if input.KeyCode == Enum.KeyCode.W then keysPressed.W = true end
	if input.KeyCode == Enum.KeyCode.A then keysPressed.A = true end
	if input.KeyCode == Enum.KeyCode.S then keysPressed.S = true end
	if input.KeyCode == Enum.KeyCode.D then keysPressed.D = true end
end)

userInputService.InputEnded:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.W then keysPressed.W = false end
	if input.KeyCode == Enum.KeyCode.A then keysPressed.A = false end
	if input.KeyCode == Enum.KeyCode.S then keysPressed.S = false end
	if input.KeyCode == Enum.KeyCode.D then keysPressed.D = false end
end)

local lastPosition = nil
local lastTime = tick()

local connection = runService.Heartbeat:Connect(function(deltaTime)
	if not isDriving or not carBase or not bodyVelocity or not bodyGyro then return end
	
	if keysPressed.W then
		currentSpeed = math.min(currentSpeed + acceleration, drivingSpeed)
	elseif keysPressed.S then
		currentSpeed = math.max(currentSpeed - deceleration, -drivingSpeed * 0.5)
	else
		if currentSpeed > 0 then
			currentSpeed = math.max(currentSpeed - friction, 0)
		elseif currentSpeed < 0 then
			currentSpeed = math.min(currentSpeed + friction, 0)
		end
	end
	
	if keysPressed.A then
		targetRotation = targetRotation + turningSpeed * deltaTime
	end
	if keysPressed.D then
		targetRotation = targetRotation - turningSpeed * deltaTime
	end
	
	bodyGyro.CFrame = CFrame.Angles(0, targetRotation, 0)
	
	local direction = bodyGyro.CFrame.LookVector
	bodyVelocity.Velocity = direction * currentSpeed
	
	local currentTime = tick()
	local currentPosition = carBase.Position
	
	if lastPosition then
		local distanceTraveled = (currentPosition - lastPosition).Magnitude
		local timeDelta = currentTime - lastTime
		
		if timeDelta > 0 then
			local studsPerSecond = distanceTraveled / timeDelta
			local displaySpeed = math.floor(studsPerSecond)
			displaySpeed = math.clamp(displaySpeed, 0, 60)
			
			speedLabel.Text = string.format("%d", displaySpeed)
			
			if displaySpeed < 20 then
				speedLabel.TextColor3 = Color3.fromRGB(0, 255, 0)
			elseif displaySpeed < 40 then
				speedLabel.TextColor3 = Color3.fromRGB(255, 255, 0)
			else
				speedLabel.TextColor3 = Color3.fromRGB(255, 0, 0)
			end
		end
	end
	
	lastPosition = currentPosition
	lastTime = currentTime
	
	if carBase and carBase.Parent then
		carBase.CFrame = CFrame.new(carBase.Position.X, carBase.Position.Y, carBase.Position.Z) * CFrame.Angles(0, targetRotation, 0)
	end
end)

player.CharacterAdded:Connect(function(newChar)
	character = newChar
	humanoid = character:WaitForChild("Humanoid")
	rootPart = character:WaitForChild("HumanoidRootPart")
	
	isDriving = false
	currentSpeed = 0
	
	if carBase then
		pcall(function() carBase:Destroy() end)
		carBase = nil
	end
	
	toggleButton.Text = "START DRIVING"
	toggleButton.BackgroundColor3 = Color3.fromRGB(50, 150, 50)
	controlsFrame.Visible = false
	speedometerFrame.Visible = false
end)

Features & Information

-Studs per hour -mobile keyboard to steer -start driving -stop driving
#Robox#Universal#Pizza#Car#Mobile

Community Comments (7)

RealCalemorerRealCalemorerDec 24, 2025

WORKS AMAZING ON XENO + no key = 11/10 KEEP UP THE GOOD WORK!!!

RealCalemorerRealCalemorerDec 24, 2025

Can u make it so u can increase and decrease the speed pls? :3

Replying to @RealCalemorer
PizzaScriptsPizzaScriptsDec 24, 2025

@RealCalemorer I'll try to code that!

joeyloljoeylolDec 27, 2025

please add car psychics (falling and bumping system)

joeyloljoeylolDec 27, 2025

@pizzascripts

joeyloljoeylolDec 27, 2025

also very cool

MrRigMrRigMay 31, 2026

This script was the one that inspired me to make my car scripts

More Scripts for Universal Scripts