§ 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
Press Play, walk into the VehicleSeat to sit, then W/S for throttle and A/D to steer. The driver script reads the seat's Throttle and Steer values.
Kinematic movement
Every frame the driver's client sets the car's AssemblyLinearVelocity along its look vector and keeps the vertical part, so gravity still works. The seated player's client owns the car's physics, so it responds at once and does not fight the server.
Steering turns the body
A/D set the car's angular velocity around its vertical axis, only while it is moving and reversed when backing up. The four wheels are welded decoration.
Speed in two constants
TOP_SPEED (55) and TURN_SPEED (2.4) sit at the top of the VehicleDriver script. Top speed, turn speed, body colour and spawn point can also be set in the prompt.
Resets if it falls
If the chassis drops below Y = -50, the server moves the car back to its spawn point and stops it. The builder also removes any existing Workspace.Car first, so re-runs never stack a second car.
Files Picoo ships for this prompt
2 files · 123 lines · one recipe call
ServerScriptService.CarBuilder
Server Script that builds Workspace.Car when the game starts: chassis, VehicleSeat and four cosmetic wheels welded into one unanchored assembly, plus the fall reset.
85 lines
StarterPlayer.StarterPlayerScripts.VehicleDriver
Reads the VehicleSeat's Throttle and Steer on the driver's client and sets the car's velocity. It drives any VehicleSeat the player sits in.
38 lines
Sample output: StarterPlayer.StarterPlayerScripts.VehicleDriver
--!strict
-- Generated by Picoo recipe: drivable_car (client driver)
-- Lives in StarterPlayerScripts. Whenever THIS player sits in a VehicleSeat,
-- read its Throttle/Steer and move the car kinematically. Works for any
-- VehicleSeat assembly, not just the one above.
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local player = Players.LocalPlayer
local TOP_SPEED = 55
local TURN_SPEED = 2.4
RunService.RenderStepped:Connect(function()
local char = player.Character
local humanoid = char and char:FindFirstChildOfClass("Humanoid")
if not humanoid then return end
local seatPart = humanoid.SeatPart
if not seatPart or not seatPart:IsA("VehicleSeat") then return end
-- find the assembly root (PrimaryPart of the car model, or the seat)
local model = seatPart:FindFirstAncestorOfClass("Model")
local root: BasePart = (model and model.PrimaryPart) or seatPart
if not root then return end
local throttle = seatPart.Throttle -- -1..1
local steer = seatPart.Steer -- -1..1
-- preserve vertical velocity (gravity) so the car stays grounded/can fall
local vy = root.AssemblyLinearVelocity.Y
root.AssemblyLinearVelocity = root.CFrame.LookVector * (throttle * TOP_SPEED) + Vector3.new(0, vy, 0)
-- only turn while moving, scaled by throttle direction for natural steering
if math.abs(throttle) > 0.05 then
root.AssemblyAngularVelocity = Vector3.new(0, -steer * TURN_SPEED * (throttle >= 0 and 1 or -1), 0)
else
root.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
end
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 setting the car's velocity along its own look vector while someone is sitting in it. Steering spins the whole body with angular velocity 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 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". So the velocity is set where the ownership is.
Tuning is two constants at the top of the VehicleDriver script: TOP_SPEED and TURN_SPEED. The car itself is ordinary Parts held together with WeldConstraints, so if you later want real suspension, ask for it in a follow-up prompt.
See more on the Luau generator, the AI Luau script writer, the 3D model generator and the game builder, read how Picoo compares with ChatGPT, 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 motor, hinge or wheel alignment to get subtly wrong.
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?+
Edit TOP_SPEED and TURN_SPEED at the top of the VehicleDriver LocalScript (55 and 2.4 by default), or ask for a different top speed in the prompt. No constraint tuning, no MaxForce balancing.
Can other players ride along?+
The recipe builds one VehicleSeat for the driver. Ask for passenger seats in a follow-up prompt: plain Seats welded to the chassis ride along with the assembly, and only the VehicleSeat drives.
Related Picoo prompts
Roblox simulator
5 files · 1,158 lines · one recipe call. Collect orbs, buy upgrades, rebirth for a bigger multiplier.
Roblox obby
The whole course lands in Explorer in EDIT mode — visible, movable, saveable before you ever press Play — and every gap is spaced for what a default Roblox character can actually clear.
Roblox currency system
Example build: 4 files · 165 lines. Cash, Gems and a premium currency.