Quick answer: Enable the Chaos Physics plugin, assign a Physics Asset with per-bone wheel masses, ensure wheel bone names in WheelSetup exactly match the skeleton, bind input to SetThrottleInput/SetSteeringInput/SetBrakeInput, and call SetSimulatePhysics(true) after the vehicle spawns on solid ground.
You drop a Chaos Vehicle pawn into the level, press Play, hit the gas — and nothing happens. The vehicle sits there like a very expensive rock. Chaos Vehicle debugging is notorious for producing zero error messages when something in the setup chain is wrong, which makes it uniquely difficult for developers who are new to Unreal’s physics system. The good news is that the failure modes are well-understood and the fixes are mechanical once you know the checklist.
Step 1: Confirm the Chaos Physics Plugin Is Enabled
The ChaosVehicleMovementComponent depends on the ChaosVehiclesPlugin, which is separate from the base Chaos Physics system. If this plugin is not enabled, the component will appear in the editor but will silently do nothing at runtime.
Open Edit → Plugins, search for “Chaos Vehicles”, and confirm it is enabled. Then verify the .uproject file reflects this:
// MyProject.uproject — required plugin entries
{
"Plugins": [
{ "Name": "ChaosVehiclesPlugin", "Enabled": true },
{ "Name": "PhysicsCore", "Enabled": true }
]
}
Restart the editor and regenerate project files after changing the .uproject. Incremental builds can miss plugin registration changes.
Step 2: Fix the Physics Asset
A Chaos Vehicle’s skeletal mesh must have a Physics Asset where each wheel bone has a collision body (typically a sphere or short capsule), physics simulation enabled on those bones, and mass set per bone to realistic values. Without this, the solver has no contact geometry for the wheels and the vehicle can’t push against the ground.
Open the Physics Asset editor for your vehicle mesh. Check that:
- Each of the four wheel bones has a primitive body (sphere recommended for wheels).
- The body’s Physics Type is set to Simulated, not Kinematic.
- The root body (chassis) has a convex hull or box that covers the vehicle body.
- Mass is set on the chassis body — a value of 1500–2000 kg is typical for a car-sized vehicle.
“If the Physics Asset has no bodies at all, Chaos will create a single box collider for the entire mesh, which prevents per-wheel simulation entirely.”
Step 3: Match Wheel Bone Names Exactly
The ChaosVehicleMovementComponent stores wheel configuration in a WheelSetups array. Each entry contains a BoneName that must exactly match a bone name in the skeletal mesh hierarchy — including capitalisation and underscores. A mismatch produces no error; the wheel is simply ignored and the vehicle has fewer (or zero) driven wheels.
// In the vehicle pawn constructor (C++)
UChaosVehicleMovementComponent* VehicleMovement =
CreateDefaultSubobject<UChaosWheeledVehicleMovementComponent>(
TEXT("ChaosVehicleMovement")
);
FChaosWheelSetup WheelFL;
WheelFL.WheelClass = UMyWheelFront::StaticClass();
WheelFL.BoneName = FName("wheel_front_left"); // Must match skeleton exactly
WheelFL.AdditionalOffset = FVector(0.f, 0.f, 0.f);
VehicleMovement->WheelSetups.Add(WheelFL);
// Repeat for wheel_front_right, wheel_rear_left, wheel_rear_right
To verify bone names, open the skeletal mesh in the Skeleton editor and expand the bone hierarchy in the Skeleton Tree panel. Copy the names verbatim — do not rely on memory or DCC tool bone names, which often differ from what Unreal imported.
Step 4: Wire Input to the Movement Component
The Chaos Vehicle movement component does not read raw axis input automatically. Your pawn must explicitly pass input values to SetThrottleInput, SetBrakeInput, and SetSteeringInput. A common mistake is binding input to a Blueprint variable or calling AddMovementInput (which works for Character movement, not vehicles).
// In SetupPlayerInputComponent (C++)
void AMyVehiclePawn::SetupPlayerInputComponent(
UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAxis(
TEXT("Throttle"), this, &AMyVehiclePawn::ApplyThrottle);
PlayerInputComponent->BindAxis(
TEXT("Steering"), this, &AMyVehiclePawn::ApplySteering);
}
void AMyVehiclePawn::ApplyThrottle(float Val)
{
GetVehicleMovementComponent()->SetThrottleInput(Val);
}
void AMyVehiclePawn::ApplySteering(float Val)
{
GetVehicleMovementComponent()->SetSteeringInput(Val);
}
If you’re using Enhanced Input (UE 5.1+), map the IA_Throttle and IA_Steering input actions to the same functions. Ensure the Input Mapping Context is added to the player controller in BeginPlay or on possession.
Step 5: Fix Spawn Height and Simulate Physics Timing
Chaos vehicles must be on solid ground with physics simulation active when the first physics tick runs. If the vehicle spawns slightly above the surface (a very common level-editing artefact), the first few ticks may complete before the vehicle settles, leading to a state where the wheel sweep finds no contact and the engine torque has nothing to push against.
Two fixes work together here. First, place the vehicle spawn point so it is fractionally embedded in the ground (a Z offset of −2 to −5 cm), not floating. Second, call SetSimulatePhysics explicitly after placement rather than relying on the default constructor state:
void AMyVehiclePawn::BeginPlay()
{
Super::BeginPlay();
// Ensure the skeletal mesh simulates physics after spawn
if (USkeletalMeshComponent* Mesh = GetMesh())
{
Mesh->SetSimulatePhysics(true);
Mesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
}
}
If you spawn the vehicle from a Blueprint or a Game Mode, also confirm that the spawn transform is not being overridden to a height that puts the vehicle airborne.
Minimum Working Configuration
When starting from scratch or debugging a completely inert vehicle, strip the setup to the minimum and verify each layer before adding complexity. The absolute minimum for a working Chaos Vehicle is:
- Skeletal Mesh with a valid Physics Asset (bodies on chassis and all four wheel bones).
- ChaosWheeledVehicleMovementComponent added to the pawn.
- Four WheelSetup entries with BoneName values matching the skeleton.
- Input bindings calling
SetThrottleInputandSetSteeringInput. - Vehicle spawned on a flat surface with
SetSimulatePhysics(true)called inBeginPlay. - ChaosVehiclesPlugin enabled in the project.
Once the vehicle moves on flat ground, add engine config, differential, suspension, and aerodynamics one section at a time. Each addition is a potential new failure point, and isolating them one by one is far faster than debugging the full configuration at once. Bug reports from playtesters describing “the car just doesn’t move” on specific hardware often trace back to Physics Asset problems; capturing system specs automatically via Bugnet helps correlate physics issues with GPU/CPU configurations.
A vehicle that doesn’t move is just an expensive static mesh — always start with the plugin, then the Physics Asset.