Hello! I want to make a system where when a player starts walking, they gradually increase speed and camera’s field of view, and when they stop walking, they gradually decrease speed and FOV, something along the line of how movement works in Superstar Racers. I’ve seen a few similar posts here and there, but I’ve never really understood the solutions, and they seem to show a short startup, unlike the slow and gradual increase in speed in Superstar Racers. Can somebody explain to me how I would create such a system?
Here’s one that I created that uses RunService.Heartbeat (doesn’t include FOV)
Put this on the server
local humanoid = Instance.new("Humanoid") -- replace with directory
local startspeed = 5
local maxspeed = 30
local speedincrease = 0.01
local speeddecrease = 0.01
local compare = startspeed - 1
local currentspeed = startspeed
humanoid.WalkSpeed = startspeed
game:GetService("RunService").Heartbeat:Connect(function ()
-- gradually increase the speed
local speed = humanoid:GetMoveVelocity().Magnitude
if speed > compare and speed < maxspeed then
currentspeed += speedincrease
elseif speed > startspeed then
currentspeed -= speeddecrease
end
humanoid.WalkSpeed = currentspeed
end)
I’d recommend looking into TweenService for something like this: TweenService | Documentation - Roblox Creator Hub
I’m assuming the EasingStyle used was Sine, based on your description. Take a little look at the link I provided and you should be able to come up with something.
Both of these answers are kinda bleh and do not really do it well. Roblox has physics controllers that can be used to apply custom controllers to characters. In specific, the GroundController
has an AccelerationTime property that dictates how long it would take for the controller to “ramp up” to max speed. You could modify the camera FOV based on how fast the character is presently moving.
Here’s one that I created that uses RunService.Heartbeat (doesn’t include FOV)
Put this on the server
Putting a script on the server to modify player speed will result in the player feeling incredibly weird to play as on the client, especially if you have high latency. Anything that modifies the player should be performed by the client imho
I’d recommend looking into TweenService for something like this
This does technically work but it feels like it’s not intended for something like this. Additionally, there’s not really a way to start a tween “halfway” through an animation, so decelerating before the max speed is reached would feel jank
If you want a method that does not involve a custom controller, I would manually accelerate/decelerate the player’s movement speed based on a set walkspeed/s acceleration value, and using a client sided RunService.PreSimulation
event. Using the passed delta time you can multiply it by the acceleration value to make sure the acceleration is consistent between all framerates (i.e. if you’re running at 60fps, the deltatime is 1/60 seconds, thus multiplying it by your acceleration will give you an acceleration/60 increases, or a full acceleration increase every 60 frames (which would be a second in this instance))