Using BodyVelocity in Roblox
BodyVelocity is one of those deprecated physics objects that still shows up in a lot of older Roblox games. You might run into it when you're maintaining legacy code or exploring systems from 2020-era experiences. I have worked with enough of these older movement systems to know exactly where they break down, and I can tell you from direct experience that modern alternatives exist, but sometimes you need to understand the old way before you can properly replace it. The object applies a force to a Part to make it move at a specific velocity. You set the Velocity property to your target speed vector, and you configure MaxForce to determine how aggressively the system tries to reach that velocity. The internal math converts your desired velocity into an actual physical force applied every frame through the physics engine. I remember debugging a train system back in 2019 where we used BodyVelocity for the locomotion. The problem was that on servers with higher latency or lower physics tick rates, the train would overshoot its target speed and then oscillate wildly. The workaround was setting MaxForce to an extremely high vector value, something like Vector3.new(999999, 999999, 999999), and then relying on the Velocity property alone. This prevented the oscillation because the physics engine was applying maximum possible force every frame to reach the target.
How to Set It Up
You create a BodyVelocity instance inside a Part in your workspace, then set its properties in the Properties panel or through a script. The basic setup requires you to enable it and assign a velocity vector. For example, if you want an object to move forward at 50 studs per second, you set Velocity to Vector3.new(0, 0, 50). The MaxForce property determines the maximum force applied, so if your Part has high mass, you might need to increase MaxForce accordingly. Most beginners miss that MaxForce default value is extremely low, around Vector3.new(1000, 1000, 1000), which means heavier Parts won't reach their target velocity quickly or at all. I have seen countless cases where developers wonder why their elevator isn't moving fast enough, only to discover the MaxForce setting is far too low for the mass of the platform.
Common Problems and Edge Cases
One issue I encountered regularly involves BodyVelocity interacting with other physics objects. If you attach both BodyVelocity and a Motor6D or another constraint to the same Part, the results become unpredictable. The physics engine tries to resolve both simultaneously, and depending on the order of operations, you might get jittery movement or complete lockups. The safest approach is to remove conflicting constraints entirely rather than trying to make them work together. Another problem appears when you use BodyVelocity on Parts with CanCollide set to false. The physics system still applies forces, but since the Part doesn't interact with terrain or other objects, you might see floating movement that looks wrong in certain contexts. I spent an afternoon debugging a flying vehicle that kept clipping through the map, only to realize the collision detection was disabled on the main chassis.
Get the Full Details

Why You Should Consider Alternatives
BodyVelocity has been deprecated in favor of newer physics APIs, primarily VectorForce and LinearVelocity. These modern approaches give you more predictable behavior and better performance across different server configurations. VectorForce, for instance, lets you apply forces directly without the hidden conversion logic that BodyVelocity uses internally. LinearVelocity is even more straightforward if you just need to set a target speed without worrying about mass or force calculations. The main downside of BodyVelocity is that it uses older physics assumptions that don't always align with Roblox's current engine updates. You might notice slight differences in how objects behave after engine patches, which makes maintenance harder over time. If you are building something new, I would recommend using VectorForce instead, as it provides similar functionality with fewer surprises.
Practical Workaround for Legacy Systems
When you absolutely must use BodyVelocity, such as maintaining an old game that cannot be easily refactored, there are a few tricks that help stabilize the behavior. First, ensure your Part has consistent mass values across all instances, as varying masses cause different Parts to respond unpredictably to the same velocity settings. Second, avoid combining BodyVelocity with other velocity-affecting objects like BodyGyro or BodyThrust unless you fully understand how they interact. I once had to maintain a racing game where the vehicles used BodyVelocity for acceleration. The issue was that on certain maps with many collisions, the cars would occasionally spawn with incorrect velocities due to physics conflicts. The fix involved adding a small delay after respawn before enabling BodyVelocity, giving the physics engine time to settle. This reduced the incident rate from roughly one in every ten respawns to almost zero. Understanding BodyVelocity Roblox requires looking beyond the basic setup. The object works well for simple cases, but as soon as you introduce more complex physics interactions, the limitations become apparent. Modern alternatives exist for good reason, but knowing how the deprecated system functions helps when you encounter it in the wild.