§ How to · with Picoo
How to make a drivable car in Roblox Studio
By Sametcan Tasgiran, Founder & Developer·Published ·Updated
Almost every "Roblox car" tutorial ends the same way: the model looks right, you sit in it, and it does not move.
Constraint-based chassis need physically exact assembly. This one drives kinematically instead — fewer ways to be subtly wrong, and it works on a fresh baseplate.
Sit and drive
Walk up, ProximityPrompt appears, sit, WASD. No setup steps in between.
Kinematic movement
Velocity is applied from the driver's client, which owns the vehicle's physics while seated — so it responds instantly and does not fight the server.
Steering that turns the body
A/D rotate the chassis rather than steering wheels that may or may not be welded correctly.
Top speed and accel
Constants at the top of the builder — change two numbers, not a constraint graph.
Exits cleanly
Leaving the seat stops the drive loop; the car does not keep coasting into the horizon.
Files Picoo ships for this prompt
2 files · 125 lines · ~25s · 1 credit
CarBuilder
Builds the chassis, seat, wheels and prompt in Workspace.Car.
86 lines
VehicleDriver
Reads WASD on the driver's client and applies velocity while seated.
39 lines
Sample output: StarterPlayer.StarterPlayerScripts.VehicleDriver
-- Driving runs on the DRIVER'S client. While a player is seated, their client
-- owns that assembly's physics — pushing it from the server means two
-- simulations disagreeing, which is what rubber-banding actually is.
local seat = -- the VehicleSeat the local player occupies
RunService.RenderStepped:Connect(function()
if not seated then return end
local throttle = 0
if UserInputService:IsKeyDown(Enum.KeyCode.W) then throttle += 1 end
if UserInputService:IsKeyDown(Enum.KeyCode.S) then throttle -= 1 end
local steer = 0
if UserInputService:IsKeyDown(Enum.KeyCode.A) then steer += 1 end
if UserInputService:IsKeyDown(Enum.KeyCode.D) then steer -= 1 end
-- Turn the body, then push it along its own look vector.
if steer ~= 0 and throttle ~= 0 then
seat.CFrame = seat.CFrame * CFrame.Angles(0, math.rad(steer * TURN_RATE), 0)
end
seat.AssemblyLinearVelocity = seat.CFrame.LookVector * (throttle * TOP_SPEED)
end)Building a drivable car in Roblox Studio
"Make me a car" is one of the most common Roblox requests and one of the most common disappointments. The reason is specific: a constraint-based chassis has to be assembled physically exactly — driven wheels on motorised HingeConstraints, attachments aligned, nothing rigidly welded in the drive path. Get one weld wrong and the model still looks perfect in the viewport, still lets you sit down, and simply refuses to move. There is no error message to search for.
That failure is why Picoo builds the car kinematically instead. The seat is a VehicleSeat, the wheels are decoration, and movement comes from applying velocity along the chassis's own look vector while someone is sitting in it. Steering rotates the body rather than turning wheels that may or may not be connected. It is less physically authentic than a real suspension chassis, and it drives — on a fresh baseplate, on your existing place, without tuning.
The drive loop lives on the driver's client on purpose. When a player sits in a vehicle, network ownership of that assembly moves to them; pushing the same parts from the server at the same time means two simulations fighting, which is exactly the rubber-banding that gets described as "laggy vehicles". Validate on the server, move where the ownership is.
Tuning is two constants at the top of the builder: top speed and turn rate. If you later want real suspension, the chassis is ordinary parts — you can replace the drive loop with constraints without rebuilding the model.
See more on the Luau generator, the game builder, or browse the full blog.
Frequently asked
Why doesn't my Roblox car move when I sit in it?+
The usual cause is the drive wheels being welded rigid. A constraint chassis needs HingeConstraints (or CylindricalConstraints) with a motor actuation on the driven wheels; a WeldConstraint anywhere in that chain locks them and the car sits there revving. It is invisible in the viewport, which is why it is such a common dead end.
Constraints or kinematic — which should I use?+
Constraints give you real suspension and physical collisions, and they are worth it for a racing game you will tune for weeks. For a car that just needs to drive, kinematic is far more reliable: there is no assembly to get subtly wrong, and it behaves the same on every place.
Why is the driving code on the client?+
Because network ownership of a seated vehicle assembly goes to the driver. Applying velocity from the server means the server and the client are both simulating the same parts with different inputs — the result is the rubber-banding people describe as "laggy cars".
How do I change the speed?+
Two constants at the top of the builder: top speed and turn rate. No constraint tuning, no MaxForce balancing.
Can other players ride along?+
Yes — add passenger Seats to the chassis. Only the VehicleSeat drives; the rest are ordinary seats that come along with the assembly.
Related Picoo prompts
Roblox simulator
8 files · 240 lines · 58 seconds · 1 credit. Tap, earn, rebirth, repeat.
Roblox obby
The whole course lands in Explorer in EDIT mode — visible, movable, saveable before you ever press Play — and every jump is checked against what a default Roblox character can actually clear.
Roblox currency system
4 files · 150 lines · 44 seconds · 1 credit. Cash + Gems + premium currency by default.