Im trying to create a custom movement system, and things are working but theres a bug i cant seem to fix
The player slowly descends downward. Im aware that the cause is the Y value of the linear velocity is affected but i tried constantly setting it to 0 but that didnt work either (it just errored)
heres my code so far
local player = game.Players.LocalPlayer
local UIS = game:GetService("UserInputService")
local char = script.Parent
local HRP = char.HumanoidRootPart
local attachment = Instance.new("Attachment", HRP)
local LV = Instance.new("LinearVelocity", HRP)
local AV = Instance.new("AngularVelocity", HRP)
local speed = 0
LV.Attachment0 = attachment
LV.RelativeTo = Enum.ActuatorRelativeTo.Attachment0
LV.MaxForce = math.huge
AV.Attachment0 = attachment
AV.RelativeTo = Enum.ActuatorRelativeTo.Attachment0
AV.MaxTorque = math.huge
LV.Enabled = false
AV.Enabled = false
attachment.Name = "MoverAttachment"
UIS.InputBegan:Connect(function(input, chat)
if chat then return end
while UIS:IsKeyDown(Enum.KeyCode.W) do
speed = speed + 1
print("W is being held down!")
task.wait()
LV.Enabled = true
LV.VectorVelocity = attachment.WorldCFrame.LookVector * speed
if speed >= 20 then
speed = 20
end
end
end)
im not sure why this is happening, and im really new to something as complex as movement systems so help is appreciated
You are not using UserInputService properly. You should only use it to get inputs, then use that input somewhere else, not in the same function.
for every key you press, this runs
Your code may crash. You should do this instead
local RunService = game:GetService("RunService")
local wPressed = false
UIS.InputBegan:Connect(function(input, chat)
if chat then return end
if input.KeyCode == Enum.KeyCode.W then
wPressed = true
end
end)
UIS.InputEnded:Connect(function(input)
if input.KeyCode == Enum.KeyCode.W then
wPressed = false
speed = 0 -- Set speed back to 0?
end
end)
RunService.Stepped:Connect(function()
if wPressed then
speed = speed + 1
print("W is being held down!")
task.wait()
LV.Enabled = true
LV.VectorVelocity = attachment.WorldCFrame.LookVector * speed
if speed >= 20 then
speed = 20
end
end
end)
or if you really want it in a single function, then you have to check for key press first before looping.
UIS.InputBegan:Connect(function(input, chat)
if chat then return end
if input.KeyCode == Enum.KeyCode.W then
while UIS:IsKeyDown(Enum.KeyCode.W) do
speed = speed + 1
print("W is being held down!")
task.wait()
LV.Enabled = true
LV.VectorVelocity = attachment.WorldCFrame.LookVector * speed
if speed >= 20 then
speed = 20
end
end
end
end)
local UserInput = game:GetService("UserInputService")
local Players = game:GetService("Players")
local Player = Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()
local HRP = Character:WaitForChild("HumanoidRootPart")
local Attachment = Instance.new("Attachment")
Attachment.Parent = HRP
local LV = Instance.new("LinearVelocity")
LV.Parent = HRP
local AV = Instance.new("AngularVelocity")
AV.Parent = HRP
LV.Attachment0 = Attachment
LV.RelativeTo = Enum.ActuatorRelativeTo.Attachment0
LV.MaxForce = math.huge
AV.Attachment0 = Attachment
AV.RelativeTo = Enum.ActuatorRelativeTo.Attachment0
AV.MaxTorque = math.huge
LV.Enabled = false
AV.Enabled = false
local Scalar = 0
local Connection
UserInput.InputBegan:Connect(function(StartInput, _)
if StartInput.KeyCode == Enum.KeyCode.W then
if Connection then return end
Connection = UserInput.InputEnded:Connect(function(EndInput, _)
if EndInput.KeyCode == Enum.KeyCode.W then
Connection:Disconnect()
Connection = nil
LV.Enabled = false
AV.Enabled = false
Scalar = 0
end
end)
LV.Enabled = true
AV.Enabled = true
while true do
task.wait()
if Connection then
Scalar = math.min(Scalar + 1, 20)
LV.VectorVelocity = Attachment.WorldCFrame.LookVector * Scalar
AV.AngularVelocity = -Attachment.WorldCFrame.LookVector * Scalar
else
break
end
end
end
end)
Feel free to remove the AV.AngularVelocity assignment expression, this seems to be working on my end.