Hey, I made a custom cursor system that is all working, yet the issue I come across is trying to hide the Roblox system cursor. For some reason, it isn’t being hidden.
Help will be greatly appreciated.
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local module = {}
local cursorGui
local cursorImage
local moveConnection
local clickConnection
local isEnabled = false
local lastTween
local CURSOR_ASSET = "rbxassetid://9618276643"
local CURSOR_SIZE = 64
local CURSOR_OFFSET_Y = 57
local CLICK_SCALE = 0.9
local CLICK_TWEEN_TIME = 0.08
local function ensureCursorGui()
if cursorGui then return end
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
cursorGui = Instance.new("ScreenGui")
cursorGui.Name = "CustomCursorGui"
cursorGui.ResetOnSpawn = false
cursorGui.IgnoreGuiInset = true
cursorGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
cursorGui.DisplayOrder = 9999
cursorGui.Parent = playerGui
cursorImage = Instance.new("ImageLabel")
cursorImage.Name = "CursorImage"
cursorImage.Size = UDim2.fromOffset(CURSOR_SIZE, CURSOR_SIZE)
cursorImage.AnchorPoint = Vector2.new(0.5, 0.5)
cursorImage.BackgroundTransparency = 1
cursorImage.Image = CURSOR_ASSET
cursorImage.ImageColor3 = Color3.new(1, 1, 1)
cursorImage.ZIndex = 9999
cursorImage.Visible = false
cursorImage.Active = false
cursorImage.Selectable = false
cursorImage.Parent = cursorGui
end
local function clickAnimation()
if not cursorImage then return end
local shrinkTween = TweenService:Create(cursorImage, TweenInfo.new(CLICK_TWEEN_TIME, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
Size = UDim2.fromOffset(CURSOR_SIZE * CLICK_SCALE, CURSOR_SIZE * CLICK_SCALE),
})
local restoreTween = TweenService:Create(cursorImage, TweenInfo.new(CLICK_TWEEN_TIME, Enum.EasingStyle.Quad, Enum.EasingDirection.In), {
Size = UDim2.fromOffset(CURSOR_SIZE, CURSOR_SIZE),
})
shrinkTween:Play()
shrinkTween.Completed:Connect(function()
restoreTween:Play()
end)
end
function module.Enable()
if isEnabled then return end
isEnabled = true
ensureCursorGui()
cursorImage.Visible = true
UserInputService.MouseIconEnabled = false
-- Follow mouse
moveConnection = UserInputService.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement then
local targetPos = UDim2.fromOffset(input.Position.X, input.Position.Y + CURSOR_OFFSET_Y)
if lastTween then lastTween:Cancel() end
lastTween = TweenService:Create(cursorImage, TweenInfo.new(0.05), { Position = targetPos })
lastTween:Play()
end
end)
-- Play click animation on left click
clickConnection = UserInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed then return end -- respect UI interactions
if input.UserInputType == Enum.UserInputType.MouseButton1 then
clickAnimation()
end
end)
end
function module.Disable()
if not isEnabled then return end
isEnabled = false
UserInputService.MouseIconEnabled = true
if moveConnection then
moveConnection:Disconnect()
moveConnection = nil
end
if clickConnection then
clickConnection:Disconnect()
clickConnection = nil
end
if lastTween then
lastTween:Cancel()
lastTween = nil
end
if cursorImage then
cursorImage.Visible = false
end
end
function module.SetColor(color: Color3)
if cursorImage then
TweenService:Create(cursorImage, TweenInfo.new(0.15), { ImageColor3 = color }):Play()
end
end
function module.Destroy()
module.Disable()
if cursorGui then
cursorGui:Destroy()
cursorGui = nil
end
end
return module```