Hello all! Back again with another question. I have created a vehicle using bodygyro, bodyposition,etc. I used the scripts from the jeep model on the race prebuilt map and modified them slightly to meet my needs. Basically I am creating a gearing system for my vehicles. Depending on what gear you are in, depends on how fast you are able to go. So far I have everything working, the vehicle drives, turns, and even can shift gears. However, my issue is that the vehicle accelerates very quickly, almost max speed instantly. My shifting script is based on speed, if you aren't going fast enough to shift gears, it won't let you, but being as the vehicle accelerates instantly, players can just spam the shift gear button and would defeat the purpose of shifting.
I'm basically trying to figure out how to make the velocity of the vehicle take time to reach its max. I know about MaxThrust, MaxTorque, and MaxForce, however with the Jeep script, editing any value also affects the turning. I was able to make the script slowly accelerate by editing the Lerp value, however that also made the turning wonky, causing it to go really fast while turning, or not turn at all. My question is what values do I need to be adjusting, need to add into the current script, to make it not accelerate to max speed instantly? I know about D and P aswell, but changing those values didn't affect anything. My assumption is because those values are used in relation to destination. Obviously a vehicle driving around has no set destination, therefor it can't damper it.
LocalCarScript
--local camera = game.Workspace.CurrentCamera local player = game.Players.LocalPlayer local character = player.Character local humanoidRootPart = character.HumanoidRootPart local car = script:WaitForChild("Car").Value local stats = car:WaitForChild("Configurations") local Raycast = require(car.CarScript.RaycastModule) local object = car.Chassis -- your object here local gear = stats.Gear --local cameraType = Enum.CameraType.Follow local movement = Vector2.new() local gamepadDeadzone = 0.14 car.DriveSeat.Changed:connect(function(property) if property == "Steer" then movement = Vector2.new(car.DriveSeat.Steer, movement.Y) elseif property == "Throttle" then movement = Vector2.new(movement.X, car.DriveSeat.Throttle) end end) -- Input begin --game:GetService("UserInputService").InputBegan:connect(function(inputObject, gameProcessedEvent) -- if not gameProcessedEvent then -- if inputObject.KeyCode == Enum.KeyCode.W then -- movement = Vector2.new(movement.X, 1) -- elseif inputObject.KeyCode == Enum.KeyCode.A then -- movement = Vector2.new(-1, movement.Y) -- elseif inputObject.KeyCode == Enum.KeyCode.S then -- movement = Vector2.new(movement.X, -1) -- elseif inputObject.KeyCode == Enum.KeyCode.D then -- movement = Vector2.new(1, movement.Y) -- end -- end --end) -- --game:GetService("UserInputService").InputChanged:connect(function(inputObject, gameProcessedEvent) -- --if not gameProcessedEvent then -- if inputObject.KeyCode == Enum.KeyCode.Thumbstick1 then -- --Gamepad support because yay -- if inputObject.Position.magnitude >= gamepadDeadzone then -- movement = Vector2.new(movement.X, inputObject.Position.Y) -- else -- movement = Vector2.new(movement.X, 0) -- end -- elseif inputObject.KeyCode == Enum.KeyCode.Thumbstick2 then -- if inputObject.Position.magnitude >= gamepadDeadzone then -- movement = Vector2.new(inputObject.Position.X, movement.Y) -- else -- movement = Vector2.new(0, movement.Y) -- end -- end -- --end --end) -- ---- Input end --game:GetService("UserInputService").InputEnded:connect(function(inputObject, gameProcessedEvent) -- if inputObject.KeyCode == Enum.KeyCode.W then -- if movement.Y == 1 then -- movement = Vector2.new(movement.X, 0) -- end -- elseif inputObject.KeyCode == Enum.KeyCode.A then -- if movement.X == -1 then -- movement = Vector2.new(0, movement.Y) -- end -- elseif inputObject.KeyCode == Enum.KeyCode.S then -- if movement.Y == -1 then -- movement = Vector2.new(movement.X, 0) -- end -- elseif inputObject.KeyCode == Enum.KeyCode.D then -- if movement.X == 1 then -- movement = Vector2.new(0, movement.Y) -- end -- end --end) local force = 0 local damping = 0 local mass = 0 for i, v in pairs(car:GetChildren()) do if v:IsA("BasePart") then mass = mass + (v:GetMass() * 196.2) end end force = mass * stats.Suspension.Value damping = force / stats.Bounce.Value local bodyVelocity = Instance.new("BodyVelocity", car.Chassis) bodyVelocity.velocity = Vector3.new(0, 0, 0) bodyVelocity.maxForce = Vector3.new(0, 0, 0) local bodyAngularVelocity = Instance.new("BodyAngularVelocity", car.Chassis) bodyAngularVelocity.angularvelocity = Vector3.new(0, 0, 0) bodyAngularVelocity.maxTorque = Vector3.new(0, 0, 0) local rotation = 0 local function UpdateThruster(thruster) --Make sure we have a bodythrust to move the wheel local bodyThrust = thruster:FindFirstChild("BodyThrust") if not bodyThrust then bodyThrust = Instance.new("BodyThrust", thruster) end --Do some raycasting to get the height of the wheel local hit, position = Raycast.new(thruster.Position, thruster.CFrame:vectorToWorldSpace(Vector3.new(0, -1, 0)) * stats.Height.Value) local thrusterHeight = (position - thruster.Position).magnitude if hit and hit.CanCollide then --If we're on the ground, apply some forces to push the wheel up bodyThrust.force = Vector3.new(0, ((stats.Height.Value - thrusterHeight)^2) * (force / stats.Height.Value^2), 0) local thrusterDamping = thruster.CFrame:toObjectSpace(CFrame.new(thruster.Velocity + thruster.Position)).p * damping bodyThrust.force = bodyThrust.force - Vector3.new(0, thrusterDamping.Y, 0) else bodyThrust.force = Vector3.new(0, 0, 0) end end --Shifting Function function onKeyPress(inputObject, gameProcessedEvent) if inputObject.KeyCode == Enum.KeyCode.E then if character.Humanoid.SeatPart == car.DriveSeat then if gear.Value < 18 then gear.Value = gear.Value + 1 print(gear.Value) end end elseif inputObject.KeyCode == Enum.KeyCode.Q then if character.Humanoid.SeatPart == car.DriveSeat then if gear.Value > 0 and gear.Value <= 18 then gear.Value = gear.Value - 1 print(gear.Value) end end end end game:GetService("UserInputService").InputBegan:connect(onKeyPress) --A simple function to check if the car is grounded local function IsGrounded() local hit, position = Raycast.new((car.Chassis.CFrame * CFrame.new(0, 0, (car.Chassis.Size.Z / 2) - 1)).p, car.Chassis.CFrame:vectorToWorldSpace(Vector3.new(0, -1, 0)) * (stats.Height.Value + 0.2)) if hit and hit.CanCollide then return(true) end return(false) end --local oldCameraType = camera.CameraType --camera.CameraType = cameraType --spawn(function() while game:GetService("RunService").Heartbeat:wait() and car:FindFirstChild("DriveSeat") and character.Humanoid.SeatPart == car.DriveSeat do --game:GetService("RunService").RenderStepped:wait() if IsGrounded() then if movement.Y ~= 0 then local velocity = humanoidRootPart.CFrame.lookVector * movement.Y * stats.Speed.Value humanoidRootPart.Velocity = humanoidRootPart.Velocity:Lerp(velocity, 0.1) bodyVelocity.maxForce = Vector3.new(0, 0, 0) else bodyVelocity.maxForce = Vector3.new(mass / 2, mass / 4, mass / 2) end local rotVelocity = humanoidRootPart.CFrame:vectorToWorldSpace(Vector3.new(movement.Y * stats.Speed.Value / 50, 0, -humanoidRootPart.RotVelocity.Y * 5 * movement.Y)) local speed = -humanoidRootPart.CFrame:vectorToObjectSpace(humanoidRootPart.Velocity).unit.Z rotation = rotation + math.rad((-stats.Speed.Value / 500) * movement.Y) if math.abs(speed) > 0.1 then rotVelocity = rotVelocity + humanoidRootPart.CFrame:vectorToWorldSpace((Vector3.new(0, -movement.X * speed * stats.TurnSpeed.Value, 0))) bodyAngularVelocity.maxTorque = Vector3.new(0, 0, 0) else bodyAngularVelocity.maxTorque = Vector3.new(mass / 4, mass / 2, mass / 4) end humanoidRootPart.RotVelocity = humanoidRootPart.RotVelocity:Lerp(rotVelocity, .1) --bodyVelocity.maxForce = Vector3.new(mass / 3, mass / 6, mass / 3) --bodyAngularVelocity.maxTorque = Vector3.new(mass / 6, mass / 3, mass / 6) else bodyVelocity.maxForce = Vector3.new(0, 0, 0) bodyAngularVelocity.maxTorque = Vector3.new(0, 0, 0) end for i, part in pairs(car:GetChildren()) do if part.Name == "Thruster" then UpdateThruster(part) end end end for i, v in pairs(car:GetChildren()) do if v:FindFirstChild("BodyThrust") then v.BodyThrust:Destroy() end end bodyVelocity:Destroy() bodyAngularVelocity:Destroy() gear.Value = 0 --camera.CameraType = oldCameraType script:Destroy() --end)