I basically just used the code from the post I said and added a TweenPosition to it
local UserInputService = game:GetService("UserInputService")
local gui = script.Parent
local dragging
local dragInput
local dragStart
local startPos
local function update(input)
local delta = input.Position - dragStart
gui:TweenPosition(UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y), Enum.EasingDirection.InOut, Enum.EasingStyle.Sine, 0.04, true) -- This is what I changed
end
gui.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = gui.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end
end)
gui.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
dragInput = input
end
end)
UserInputService.InputChanged:Connect(function(input)
if input == dragInput and dragging then
update(input)
end
end)
I used Linear Interpolation to smooth the movement. a + (b - a) * m
local UserInputService = game:GetService("UserInputService")
local runService = (game:GetService("RunService"));
local gui = script.Parent
local dragging
local dragInput
local dragStart
local startPos
function Lerp(a, b, m)
return a + (b - a) * m
end;
local DRAG_SPEED = (8); -- // The speed of the UI darg.
function Update(dt)
local delta = UserInputService:GetMouseDelta()
local xGoal = (startPos.X.Offset + delta.X);
local yGoal = (startPos.Y.Offset + delta.Y);
gui.Position = UDim2.new(startPos.X.Scale, Lerp(gui.Position.X.Offset, xGoal, dt * DRAG_SPEED), startPos.Y.Scale, Lerp(gui.Position.Y.Offset, yGoal, dt * DRAG_SPEED))
end;
gui.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = gui.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end
end)
gui.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
dragInput = input
end
end)
runService.Heartbeat:Connect(Update)
local UserInputService = game:GetService("UserInputService")
local runService = (game:GetService("RunService"));
local gui = script.Parent
local dragging
local dragInput
local dragStart
local startPos
function Lerp(a, b, m)
return a + (b - a) * m
end;
local lastMousePos
local DRAG_SPEED = (8); -- // The speed of the UI darg.
function Update(dt)
if not (dragging) then return end;
if not (startPos) then return end;
local delta = (lastMousePos - UserInputService:GetMouseLocation())
local xGoal = (startPos.X.Offset - delta.X);
local yGoal = (startPos.Y.Offset - delta.Y);
gui.Position = UDim2.new(startPos.X.Scale, Lerp(gui.Position.X.Offset, xGoal, dt * DRAG_SPEED), startPos.Y.Scale, Lerp(gui.Position.Y.Offset, yGoal, dt * DRAG_SPEED))
end;
gui.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = gui.Position
lastMousePos = UserInputService:GetMouseLocation()
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end
end)
gui.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
dragInput = input
end
end)
runService.Heartbeat:Connect(Update)
But if you stop dragging in the middle of dragging, it will kind of cut. Let me know if you need to fix that too.
I fixed that bug, now the UI should be smoothly dragged to where the position is even if stopped pressing in the middle.
local UserInputService = game:GetService("UserInputService")
local runService = (game:GetService("RunService"));
local gui = script.Parent
local dragging
local dragInput
local dragStart
local startPos
function Lerp(a, b, m)
return a + (b - a) * m
end;
local lastMousePos
local lastGoalPos
local DRAG_SPEED = (8); -- // The speed of the UI darg.
function Update(dt)
if not (dragging) then
gui.Position = UDim2.new(startPos.X.Scale, Lerp(gui.Position.X.Offset, lastGoalPos.X.Offset, dt * DRAG_SPEED), startPos.Y.Scale, Lerp(gui.Position.Y.Offset, lastGoalPos.Y.Offset, dt * DRAG_SPEED))
return
end;
if not (startPos) then return end;
local delta = (lastMousePos - UserInputService:GetMouseLocation())
local xGoal = (startPos.X.Offset - delta.X);
local yGoal = (startPos.Y.Offset - delta.Y);
lastGoalPos = UDim2.new(startPos.X.Scale, xGoal, startPos.Y.Scale, yGoal)
gui.Position = UDim2.new(startPos.X.Scale, Lerp(gui.Position.X.Offset, xGoal, dt * DRAG_SPEED), startPos.Y.Scale, Lerp(gui.Position.Y.Offset, yGoal, dt * DRAG_SPEED))
end;
gui.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = gui.Position
lastMousePos = UserInputService:GetMouseLocation()
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end
end)
gui.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
dragInput = input
end
end)
runService.Heartbeat:Connect(Update)
With that I get the same attempt to index nil with 'X' but it still works Nevermind, fixed it by moving the if not (startPos) then return end; to line 19
local UserInputService = game:GetService("UserInputService")
local runService = (game:GetService("RunService"));
local gui = script.Parent
local dragging
local dragInput
local dragStart
local startPos
function Lerp(a, b, m)
return a + (b - a) * m
end;
local lastMousePos
local lastGoalPos
local DRAG_SPEED = (8); -- // The speed of the UI darg.
function Update(dt)
if not (startPos) then return end;
if not (dragging) then
gui.Position = UDim2.new(startPos.X.Scale, Lerp(gui.Position.X.Offset, lastGoalPos.X.Offset, dt * DRAG_SPEED), startPos.Y.Scale, Lerp(gui.Position.Y.Offset, lastGoalPos.Y.Offset, dt * DRAG_SPEED))
return
end;
local delta = (lastMousePos - UserInputService:GetMouseLocation())
local xGoal = (startPos.X.Offset - delta.X);
local yGoal = (startPos.Y.Offset - delta.Y);
lastGoalPos = UDim2.new(startPos.X.Scale, xGoal, startPos.Y.Scale, yGoal)
gui.Position = UDim2.new(startPos.X.Scale, Lerp(gui.Position.X.Offset, xGoal, dt * DRAG_SPEED), startPos.Y.Scale, Lerp(gui.Position.Y.Offset, yGoal, dt * DRAG_SPEED))
end;
gui.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = gui.Position
lastMousePos = UserInputService:GetMouseLocation()
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end
end)
gui.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
dragInput = input
end
end)
runService.Heartbeat:Connect(Update)
local UserInputService = game:GetService("UserInputService")
local runService = (game:GetService("RunService"));
local gui = script.Parent
local dragging
local dragInput
local dragStart
local startPos
function Lerp(a, b, m)
return a + (b - a) * m
end;
local lastMousePos
local lastGoalPos
local DRAG_SPEED = (8); -- // The speed of the UI darg.
function Update(dt)
if not (startPos) then return end;
if not (dragging) and (lastGoalPos) then
gui.Position = UDim2.new(startPos.X.Scale, Lerp(gui.Position.X.Offset, lastGoalPos.X.Offset, dt * DRAG_SPEED), startPos.Y.Scale, Lerp(gui.Position.Y.Offset, lastGoalPos.Y.Offset, dt * DRAG_SPEED))
return
end;
local delta = (lastMousePos - UserInputService:GetMouseLocation())
local xGoal = (startPos.X.Offset - delta.X);
local yGoal = (startPos.Y.Offset - delta.Y);
lastGoalPos = UDim2.new(startPos.X.Scale, xGoal, startPos.Y.Scale, yGoal)
gui.Position = UDim2.new(startPos.X.Scale, Lerp(gui.Position.X.Offset, xGoal, dt * DRAG_SPEED), startPos.Y.Scale, Lerp(gui.Position.Y.Offset, yGoal, dt * DRAG_SPEED))
end;
gui.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = gui.Position
lastMousePos = UserInputService:GetMouseLocation()
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end
end)
gui.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
dragInput = input
end
end)
runService.Heartbeat:Connect(Update)