How would I construct a mechanic that has the player slower increases speed when they start moving and have it decreases when they stop moving?
local Player = game.Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded():Wait()
local Humanoid = Character.Humanoid
local Root = Character.HumanoidRootPart
local BaseWaitTimer = .4
local MinSpeed = 12
local MaxSpeed = 40
local WaitTimer = BaseWaitTimer
Humanoid.WalkSpeed = MinSpeed
function Start()
local MoveDirDB = false
local function Accelerate()
if Humanoid.MoveDirection ~= Vector3.new(0, 0, 0) and MoveDirDB == false and Humanoid.WalkSpeed < MaxSpeed then
MoveDirDB = true
while Humanoid.MoveDirection ~= Vector3.new(0, 0, 0) and Humanoid.WalkSpeed < MaxSpeed do
Humanoid.WalkSpeed = Humanoid.WalkSpeed + 1
wait(WaitTimer)
WaitTimer = WaitTimer / 1.1
end
MoveDirDB = false
elseif Humanoid.MoveDirection == Vector3.new(0, 0, 0) then
WaitTimer = BaseWaitTimer
Humanoid.WalkSpeed = MinSpeed
end
end
Humanoid:GetPropertyChangedSignal("MoveDirection"):Connect(Accelerate)
end
Start()
this is an Acceleration local script I made, Adding Acceleration is rather easy but Deceleration is an other matter and I can’t really think of a good way to do it currently
I never said it was not i was just giving him another easier method he could use.
Oh, I was confused because you replied to me and not him
Did i really XD my bad ill fix that
I assume you want this mechanic to be for pc/mobile/xbox compatible so your best option is to use Humanoid.StateChanged and do a while loop to check if the Humanoids state is still running if it is then increase the speed. Ex?:
local IsRunning = Instance.new(“BoolValue”,plr)
IsRunning.Value = false
IsRunning.Changed:Connect(function(newval)
if newval == false then
– decrease speed
else
– increase speed
end)
game.Workspace.Player.Humanoid.Running:Connect(function(speed)
if speed > 0 then
IsRunning.Value = true
else
Isrunning.Value = false
end
end)
This should be something to keep in mind, but thank you for the feedback!
Please remember to use the script formatting tool.
Hello, did you figure out deceleration ? Thanks
I mean you could use UIS and detect if the player lets go and gradually stop them.
This isn’t exactly the functionality you described but I think it is what you want. The script is placed in StarterCharacterScripts. If the player is moving and hold shifting then the speed will increase, it will decrease if the player isn’t holding shift. If the player isn’t moving the Walkspeed is set to StartSpeed.
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local character = script.Parent
local Human = character:WaitForChild("Humanoid")
local StartSpeed = 16
local GoalSpeed = 26
local function Run(step)
local ShiftIsDown = UserInputService:IsKeyDown(Enum.KeyCode.LeftShift)
local IsStill = Human.MoveDirection == Vector3.new(0,0,0)
local CurrentSpeed = Human.WalkSpeed
local Change = 5*step --the lower the multiplicand, the longer it will take to increase and decrease speed
if IsStill then
Human.WalkSpeed = StartSpeed
elseif ShiftIsDown and (CurrentSpeed < GoalSpeed) then
Human.WalkSpeed = Human.WalkSpeed + Change
elseif (ShiftIsDown == false) and (CurrentSpeed > StartSpeed) then
Human.WalkSpeed = Human.WalkSpeed - Change
end
--print("Speed is: " .. CurrentSpeed .. " Moving is: " .. tostring(IsMoving))
end
RunService.Heartbeat:Connect(Run)
Thanks I will check that out.
Like for normal PC, W key, for moving forward, at a normal speed, I guess I am thinking like to make the play skid to a stop, instead of just stopping… maybe changing it from LeftShift to W, and then doing the same for the A,S,D…
The for bonus , having it work on other devices, like console…
Then doing the same for acceleration… might be a cool effect to have in a game…
I’ll play around with the code. thanks again!
I think you want the player’s character to slow down into a idle state from a moving state. If you want to use the Humanoid object, Humanoid.WalkToPoint is the only way I can think of achieving this effect.
Check if the player has stopped moving
Set the WalkToPoint ahead of the direction the player was moving in
Decrease the WalkSpeed until WalkToPoint met.
Getting the point is easier if you are using the default humanoid setup
local Point5StudsAheadPlr = HumanoidRootPart.Position+(Humanoid.MoveDirection*Vector3.new(5,0,5))
Cool thanks! I will play around with that too and see if I can get it working.