Hey there, I have a little problem regarding the mobile controls. Basically I have a function that repeats to turn the character with a bodygyro towards the mouse’s X and Z position and this works perfectly fine on pc, but when used on mobile it works until you move. Since you touch your screen a second time to move your joystick, it follows the second touch’s position instead of the first one. Is there a way to ignore this 2nd touch?
Maybe this could help you?
It’s not really the joystick, it’s just the second touch on the screen in general that I want ignored.
There is a way to record specific touches and to track them using InputUserService (InputBegan is one of the events you can use, but I believe tracking would require a bit more code to work with the other input events (InputChanged, InputEnded, etc)). These events return input objects with information about the input but I don’t have much experience dealing with multitouch stuff, though hopefully this provides some extra info
Yeah, but the problem is that it seems to always track the most recent touch and I’m afraid there is no way to track the first one without getting cancelled by the second touch.
Sorry to revive this topic I discover the CameraInput script that ignore thumbstick on the 2nd input
--!nonstrict
local UserGameSettings: UserGameSettings = UserSettings():GetService("UserGameSettings")
local UserInputService = game:GetService("UserInputService")
local GuiService = game:GetService("GuiService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local playerGui: PlayerGui = player:WaitForChild("PlayerGui")
local dynamicThumbstickInput: InputObject?
local function isInDynamicThumbstickArea(pos: Vector3): boolean
local touchGui = playerGui:FindFirstChild("TouchGui") :: ScreenGui
local touchFrame: Frame = touchGui and touchGui:FindFirstChild("TouchControlFrame")
local touchMovementMode = UserGameSettings.TouchMovementMode
local thumbstickFrame: Frame?
if touchFrame then
if touchMovementMode == Enum.TouchMovementMode.Default or touchMovementMode == Enum.TouchMovementMode.DynamicThumbstick then
thumbstickFrame = (touchFrame:FindFirstChild("DynamicThumbstickFrame") :: Frame)
elseif touchMovementMode == Enum.TouchMovementMode.Thumbstick then
thumbstickFrame = (touchFrame:FindFirstChild("ThumbstickFrame") :: Frame)
end
end
if thumbstickFrame then
local posTopLeft = thumbstickFrame.AbsolutePosition
local posBottomRight = posTopLeft + thumbstickFrame.AbsoluteSize
if
pos.X >= posTopLeft.X
and pos.Y >= posTopLeft.Y
and pos.X <= posBottomRight.X
and pos.Y <= posBottomRight.Y
then
return true
end
end
return false
end
UserInputService.InputBegan:Connect(function(input: InputObject, gameProcessedEvent: boolean)
if input.UserInputState == Enum.UserInputState.Begin and input.UserInputType == Enum.UserInputType.Touch then
if dynamicThumbstickInput == nil and isInDynamicThumbstickArea(input.Position) then
dynamicThumbstickInput = input
return
end
-- Do something here
end
end)
UserInputService.InputChanged:Connect(function(input: InputObject, gameProcessedEvent: boolean)
if input.UserInputState == Enum.UserInputState.Change and input.UserInputType == Enum.UserInputType.Touch then
if input == dynamicThumbstickInput then
return
end
-- Do something here
end
end)
UserInputService.InputEnded:Connect(function(input: InputObject, gameProcessedEvent: boolean)
if input.UserInputState == Enum.UserInputState.End and input.UserInputType == Enum.UserInputType.Touch then
if input == dynamicThumbstickInput then
dynamicThumbstickInput = nil
end
-- Do something here
end
end)
GuiService.MenuOpened:Connect(function()
if dynamicThumbstickInput then
dynamicThumbstickInput = nil
end
end)