# How can I implement automatic gear shifting in a basic vehicle seat car?

Title says it all, I can’t find an simple example or tutorial that explains how to do this. I only know that there is `RPM`, and `Gear` variables involved.

1 Like

Perhaps you could take a look at how A-Chassis does it, in the “Drive” localscript.

I already looked at it, and I had hard time finding what I was looking for, so I decided to ask here first because perhaps someone would know how to instead of having to figure out how the drive script works. But if nobody will have an answer then I suppose I won’t have a choice.

After some extensive research on Google, I found Stack Exchange and Unity forum post.

But I am still not sure how I can get wheel RPM, and how to make automatic gear shifting. Right now I just have this:

``````-- Radians per second to revolutions per minute
local function rpsToRPM(rps: number)
return rps * 9.5493 * 4 -- extra * is for "weight" to simulate RPM
end

function Transmission:calcAverageDriveWheelsRPM()
self = self :: TransmissionMetatable

local leftWheelRPM = rpsToRPM(self.driveWheels[1].AssemblyAngularVelocity.Magnitude)
local rightWheelRPM = rpsToRPM(self.driveWheels[2].AssemblyAngularVelocity.Magnitude)

return (leftWheelRPM + rightWheelRPM) / 2
end

function Transmission:computeGear()
self = self :: TransmissionMetatable

if self.currentEngineRPM >= self.maxEngineRPM then
for i = 1, #self.gearRatio do
if self:calcAverageDriveWheelsRPM() * self.gearRatio[i] < self.maxEngineRPM then
self.currentGear = i
break
end
end
end

if self.currentEngineRPM <= self.minEngineRPM then
for i = 1, #self.gearRatio do
if self:calcAverageDriveWheelsRPM() * self.gearRatio[i] > self.minEngineRPM then
self.currentGear = i
break
end
end
end
end
``````
1 Like

RPM and torque are inversely proportional. You’d get your hinge and modify its RPM and max torque based on that.

1 Like