UserInputService

Mostrar obsoleto

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

No creable
Servicio
No replicado

UserInputService es un servicio utilizado para detectar y capturar los diferentes tipos de entrada disponibles en el dispositivo de un usuario.

El propósito principal de este servicio es permitir que las experiencias cooperen con múltiples formas de entrada disponibles, como gamepads, pantallas táctiles y teclados. Esto permite que un LocalScript realice diferentes acciones dependiendo del dispositivo y, a su vez, proporcione la mejor experiencia para el usuario final.

Algunos usos de este servicio incluyen la detección de la entrada del usuario cuando interactúan con GUI, herramientas y otras instancias del juego. Para detectar la entrada del usuario, el servicio debe buscar un evento del servidor. Por ejemplo, el servicio puede detectar eventos como cuando el usuario toca la pantalla de un dispositivo móvil usando Class.UserInputService.TouchStarted

Dado que este servicio es solo client-side, sólo funcionará cuando se use en un LocalScript o un ModuleScript requerido por un LocalScript . Como UserInputService es sólo client-side, los usuarios en el juego sólo pueden detectar su propia entrada - y no la entrada de otros.

También véase ContextActionService, un servicio que le permite vincular funciones a múltiples entradas del usuario.

Muestras de código

UserInputService

-- We must get the UserInputService before we can use it
local UserInputService = game:GetService("UserInputService")
-- A sample function providing one usage of InputBegan
local function onInputBegan(input, _gameProcessed)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
print("The left mouse button has been pressed!")
end
end
UserInputService.InputBegan:Connect(onInputBegan)

Resumen

Propiedades

  • Solo lectura
    No replicado
    Leer paralelo

    Describe si el dispositivo del usuario tiene un acelerómetro.

  • Solo lectura
    No replicado
    Leer paralelo

    Describe si el dispositivo utilizado por un usuario tiene una plataforma de juegos disponible.

  • Solo lectura
    No replicado
    Leer paralelo

    Describe si el dispositivo del usuario tiene un giroscopio.

  • Solo lectura
    No replicado
    Leer paralelo

    Describe si el dispositivo del usuario tiene una teclado disponible.

  • Determina si el mouse del usuario puede ser movido libremente o está bloqueado.

  • No replicado
    Leer paralelo

    Escala la salida de la curva (cambio) del usuario. Mouse .

  • Solo lectura
    No replicado
    Leer paralelo

    Describe si el dispositivo del usuario tiene un mouse disponible.

  • MouseIcon:ContentId
    Leer paralelo

    El ID de contenido de la imagen utilizada como íconode usuario.

  • Leer paralelo

    Determina si el icono de Mouse es visible.

  • Solo lectura
    No replicado
    Leer paralelo

    Determina la posición de la teclado en la pantalla.

  • Solo lectura
    No replicado
    Leer paralelo

    Determina el tamaño del teclado en la pantalla.

  • Solo lectura
    No replicado
    Leer paralelo

    Describe si una teclado en la pantalla es visible en la pantalla del usuario.

  • Solo lectura
    No replicado
    Leer paralelo

    Describe si el dispositivo actual del usuario tiene una pantalla táctil disponible.

  • Solo lectura
    No replicado
    Leer paralelo

    Indica si el usuario está usando un visorde realidad virtual.

Métodos

Eventos

Propiedades

AccelerometerEnabled

Solo lectura
No replicado
Leer paralelo

Esta propiedad describe si el dispositivo del usuario tiene un acelerómetro

Un acelerómetro es un componente que se encuentra en la mayoría de los dispositivos móviles que mide la aceleración (cambio de velocidad).

Por ejemplo, el siguiente código de ejemplo muestra cómo verificar si el dispositivo del usuario tiene un acelerómetro.


local UserInputService = game:GetService("UserInputService")
local accelerometerEnabled = UserInputService.AccelerometerEnabled
if accelerometerEnabled then
print("Accelerometer enabled!")
else
print("Accelerometer not enabled!")
end

Si el dispositivo tiene un acelerómetro habilitado, puedes obtener su aceleración actual usando la función UserInputService:GetDeviceAcceleration() o el rastro cuando la aceleración del dispositivo cambia usando el evento UserInputService.DeviceAccelerationChanged .

Como UserInputService es solo del lado del cliente, esta propiedad solo se puede usar en un LocalScript .

Muestras de código

Move a Ball using the Accelerometer

local Workspace = game:GetService("Workspace")
local UserInputService = game:GetService("UserInputService")
local ball = script.Parent:WaitForChild("Ball")
local mass = ball:GetMass()
local gravityForce = ball:WaitForChild("GravityForce")
local function moveBall(gravity)
gravityForce.Force = gravity.Position * Workspace.Gravity * mass
end
if UserInputService.AccelerometerEnabled then
UserInputService.DeviceGravityChanged:Connect(moveBall)
end
Create a Gyroscopic Camera

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local camera = workspace.CurrentCamera
local currentRotation = camera.CFrame -- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
task.wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -0.5 or gravity.Position.Z > 0.5)
orientationSet = true
end
end
local function RotationChanged(_rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x, y, z = delta:ToEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs(character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0, 8, 10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0, 0, -10))
end)
end

GamepadEnabled

Solo lectura
No replicado
Leer paralelo

Esta propiedad describe si el dispositivo utilizado por un usuario tiene una consola de juegos disponible. Si las consolas de juegos están disponibles, puede usar UserInputService:GetConnectedGamepads() para recuperar una lista de consolas de juegos conectadas.

Como UserInputService es solo del lado del cliente, esta propiedad solo se puede usar en un LocalScript .

Véase también:

Muestras de código

How to Set the Active Gamepad for Input

local UserInputService = game:GetService("UserInputService")
local function getActiveGamepad()
local activeGamepad = nil
local connectedGamepads = UserInputService:GetConnectedGamepads()
if #connectedGamepads > 0 then
for _, gamepad in connectedGamepads do
if activeGamepad == nil or gamepad.Value < activeGamepad.Value then
activeGamepad = gamepad
end
end
end
if activeGamepad == nil then -- Nothing is connected; set up for "Gamepad1"
activeGamepad = Enum.UserInputType.Gamepad1
end
return activeGamepad
end
if UserInputService.GamepadEnabled then
local activeGamepad = getActiveGamepad()
print(activeGamepad)
end

GyroscopeEnabled

Solo lectura
No replicado
Leer paralelo

Esta propiedad describe si el dispositivo del usuario tiene un giroscopio.

Un giroscopio es un componente que se encuentra en la mayoría de los dispositivos móviles que detecta la orientación y la velocidad de rotación.

Si el dispositivo de un usuario tiene un giroscopio, puede usarlo en su juego usando la función UserInputService:GetDeviceRotation() y el evento Class.UserInputService.DeviceRotationChanged ".


local UserInputService = game:GetService("UserInputService")
local gyroIsEnabled = UserInputService.GyroscopeEnabled
if gyroIsEnabled then
print("Gyroscope is enabled!")
else
print("Gyroscope is not enabled!")
end

Como UserInputService es solo del lado del cliente, esta propiedad solo se puede usar en un LocalScript .

Muestras de código

Create a Gyroscopic Camera

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local camera = workspace.CurrentCamera
local currentRotation = camera.CFrame -- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
task.wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -0.5 or gravity.Position.Z > 0.5)
orientationSet = true
end
end
local function RotationChanged(_rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x, y, z = delta:ToEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs(character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0, 8, 10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0, 0, -10))
end)
end

KeyboardEnabled

Solo lectura
No replicado
Leer paralelo

Esta propiedad describe si el dispositivo del usuario tiene un teclado disponible. Esta propiedad es true cuando el dispositivo del usuario tiene un teclado disponible, y false cuando no lo tiene.

Se puede usar para determinar si el usuario tiene un teclado disponible - lo cual puede ser importante si quieres ver si puedes usar UserInputService:IsKeyDown() o UserInputService:GetKeysPressed() para comprobar la entrada del teclado.

Como UserInputService es solo del lado del cliente, esta propiedad solo se puede usar en un LocalScript .

Muestras de código

Check if Keyboard is Enabled

local UserInputService = game:GetService("UserInputService")
if UserInputService.KeyboardEnabled then
print("The user's device has an available keyboard!")
else
print("The user's device does not have an available keyboard!")
end

MouseBehavior

Leer paralelo

Esta propiedad establece cómo se comporta el mouse del usuario según el Enum.MouseBehavior Enum. El valor predeterminado es Enum.MouseBehavior.Default.

Puede establecerse en tres valores:

  1. Por defecto : El mouse se mueve libremente alrededor de la pantalla del usuario.
  2. Bloqueo del centro del ratón : El ratón está bloqueado y no se puede mover del centro de la pantalla del usuario.
  3. Bloquear la posición actual : El mouse está bloqueado, y no puede moverse desde, está posición actual en la pantalla del usuario en el momento de bloqueo.

El valor de esta propiedad no afecta la sensibilidad del seguimiento de eventos del movimiento del mouse. Por ejemplo, GetMouseDelta devuelve la misma posición de la pantalla de Vector2 independientemente de si el mouse está bloqueado o puede moverse libremente alrededor de la pantalla del usuario. Como resultado, los scripts predeterminados como los que controlan la cámara no

Esta propiedad se anula si un GuiButton con Modal habilitado está GuiButton.Visible a menos que el botón derecho del mouse del jugador esté apuntado.

Nota que, si el mouse está bloqueado, UserInputService.InputChanged aún se ejecutará cuando el jugador mueva el mouse y pasará en el Delta que el mouse intentó mover. Además, si el jugador es expulsado del juego, el mouse se desbloqueará de forma forzada.

Como UserInputService es solo del lado del cliente, esta propiedad solo se puede usar en un LocalScript .

Muestras de código

Create a Binoculars Script

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head", false)
local mouse = player:GetMouse()
local zoomed = false
local camera = game.Workspace.CurrentCamera
local target = nil
local originalProperties = {
FieldOfView = nil,
_CFrame = nil,
MouseBehavior = nil,
MouseDeltaSensitivity = nil,
}
local AngleX, TargetAngleX = 0, 0
local AngleY, TargetAngleY = 0, 0
-- Reset camera back to CFrame and FieldOfView before zoom
local function ResetCamera()
target = nil
camera.CameraType = Enum.CameraType.Custom
camera.CFrame = originalProperties._CFrame
camera.FieldOfView = originalProperties.FieldOfView
UserInputService.MouseBehavior = originalProperties.MouseBehavior
UserInputService.MouseDeltaSensitivity = originalProperties.MouseDeltaSensitivity
end
local function ZoomCamera()
-- Allow camera to be changed by script
camera.CameraType = Enum.CameraType.Scriptable
-- Store camera properties before zoom
originalProperties._CFrame = camera.CFrame
originalProperties.FieldOfView = camera.FieldOfView
originalProperties.MouseBehavior = UserInputService.MouseBehavior
originalProperties.MouseDeltaSensitivity = UserInputService.MouseDeltaSensitivity
-- Zoom camera
target = mouse.Hit.Position
local eyesight = head.Position
camera.CFrame = CFrame.new(eyesight, target)
camera.Focus = CFrame.new(target)
camera.FieldOfView = 10
-- Lock and slow down mouse
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
UserInputService.MouseDeltaSensitivity = 1
-- Reset zoom angles
AngleX, TargetAngleX = 0, 0
AngleY, TargetAngleY = 0, 0
end
-- Toggle camera zoom/unzoom
local function MouseClick()
if zoomed then
-- Unzoom camera
ResetCamera()
else
-- Zoom in camera
ZoomCamera()
end
zoomed = not zoomed
end
local function MouseMoved(input)
if zoomed then
local sensitivity = 0.6 -- anything higher would make looking up and down harder; recommend anything between 0~1
local smoothness = 0.05 -- recommend anything between 0~1
local delta = Vector2.new(input.Delta.x / sensitivity, input.Delta.y / sensitivity) * smoothness
local X = TargetAngleX - delta.y
local Y = TargetAngleY - delta.x
TargetAngleX = (X >= 80 and 80) or (X <= -80 and -80) or X
TargetAngleY = (Y >= 80 and 80) or (Y <= -80 and -80) or Y
AngleX = AngleX + (TargetAngleX - AngleX) * 0.35
AngleY = AngleY + (TargetAngleY - AngleY) * 0.15
camera.CFrame = CFrame.new(head.Position, target)
* CFrame.Angles(0, math.rad(AngleY), 0)
* CFrame.Angles(math.rad(AngleX), 0, 0)
end
end
local function InputBegan(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
MouseClick()
end
end
local function InputChanged(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseMovement then
MouseMoved(input)
end
end
if UserInputService.MouseEnabled then
UserInputService.InputBegan:Connect(InputBegan)
UserInputService.InputChanged:Connect(InputChanged)
end
Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

MouseDeltaSensitivity

No replicado
Leer paralelo

Esta propiedad determina la sensibilidad del usuario de Mouse .

La sensibilidad determina la medida en que se traduce un movimiento del mouse físico a un movimiento del mouse en el juego. Esto se puede usar para ajustar la sensibilidad de los eventos que rastrean el movimiento del mouse, como GetMouseDelta , a los movimientos del mouse.

Esta propiedad no afecta el movimiento del íconodel mouse. Tampoco afecta la configuración de Sensibilidad de la cámara que se encuentra en la pestaña Configuración del menú de Configuración del cliente, que también ajusta la sensibilidad del seguimiento del movimiento del mouse.

Esta propiedad tiene un valor máximo de 10 y un valor mínimo de 0. Un valor más bajo coincide con menor sensibilidad y un valor más alto con mayor sensibilidad.

Cuando la sensibilidad es 0, los eventos que rastrean el movimiento del ratóntodavía se dispararán, pero todos los parámetros y propiedades que indican el cambio en la posición del mouse se devolverán Vector2.new() , o Vector3.new() en el caso de <

Muestras de código

Create a Binoculars Script

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head", false)
local mouse = player:GetMouse()
local zoomed = false
local camera = game.Workspace.CurrentCamera
local target = nil
local originalProperties = {
FieldOfView = nil,
_CFrame = nil,
MouseBehavior = nil,
MouseDeltaSensitivity = nil,
}
local AngleX, TargetAngleX = 0, 0
local AngleY, TargetAngleY = 0, 0
-- Reset camera back to CFrame and FieldOfView before zoom
local function ResetCamera()
target = nil
camera.CameraType = Enum.CameraType.Custom
camera.CFrame = originalProperties._CFrame
camera.FieldOfView = originalProperties.FieldOfView
UserInputService.MouseBehavior = originalProperties.MouseBehavior
UserInputService.MouseDeltaSensitivity = originalProperties.MouseDeltaSensitivity
end
local function ZoomCamera()
-- Allow camera to be changed by script
camera.CameraType = Enum.CameraType.Scriptable
-- Store camera properties before zoom
originalProperties._CFrame = camera.CFrame
originalProperties.FieldOfView = camera.FieldOfView
originalProperties.MouseBehavior = UserInputService.MouseBehavior
originalProperties.MouseDeltaSensitivity = UserInputService.MouseDeltaSensitivity
-- Zoom camera
target = mouse.Hit.Position
local eyesight = head.Position
camera.CFrame = CFrame.new(eyesight, target)
camera.Focus = CFrame.new(target)
camera.FieldOfView = 10
-- Lock and slow down mouse
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
UserInputService.MouseDeltaSensitivity = 1
-- Reset zoom angles
AngleX, TargetAngleX = 0, 0
AngleY, TargetAngleY = 0, 0
end
-- Toggle camera zoom/unzoom
local function MouseClick()
if zoomed then
-- Unzoom camera
ResetCamera()
else
-- Zoom in camera
ZoomCamera()
end
zoomed = not zoomed
end
local function MouseMoved(input)
if zoomed then
local sensitivity = 0.6 -- anything higher would make looking up and down harder; recommend anything between 0~1
local smoothness = 0.05 -- recommend anything between 0~1
local delta = Vector2.new(input.Delta.x / sensitivity, input.Delta.y / sensitivity) * smoothness
local X = TargetAngleX - delta.y
local Y = TargetAngleY - delta.x
TargetAngleX = (X >= 80 and 80) or (X <= -80 and -80) or X
TargetAngleY = (Y >= 80 and 80) or (Y <= -80 and -80) or Y
AngleX = AngleX + (TargetAngleX - AngleX) * 0.35
AngleY = AngleY + (TargetAngleY - AngleY) * 0.15
camera.CFrame = CFrame.new(head.Position, target)
* CFrame.Angles(0, math.rad(AngleY), 0)
* CFrame.Angles(math.rad(AngleX), 0, 0)
end
end
local function InputBegan(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
MouseClick()
end
end
local function InputChanged(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseMovement then
MouseMoved(input)
end
end
if UserInputService.MouseEnabled then
UserInputService.InputBegan:Connect(InputBegan)
UserInputService.InputChanged:Connect(InputChanged)
end

MouseEnabled

Solo lectura
No replicado
Leer paralelo

Esta propiedad describe si el dispositivo del usuario tiene un mouse disponible. Esta propiedad es true cuando el dispositivo del usuario tiene un ratóndisponible, y false cuando no lo hace.


local UserInputService = game:GetService("UserInputService")
if UserInputService.MouseEnabled then
print("The user's device has an available mouse!")
else
print("The user's device does not have an available mouse!")
end

Es importante comprobar esto antes de usar las funciones del mouse UserInputService como UserInputService:GetMouseLocation() .

Como UserInputService es solo del lado del cliente, esta propiedad solo se puede usar en un LocalScript .

Véase también:

Muestras de código

Create a Binoculars Script

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head", false)
local mouse = player:GetMouse()
local zoomed = false
local camera = game.Workspace.CurrentCamera
local target = nil
local originalProperties = {
FieldOfView = nil,
_CFrame = nil,
MouseBehavior = nil,
MouseDeltaSensitivity = nil,
}
local AngleX, TargetAngleX = 0, 0
local AngleY, TargetAngleY = 0, 0
-- Reset camera back to CFrame and FieldOfView before zoom
local function ResetCamera()
target = nil
camera.CameraType = Enum.CameraType.Custom
camera.CFrame = originalProperties._CFrame
camera.FieldOfView = originalProperties.FieldOfView
UserInputService.MouseBehavior = originalProperties.MouseBehavior
UserInputService.MouseDeltaSensitivity = originalProperties.MouseDeltaSensitivity
end
local function ZoomCamera()
-- Allow camera to be changed by script
camera.CameraType = Enum.CameraType.Scriptable
-- Store camera properties before zoom
originalProperties._CFrame = camera.CFrame
originalProperties.FieldOfView = camera.FieldOfView
originalProperties.MouseBehavior = UserInputService.MouseBehavior
originalProperties.MouseDeltaSensitivity = UserInputService.MouseDeltaSensitivity
-- Zoom camera
target = mouse.Hit.Position
local eyesight = head.Position
camera.CFrame = CFrame.new(eyesight, target)
camera.Focus = CFrame.new(target)
camera.FieldOfView = 10
-- Lock and slow down mouse
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
UserInputService.MouseDeltaSensitivity = 1
-- Reset zoom angles
AngleX, TargetAngleX = 0, 0
AngleY, TargetAngleY = 0, 0
end
-- Toggle camera zoom/unzoom
local function MouseClick()
if zoomed then
-- Unzoom camera
ResetCamera()
else
-- Zoom in camera
ZoomCamera()
end
zoomed = not zoomed
end
local function MouseMoved(input)
if zoomed then
local sensitivity = 0.6 -- anything higher would make looking up and down harder; recommend anything between 0~1
local smoothness = 0.05 -- recommend anything between 0~1
local delta = Vector2.new(input.Delta.x / sensitivity, input.Delta.y / sensitivity) * smoothness
local X = TargetAngleX - delta.y
local Y = TargetAngleY - delta.x
TargetAngleX = (X >= 80 and 80) or (X <= -80 and -80) or X
TargetAngleY = (Y >= 80 and 80) or (Y <= -80 and -80) or Y
AngleX = AngleX + (TargetAngleX - AngleX) * 0.35
AngleY = AngleY + (TargetAngleY - AngleY) * 0.15
camera.CFrame = CFrame.new(head.Position, target)
* CFrame.Angles(0, math.rad(AngleY), 0)
* CFrame.Angles(math.rad(AngleX), 0, 0)
end
end
local function InputBegan(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
MouseClick()
end
end
local function InputChanged(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseMovement then
MouseMoved(input)
end
end
if UserInputService.MouseEnabled then
UserInputService.InputBegan:Connect(InputBegan)
UserInputService.InputChanged:Connect(InputChanged)
end

MouseIcon

ContentId
Leer paralelo

La propiedad MouseIcon determina la imagen utilizada como puntero. Si no hay valor, se utiliza una flecha predeterminada. Mientras el cursor se posiciona sobre ciertos objetos de la interfaz de usuario, como un ImageButton , TextButton , 1> Class.Loaded1> o 4> Class.ProximityProm

Para ocultar el cursor por completo, no use una imagen transparente. En cambio, configure Class.UserInputService.MouseIconEnabled para false.

Muestras de código

UserInputService.MouseIcon

local UserInputService = game:GetService("UserInputService")
-- In order to restore the cursor to what it was set to previously, it will need to be saved to a variable
local savedCursor = nil
local function setTemporaryCursor(cursor: string)
-- Only update the saved cursor if it's not currently saved
if not savedCursor then
savedCursor = UserInputService.MouseIcon
end
UserInputService.MouseIcon = cursor
end
local function clearTemporaryCursor()
-- Only restore the mouse cursor if there's a saved cursor to restore
if savedCursor then
UserInputService.MouseIcon = savedCursor
-- Don't restore the same cursor twice (might overwrite another script)
savedCursor = nil
end
end
setTemporaryCursor("http://www.roblox.com/asset?id=163023520")
print(UserInputService.MouseIcon)
clearTemporaryCursor()
print(UserInputService.MouseIcon)

MouseIconEnabled

Leer paralelo

Esta propiedad determina si el icono de Mouse es visible Cuando true el icono del ratónes visible, cuando false no lo es.

Por ejemplo, el código de muestra a continuación oculta el íconodel ratón.


local UserInputService = game:GetService("UserInputService")
UserInputService.MouseIconEnabled = false

Como UserInputService es solo del lado del cliente, esta propiedad solo se puede usar en un LocalScript .

Muestras de código

Hide Mouse During Keyboard Input

local UserInputService = game:GetService("UserInputService")
local mouseInput = {
Enum.UserInputType.MouseButton1,
Enum.UserInputType.MouseButton2,
Enum.UserInputType.MouseButton3,
Enum.UserInputType.MouseMovement,
Enum.UserInputType.MouseWheel,
}
local keyboard = Enum.UserInputType.Keyboard
local function toggleMouse(lastInputType)
if lastInputType == keyboard then
UserInputService.MouseIconEnabled = false
return
end
for _, mouse in pairs(mouseInput) do
if lastInputType == mouse then
UserInputService.MouseIconEnabled = true
return
end
end
end
UserInputService.LastInputTypeChanged:Connect(toggleMouse)

OnScreenKeyboardPosition

Solo lectura
No replicado
Leer paralelo

Esta propiedad describe la posición de la teclado en la pantalla en píxeles. La posición de la teclado es Vector2.new(0, 0) cuando no es visible.

Como UserInputService es solo del lado del client, esta propiedad solo se puede usar en un LocalScript o un Script con 1> Class.BaseScript.RunContext|RunContext1> configurado para 4> Enum.RunContext.Client4> .

También se vé OnScreenKeyboardVisible y OnScreenKeyboardSize .

Muestras de código

UserInputService.OnScreenKeyboardPosition

local UserInputService = game:GetService("UserInputService")
print(UserInputService.OnScreenKeyboardPosition)

OnScreenKeyboardSize

Solo lectura
No replicado
Leer paralelo

Esta propiedad describe el tamaño del teclado en píxeles. El tamaño del teclado es Vector2.new(0, 0) cuando no es visible.

Como UserInputService es solo del lado del client, esta propiedad solo se puede usar en un LocalScript o un Script con 1> Class.BaseScript.RunContext|RunContext1> configurado para 4> Enum.RunContext.Client4> .

También se vé OnScreenKeyboardVisible y OnScreenKeyboardPosition .

OnScreenKeyboardVisible

Solo lectura
No replicado
Leer paralelo

Esta propiedad describe si un teclado en la pantalla es visible en la pantalla del usuario.

Como UserInputService es solo del lado del client, esta propiedad solo se puede usar en un LocalScript o un Script con 1> Class.BaseScript.RunContext|RunContext1> configurado para 4> Enum.RunContext.Client4> .

También se vea OnScreenKeyboardSize y OnScreenKeyboardPosition .

TouchEnabled

Solo lectura
No replicado
Leer paralelo

Esta propiedad describe si el dispositivo actual del usuario tiene una pantalla táctil disponible.

La propiedad se usa para determinar si el dispositivo del usuario tiene una pantalla táctil, y por lo tanto si los eventos de toque se desencadenar. Si TouchEnabled está verdadero, puede usar los eventos de entrada de usuario como UserInputService.TouchStarted y UserInputService.TouchEnded para rastrear cuando un usuario comienza y termina tocando la pantalla de su dispositivo.

El código de muestra de abajo imprime si el dispositivo del usuario tiene una pantalla táctil.


local UserInputService = game:GetService("UserInputService")
if UserInputService.TouchEnabled then
print("The user's device has a touchscreen!")
else
print("The user's device does not have a touchscreen!")
end

Véase también:

Muestras de código

Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

VREnabled

Solo lectura
No replicado
Leer paralelo

Esta propiedad describe si el usuario está usando un dispositivo de realidad virtual (VR).

Si se habilita un dispositivo VR, puede interactuar con su ubicación y movimiento a través de funciones como UserInputService:GetUserCFrame() . También puede reaccionar a los movimientos del dispositivo VR usando el evento UserInputService.UserCFrameChanged .


local UserInputService = game:GetService("UserInputService")
local isUsingVR = UserInputService.VREnabled
if isUsingVR then
print("User is using a VR headset!")
else
print("User is not using a VR headset!")
end

Como UserInputService es solo del lado del cliente, esta propiedad solo se puede usar en un LocalScript .

Véase también:

Muestras de código

VR Head Tracking

local VRService = game:GetService("VRService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local function TrackHead(inputType, value)
if inputType == Enum.UserCFrame.Head then
head.CFrame = value
end
end
if VRService.VREnabled then
-- Set the initial CFrame
head.CFrame = VRService:GetUserCFrame(Enum.UserCFrame.Head)
-- Track VR headset movement and mirror for character's head
VRService.UserCFrameChanged:Connect(TrackHead)
end

Métodos

GamepadSupports

Esta función devuelve si la plataforma de juego Enum.UserInputType soporta un botón que coincida con el Enum.KeyCode dado. Esta función se usa para determinar las entradas de gamepad válidas.

Para determinar qué juegos de pads de Enum.UserInputType están conectados, usa UserInputService:GetConnectedGamepads() .

Como UserInputService es solo del lado del cliente, esta función solo se puede usar en un LocalScript .

Véase también:

Parámetros

gamepadNum: Enum.UserInputType

El Enum.UserInputType del controlador para juego.

gamepadKeyCode: Enum.KeyCode

El Enum.KeyCode del botón en cuestión.


Devuelve

Si el controlador de juegos proporcionado soporta un botón que coincida con el dado Enum.KeyCode .

Muestras de código

Binding Functions to Gamepad Controls

local UserInputService = game:GetService("UserInputService")
local ContextActionService = game:GetService("ContextActionService")
local controller = Enum.UserInputType.Gamepad1
local buttonX = Enum.KeyCode.ButtonX
local function isSupported(gamepad, keycode)
return UserInputService:GamepadSupports(gamepad, keycode)
end
local function action()
print("Action")
end
if isSupported(controller, buttonX) then
ContextActionService:BindAction("sample action", action, false, buttonX)
end

GetConnectedGamepads

Esta función devuelve un arreglo de Enum.UserInputType pads de juego actualmente conectados. Si no hay pads de juego conectados, este arreglo estará vacío. Además, sólo devuelve objetos de tipo de entrada que son pads de juego. Por instancia, este evento devolverá un objeto de tipo de entrada conectado pero no un objeto de teclado.

Por ejemplo, el siguiente código muestra cómo recuperar las plataformas de juego conectadas y almacenarlas en una variable llamada connectedGamepads .


local UserInputService = game:GetService("UserInputService")
local connectedGamepads = UserInputService:GetConnectedGamepads()

Para verificar si se ha conectado un controlador específico, use UserInputService:GetGamepadConnected() .

Como UserInputService es solo del lado del cliente, esta función solo se puede usar en un LocalScript .

Véase también:


Devuelve

Un arreglo de UserInputTypes que coincida con los gamepads conectados al dispositivo del usuario.

Muestras de código

How to Set the Active Gamepad for Input

local UserInputService = game:GetService("UserInputService")
local function getActiveGamepad()
local activeGamepad = nil
local connectedGamepads = UserInputService:GetConnectedGamepads()
if #connectedGamepads > 0 then
for _, gamepad in connectedGamepads do
if activeGamepad == nil or gamepad.Value < activeGamepad.Value then
activeGamepad = gamepad
end
end
end
if activeGamepad == nil then -- Nothing is connected; set up for "Gamepad1"
activeGamepad = Enum.UserInputType.Gamepad1
end
return activeGamepad
end
if UserInputService.GamepadEnabled then
local activeGamepad = getActiveGamepad()
print(activeGamepad)
end

GetDeviceAcceleration

La función GetDeviceAcceleration determina la aceleración actual del dispositivo del usuario. Se返回一个 InputObject que describe la aceleración actual del dispositivo.

Para que esto funcione, el dispositivo del usuario debe tener un acelerómetro habilitado. Para verificar si el dispositivo del usuario tiene un acelerómetro habilitado, puede verificar la propiedad UserInputService.AccelerometerEnabled .

Si desea rastrear cuando cambia la aceleración del dispositivo del usuario en su lugar, puede usar el evento UserInputService.DeviceAccelerationChanged .

Dado que solo se ejecuta localmente, solo se puede usar en un LocalScript .


Devuelve

Muestras de código

Print Device Acceleration

local UserInputService = game:GetService("UserInputService")
local accelerometerEnabled = UserInputService.AccelerometerEnabled
if accelerometerEnabled then
local acceleration = UserInputService:GetDeviceAcceleration().Position
print(acceleration)
else
print("Cannot get device acceleration because device does not have an enabled accelerometer!")
end

GetDeviceGravity

Esta función InputObject que describe el dispositivo's current gravity fuerza vectorial.

El vector de gravedad se determina por la orientación del dispositivo en relación con la fuerza de gravedad del mundo real. Por instancia, si un dispositivo está perfectamente erguido (retrato), el vector de gravedad es Vector3.new(0, 0, -9.18) . Si el lado izquierdo del dispositivo está apunt

Esta función se puede usar para habilitar el dispositivo del usuario para impactar o controlar la gravedad dentro del juego o mover objetos en el juego como una bola.

Solo se rastrea la gravedad para los jugadores que usan un dispositivo con un giroscopio habilitado, como un dispositivo móvil.

Para ver si el dispositivo de un usuario tiene un giroscopio habilitado, verifique el valor de UserInputService.GyroscopeEnabled . Si el dispositivo tiene un giroscopio habilitado, también puede usar el evento UserInputService.DeviceGravityChanged para rastrear cuando cambia la fuerza de gravedad en el dispositivo del usuario.

Como UserInputService es solo del lado del cliente, esta función solo se puede usar en un LocalScript .


Devuelve

Muestras de código

Moving Objects with the Gyroscope

local UserInputService = game:GetService("UserInputService")
local bubble = script.Parent:WaitForChild("Bubble")
local camera = workspace.CurrentCamera
camera.CameraType = Enum.CameraType.Scriptable
camera.CFrame = CFrame.new(0, 20, 0) * CFrame.Angles(-math.pi / 2, 0, 0)
if UserInputService.GyroscopeEnabled then
-- Bind event to when gyroscope detects change
UserInputService.DeviceGravityChanged:Connect(function(accel)
-- Move the bubble in the world based on the gyroscope data
bubble.Position = Vector3.new(-8 * accel.Position.X, 1.8, -8 * accel.Position.Z)
end)
end

GetDeviceRotation

Esta función返回一个 InputObject y un CFrame que describen el fuerza vectorialde rotación actual del dispositivo.

Esto se activa con un objeto de entrada. La propiedad Position del objeto de entrada es un Enum.InputType.Gyroscope que rastrea la rotación total en cada eje local.

La rotación del dispositivo solo se puede rastrear en dispositivos con un gyroscope .

Dado que esta función se ejecuta localmente, solo se puede usar en un LocalScript .


Devuelve

Un tutorial que contiene dos propiedades:

  1. La propiedad Delta describe la cantidad de rotación que tuvo lugar por última vez
  2. El CFrame es la rotación actual del dispositivo en relación con su marco de referencia predeterminado.

Muestras de código

Print Device Rotation

local UserInputService = game:GetService("UserInputService")
local gyroEnabled = UserInputService:GyroscopeEnabled()
if gyroEnabled then
local _inputObj, cframe = UserInputService:GetDeviceRotation()
print("CFrame: {", cframe, "}")
else
print("Cannot get device rotation because device does not have an enabled gyroscope!")
end

GetFocusedTextBox

Esta función devuelve el TextBox que el cliente está enfocado en este momento. Un TextBox se puede seleccionar manualmente por el usuario, o la selección se puede forzar usando la función TextBox:CaptureFocus(). Si no se selecciona ningún TextBox, esta función devolverá nil .

Como UserInputService es solo del lado del cliente, esta función solo se puede usar en un LocalScript .

Véase también:


Devuelve

Muestras de código

Ignore User Input When a TextBox Is Focused

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local jumpKey = Enum.KeyCode.J
local isJumping = false
local function InputBegan(input, _gameProcessedEvent)
local TextBoxFocused = UserInputService:GetFocusedTextBox()
-- Ignore input event if player is focusing on a TextBox
if TextBoxFocused then
return
end
-- Make player jump when user presses jumpKey Key on Keyboard
if input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode == jumpKey then
if not isJumping then
isJumping = true
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
end
end
end
local function StateChanged(_oldState, newState)
-- Prevent player from jumping again using jumpKey if already jumping
if newState == Enum.HumanoidStateType.Jumping then
isJumping = true
-- Allow player to jump again after landing
elseif newState == Enum.HumanoidStateType.Landed then
isJumping = false
end
end
UserInputService.InputBegan:Connect(InputBegan)
humanoid.StateChanged:Connect(StateChanged)

GetGamepadConnected

Esta función devuelve si un gamepad con el Enum.UserInputType está conectado al cliente.

Esto se puede usar para verificar si un controlador para juegoespecífico, como 'Gamepad1' está conectado al dispositivo del cliente.

Para recuperar una lista de todos los gamepads conectados, usa UserInputService:GetConnectedGamepads() .

Como UserInputService es solo del lado del cliente, esta función solo se puede usar en un LocalScript .

Véase también:

Parámetros

gamepadNum: Enum.UserInputType

El Enum.UserInputType del gamepad en cuestión.


Devuelve

Si una consola de juegos asociada con Enum.UserInputType está conectada.

Muestras de código

Check Whether a Gamepad is Connected

local UserInputService = game:GetService("UserInputService")
local isConnected = UserInputService:GetGamepadConnected(Enum.UserInputType.Gamepad1)
if isConnected then
print("Gamepad1 is connected to the client")
else
print("Gamepad1 is not connected to the client")
end

GetGamepadState

Esta función devuelve un arreglo de InputObjects para todos los controles disponibles en el controlador para juegodado, representando el estado de entrada de cada entrada.

Para encontrar el UserInputTypes de los gamepads conectados, usa UserInputService:GetConnectedGamepads() .

Dado que esta función solo se ejecuta localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

gamepadNum: Enum.UserInputType

El Enum.UserInputType correspondiente con el gamepad en cuestión.


Devuelve

Un arreglo de InputObjects representando el estado actual de todos los controles disponibles para la plataforma de juegos dada.

GetImageForKeyCode

ContentId

Este método toma el solicitado Enum.KeyCode y devuelve la imagen asociada para el dispositivo de juego conectado actual (limitado a Xbox, PlayStation y Windows). Esto significa que si el controlador conectado es un Control (ES_MX)Xbox, el usuario ve los elementos de Xbox. Del mismo modo, si el dispositivo conectado es un Control (ES_MX)PlayStation, el usuario ve los elementos de PlayStation.

Parámetros

keyCode: Enum.KeyCode

El Enum.KeyCode para el cual se recupera la imagen asociada.


Devuelve

ContentId

El ID de imagen devuelta.

Muestras de código

UserInputService - Get Image For KeyCode

local UserInputService = game:GetService("UserInputService")
local imageLabel = script.Parent
local key = Enum.KeyCode.ButtonA
local mappedIconImage = UserInputService:GetImageForKeyCode(key)
imageLabel.Image = mappedIconImage

GetKeysPressed

Esta función返回一个 array de InputObjects 与 las teclas actualmente presionadas.

Este array se puede repetir para determinar qué teclas se están presionando actualmente, utilizando los valores de InputObject.KeyCode .

Para verificar si se está presionando una llave específica, use UserInputService:IsKeyDown() .

Como UserInputService es solo del lado del cliente, esta función solo se puede usar en un LocalScript .


Devuelve

Un arreglo de InputObjects asociado con las teclas actualmente presionadas.

Muestras de código

Double Jump Key Combo

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local actionKey = Enum.KeyCode.LeftShift
local canJump = true
local canDoubleJump = false
local function jumpRequest()
local keysPressed = UserInputService:GetKeysPressed()
for _, key in ipairs(keysPressed) do
if key.KeyCode == actionKey and canJump then
canJump = false
canDoubleJump = true
end
end
end
local function stateChanged(oldState, newState)
-- Double jump during freefall if able to
if oldState == Enum.HumanoidStateType.Jumping and newState == Enum.HumanoidStateType.Freefall and canDoubleJump then
canDoubleJump = false
task.wait(0.2)
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
end
-- Allow player to jump again after they land
if oldState == Enum.HumanoidStateType.Freefall and newState == Enum.HumanoidStateType.Landed then
canJump = true
end
end
UserInputService.JumpRequest:Connect(jumpRequest)
humanoid.StateChanged:Connect(stateChanged)

GetLastInputType

Esta función返回 "enum.userinputtype" asociado con la entrada más reciente del usuario.

Por ejemplo, si el usuario ingresó anteriormente la barra espaciadora, el Enum.UserInputType devueltos serían 'Teclado' .

El evento UserInputService.LastInputTypeChanged se puede usar para rastrear cuando el último Enum.UserInputType usado por el usuario cambia.

Como UserInputService es solo del lado del cliente, esta función solo se puede usar en un LocalScript .


Devuelve

El Enum.UserInputType asociado con la entrada más reciente del usuario.

Muestras de código

UserInputService:GetLastInputType

local UserInputService = game:GetService("UserInputService")
local lastInput = UserInputService:GetLastInputType()
if lastInput == Enum.UserInputType.Keyboard then
print("Most recent input was via keyboard")
end

GetMouseButtonsPressed

Esta función devuelve un arreglo de InputObjects que coincide con los botones de ratón actualmente presionados.

Los botones de mouse que son rastreados por esta función incluyen:


<tr>
<td>Botón de ratón</td>
<td>El botón izquierdo del ratón.</td>
</tr>
<tr>
<td>Botón de ratón 2</td>
<td>El botón derecho del ratón.</td>
</tr>
<tr>
<td>Botón de ratón 3</td>
<td>El botón del ratón medio.</td>
</tr>
NombreDescripción

Si el usuario no está presionando ningún botón de mouse cuando se llama la función,返回一个空的 matriz/lista.

Como UserInputService es solo del lado del cliente, esta función solo se puede usar en un LocalScript .


Devuelve

Un arreglo de InputObjects que coincide con los botones de ratón actualmente apretados.

Muestras de código

Check which MouseButtons are Pressed

local UserInputService = game:GetService("UserInputService")
-- InputBegan is a UserInputService event that fires when the player
-- begins interacting via a Human-User input device
UserInputService.InputBegan:Connect(function(_input, _gameProcessedEvent)
-- Returns an array of the pressed MouseButtons
local buttons = UserInputService:GetMouseButtonsPressed()
local m1Pressed, m2Pressed = false, false
for _, button in pairs(buttons) do
if button.UserInputType.Name == "MouseButton1" then
print("MouseButton1 is pressed")
m1Pressed = true
end
if button.UserInputType.Name == "MouseButton2" then
print("MouseButton2 is pressed")
m2Pressed = true
end
if m1Pressed and m2Pressed then
print("Both mouse buttons are pressed")
end
end
end)

GetMouseDelta

Esta función devuelve el cambio, en píxeles, de la posición del jugador en el último marco de renderizado como un Mouse . Esta función solo funciona si el mouse ha sido bloqueado usando la propiedad Vector2 . Si el mouse no ha sido bloqueado, los valores de UserInputService.MouseBehavior devueltos serán

La sensibilidad del ratón, determinada en la configuración del cliente y UserInputService.MouseDeltaSensitivity, influirá en el resultado.

Como UserInputService es solo del lado del cliente, esta función solo se puede usar en un LocalScript .


Devuelve

Cambia en el movimiento del ratón.

Muestras de código

Getting Mouse Delta

local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local function OnRenderStep()
local delta = UserInputService:GetMouseDelta()
print("The mouse has moved", delta, "since the last step.")
end
RunService:BindToRenderStep("MeasureMouseMovement", Enum.RenderPriority.Input.Value, OnRenderStep)
Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

GetMouseLocation

Esta función返回一个 Vector2 representando la ubicación de pantalla actual del jugador's Mouse en píxeles relativo al rincón superior izquierdo. Esto no cuenta con el inserto GUI .

Si la ubicación del puntero del mouse está fuera de la pantalla o el dispositivo del jugador no tiene un ratón, el valor devuelto se determinará.

Como UserInputService es solo del lado del cliente, esta función solo se puede usar en un LocalScript .


Devuelve

Un Vector2 que representa la ubicación de la pantalla actual del ratón, en píxeles.

Muestras de código

Move GUI To Mouse Location

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local gui = script.Parent
local screenGui = gui.Parent
screenGui.IgnoreGuiInset = true
local function moveGuiToMouse()
local mouseLocation = UserInputService:GetMouseLocation()
gui.Position = UDim2.fromOffset(mouseLocation.X, mouseLocation.Y)
end
moveGuiToMouse()
RunService:BindToRenderStep("moveGuiToMouse", 1, moveGuiToMouse)

GetNavigationGamepads

Esta función返回一个游戏手柄的阵列 UserInputTypes que están conectados y habilitados para la navegación de GUI. Esta lista está en orden descendente de prioridad, lo que significa que se puede repetir para determinar qué gamepad debe tener control de navegación.

Si una plataforma de juegos conectada es un controlador de juegos de navegación, solo determina qué controlador para juego(es) controla las interfaces gráficas de usuario de navegación. Esto no afecta a los controles de navegación.

Dado que <Class.UserInputService> solo es client-side, esta función solo se puede usar en un LocalScript .

Véase también:


Devuelve

Un arreglo de UserInputTypes que se puede usar para la navegación de GUI, en orden descendente de prioridad.

GetStringForKeyCode

GetStringForKeyCode 返回一个代表键用户应该按下以输入指定 Enum.KeyCode 的字符串,并且考虑其键盘布局。 对于键代码 que requieren algunos modificadores para ser mantenidos,此函数将返回键以在键盘上按下,而不是在 modifier 上。请参阅下面的示例以获得更多说明。

Al usar Roblox con un diseño de teclado no QWERTY, los códigos de las teclas se mapearon a posiciones QWERTY equivalentes. Por ejemplo, presionar A


local UserInputService = game:GetService("UserInputService")
local textLabel = script.Parent
local mapKey = Enum.KeyCode.M
textLabel.Text = "Press " .. UserInputService:GetStringForKeyCode(mapKey) .. " to open the map"

Ejemplos en el teclado QWERTY


<tbody>
<tr>
<td><code>Ctrl.KeyCode.Q</code></td>
<td><code>P</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.W</code></td>
<td><code>W</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.Equals</code></td>
<td><code>=:</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.At</code></td>
<td><code>2</code> porque <code>@</code> está escrito con <kbd>Shift</kbd><kbd>2</kbd></td>
</tr>
</tbody>
Código de claveValor de devolución

Ejemplos en el teclado AZERTY


<tbody>
<tr>
<td><code>Ctrl.KeyCode.Q</code></td>
<td><code>Un</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.W</code></td>
<td><code>Z</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.Equals</code></td>
<td><code>=:</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.At</code></td>
<td><code>É</code></td>
</tr>
</tbody>
Código de claveValor de devolución

Uso de Gamepad

GetStringForKeyCode() devuelve la conversión de cadenas para el Enum.KeyCode para el controlador para juegoconectado más recientemente. Si el controlador no es compatible, la función devuelve la conversión de cadenas predeterminada para el código de solicitud.

El siguiente ejemplo muestra cómo puede mapear recursos personalizados para ButtonA :


local UserInputService = game:GetService("UserInputService")
local imageLabel = script.Parent
local key = Enum.KeyCode.ButtonA
local mappings = {
ButtonA = "rbxasset://BUTTON_A_ASSET", -- Replace with the desired ButtonA asset
ButtonCross = "rbxasset://BUTTON_CROSS_ASSET" -- Replace with the desired ButtonCross asset
}
local mappedKey = UserInputService:GetStringForKeyCode(key)
local image = mappings[mappedKey]
imageLabel.Image = image

Mapas de Gamepad

Los códigos de la placa de dirección no tienen ninguna diferencia según el dispositivo. Enum.KeyCode.ButtonSelect tiene un comportamiento ligeramente diferente en algunos casos. Usa ambos códigos de mapa de PlayStation para asegurarte de que los usuarios vean los botones correctos.


<tbody>
<tr>
<td><code>Enum.KeyCode.ButtonA</code></td>
<td><code>Interfaz de usuario cruzada</code></td>
<td><code>BotónA</code></td>
</tr>
<tr>
<td><code>Botón de código de lista de controles</code></td>
<td><code>Círculo de Botón</code></td>
<td><code>BotónB</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonX</code></td>
<td><code>Botón Cuadrado</code></td>
<td><code>BotónX</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonY</code></td>
<td><code>Triángulo de botón</code></td>
<td><code>BotónY</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonL1</code></td>
<td><code>BotónL1</code></td>
<td><code>BotónLB</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonL2</code></td>
<td><code>BotónL2</code></td>
<td><code>BotónLT</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonL3</code></td>
<td><code>BotónL3</code></td>
<td><code>Botón LS</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonR1</code></td>
<td><code>Botón R1</code></td>
<td><code>Botón RB</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonR2</code></td>
<td><code>BotónR2</code></td>
<td><code>BotónRT</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonR3</code></td>
<td><code>BotónR3</code></td>
<td><code>Botón RS</code></td>
</tr>
<tr>
<td><code>Entrada de código de biblioteca</code></td>
<td><code>Opciones de Botón</code></td>
<td><code>Inicio de botón</code></td>
</tr>
<tr>
<td><code>Botón de selección de código de idioma</code></td>
<td><code>Botón de toque de la consola</code> y <code>Compartir botón</code></td>
<td><code>BotónSeleccionar</code></td>
</tr>
</tbody>
Código de claveValor de PlayStation de regresoValor de devolución de Xbox

Imágenes del sistema para KeyCodes

Cuando se utiliza un Enum.KeyCode que se puede representar mejor como una imagen, como para un ImageLabel en una interfaz de usuario, puede usar los siguientes iconos de legado. Sin embargo, se recomienda que use GetImageForKeyCode() como un método más moderno y de cross-platform para recuperar los icon


<tbody>
<tr>
<td><code>Ctrl.KeyCode.ButtonX</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxX.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxX.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonY</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxY.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxY.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonA</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxA.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxA.png</code></td>
</tr>
<tr>
<td><code>Botón de código de lista de controles</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxB.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxB.png</code></td>
</tr>
<tr>
<td><code>PadLeft de Cupón de Clave de Derecho de Autor</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadLeft.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadLeft.png</code></td>
</tr>
<tr>
<td><code>PadRight de Cupón de Clave de Derecho</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadRight.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadRight.png</code></td>
</tr>
<tr>
<td><code>Pad de código de枚o.KeyCode.DPadUp</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadUp.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadUp.png</code></td>
</tr>
<tr>
<td><code>PadDown de Cupón de Clave de Enumeración</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadDown.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadDown.png</code></td>
</tr>
<tr>
<td><code>Botón de selección de código de idioma</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxView.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxView.png</code></td>
</tr>
<tr>
<td><code>Entrada de código de biblioteca</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxmenu.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxmenu.png</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonL1</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLB.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLB.png</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonR1</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRB.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRB.png</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonL2</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLT.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLT.png</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonR2</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRT.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRT.png</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonL3</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLS.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLS.png</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.ButtonR3</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRS.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRS.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.Thumbstick1</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLSDirectional.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLSDirectional.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.Thumbstick2</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRSDirectional.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRSDirectional.png</code></td>
</tr>
<tr>
<td><code>Ctrl.KeyCode.Backspace</code></td>
<td>
<img src="../../../assets/scripting/controls/backspace.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/backspace.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.Return</code></td>
<td>
<img src="../../../assets/scripting/controls/return.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/return.png</code></td>
</tr>
<tr>
<td><code>CtrlIzquierdo.Code.LeftShift</code></td>
<td>
<img src="../../../assets/scripting/controls/shift.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/shift.png</code></td>
</tr>
<tr>
<td><code>Ctrl.Shift.DerechoShift</code></td>
<td>
<img src="../../../assets/scripting/controls/shift.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/shift.png</code></td>
</tr>
<tr>
<td><code>Ctrl.Tabla de claves.KeyCode.Tab</code></td>
<td>
<img src="../../../assets/scripting/controls/tab.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/tab.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.Apostrophe</code></td>
<td>
<img src="../../../assets/scripting/controls/apostrophe.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/apostrophe.png</code></td>
</tr>
<tr>
<td><code>Ctrl.Comma.KeyCode.Comma</code></td>
<td>
<img src="../../../assets/scripting/controls/comma.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/comma.png</code></td>
</tr>
<tr>
<td><code>Ensamblador.KeyCode.Backquote</code></td>
<td>
<img src="../../../assets/scripting/controls/graveaccent.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/graveaccent.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.Periodo</code></td>
<td>
<img src="../../../assets/scripting/controls/period.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/ перио.png</code></td>
</tr>
<tr>
<td><code>Espacio de código de lista de valores</code></td>
<td>
<img src="../../../assets/scripting/controls/spacebar.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/spacebar.png</code></td>
</tr>
</tbody>
Código de claveImagenID de activo

Parámetros

keyCode: Enum.KeyCode

Devuelve

GetSupportedGamepadKeyCodes

Esta función devuelve un arreglo de KeyCodes que el gamepad asociado con el dado Enum.UserInputType soporta.

Esta función se puede usar para determinar qué KeyCodes se admiten y no se admiten por un controlador para juegoconectado. Para determinar si un código de clave específico se admite, usa UserInputService:GamepadSupports() .

Si se llama a un controlador para juegono existente, o no conectado, esta función devolverá un arreglo matriz/lista.

Como UserInputService es solo del lado del cliente, esta función solo se puede usar en un LocalScript .

Véase también:

Parámetros

gamepadNum: Enum.UserInputType

El Enum.UserInputType del controlador para juego.


Devuelve

Un arreglo de KeyCodes que es compatible con el controlador para juegodado.

Muestras de código

Binding Supported Gamepad KeyCodes

local UserInputService = game:GetService("UserInputService")
local ContextActionService = game:GetService("ContextActionService")
local function actionHandler(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print("Action Handler: " .. actionName)
print(inputObject)
end
-- Since this function does not return anything, this handler will
-- "sink" the input and no other action handlers will be called after
-- this one.
end
local navGamepads = UserInputService:GetNavigationGamepads()
for _, gamepad in pairs(navGamepads) do
local supportedKeyCodes = UserInputService:GetSupportedGamepadKeyCodes(gamepad)
for _, keycode in pairs(supportedKeyCodes) do
if keycode == Enum.KeyCode.ButtonX then
ContextActionService:BindAction("SampleAction", actionHandler, false, Enum.KeyCode.ButtonX)
end
if keycode == Enum.KeyCode.X then
ContextActionService:BindAction("SampleAction", actionHandler, false, Enum.KeyCode.X)
end
end
end

IsGamepadButtonDown

Esta función comprueba si se ha presionado un botón en un particular controlador para juego. Es devuelto true si el gamepad tiene el botón de prensado especificado button presionado, de lo contrario devuelve falso.

Tipos de entrada de usuario válidos

El controlador de juegos especificado debería ser uno de los siguientes valores de UserInputType:


<tr>
<td>Tipo de entrada de usuario.Gamepad1-8</td>
</tr>
Nombre

Códigos de clave válidos

El botón especificado debe ser uno de los siguientes valores de la lista de claves:


<tr>
<td>ButtonX de código de lista</td>
</tr>
<tr>
<td>Buttono de código de enlace</td>
</tr>
<tr>
<td>ButtonA de código de lista</td>
</tr>
<tr>
<td>Botón de código de enlace</td>
</tr>
<tr>
<td>Buttono de código de enlace</td>
</tr>
<tr>
<td>Buttono de código de enlace</td>
</tr>
<tr>
<td>Buttono de código de enlace de la interfaz de usuario.</td>
</tr>
<tr>
<td>Buttono de código de enlace</td>
</tr>
<tr>
<td>Buttono de código de enlace</td>
</tr>
<tr>
<td>Botón de código de lista</td>
</tr>
<tr>
<td>Inicio de código de botón de la interfaz de usuario</td>
</tr>
<tr>
<td>Botón de selección de código de enlace</td>
</tr>
<tr>
<td>PadLeft.Código de clave</td>
</tr>
<tr>
<td>Pad derecho del código de clave</td>
</tr>
<tr>
<td>Pad de código de dirección</td>
</tr>
<tr>
<td>PadDown</td>
</tr>
Nombre

Esto se puede usar para ver si un botón específico, como A, se está sosteniendo. Por ejemplo:


local UserInputService = game:GetService("UserInputService")
local button = Enum.KeyCode.ButtonA
local gamepad = Enum.UserInputType.Gamepad1
local isButtonHeld = UserInputService:IsGamepadButtonDown(gamepad, button)

Dado que <Class.UserInputService> solo es client-side, esta función solo se puede usar en un LocalScript .

Véase también:

Parámetros

gamepadNum: Enum.UserInputType

El Enum.UserInputType del controlador de juegos dado.

gamepadKeyCode: Enum.KeyCode

El Enum.KeyCode del botón especificado.


Devuelve

Si el botón de gamepad especificado en el gamepad dado se presiona.

Muestras de código

Special Action on Gamepad Button Combo

local UserInputService = game:GetService("UserInputService")
local activeGamepad = nil
local buttonX = Enum.KeyCode.ButtonX
local function isGamepadXDown()
if activeGamepad then
return UserInputService:IsGamepadButtonDown(activeGamepad, buttonX)
end
return false
end
local function input(_input, _gameProcessedEvent)
if not isGamepadXDown() then
-- Normal event
else
-- X Button down event
end
end
local function getActiveGamepad()
local activateGamepad = nil
local navigationGamepads = {}
navigationGamepads = UserInputService:GetNavigationGamepads()
if #navigationGamepads > 1 then
for i = 1, #navigationGamepads do
if activateGamepad == nil or navigationGamepads[i].Value < activateGamepad.Value then
activateGamepad = navigationGamepads[i]
end
end
else
local connectedGamepads = {}
connectedGamepads = UserInputService:GetConnectedGamepads()
if #connectedGamepads > 0 then
for i = 1, #connectedGamepads do
if activateGamepad == nil or connectedGamepads[i].Value < activateGamepad.Value then
activateGamepad = connectedGamepads[i]
end
end
end
if activateGamepad == nil then -- nothing is connected, at least set up for gamepad1
activateGamepad = Enum.UserInputType.Gamepad1
end
end
return activateGamepad
end
if UserInputService.GamepadEnabled then
activeGamepad = getActiveGamepad()
UserInputService.InputBegan:Connect(input)
end

IsKeyDown

Esta función返回 si el usuario está sosteniendo la llave asociada con el dado Enum.KeyCode .返回 true si la llave especificada se presiona o false si no se presiona.

Esto se puede usar para verificar si se está presionando una claveespecífica, como la barra espaciadora. Por ejemplo:


local UserInputService = game:GetService("UserInputService")
local spaceHeld = UserInputService:IsKeyDown(Enum.KeyCode.Space)

Para recuperar una lista de todas las teclas presionadas por el usuario, usa la función UserInputService:GetKeysPressed() .

Dado que <Class.UserInputService> solo es client-side, esta función solo se puede usar en un LocalScript .

Véase también:

Parámetros

keyCode: Enum.KeyCode

El Enum.KeyCode de la clave.


Devuelve

Si la llave especificada está siendo mantenida presionada.

Muestras de código

Special Action on Key Combo Press

local UserInputService = game:GetService("UserInputService")
local shiftKeyL = Enum.KeyCode.LeftShift
local shiftKeyR = Enum.KeyCode.RightShift
-- Return whether left or right shift keys are down
local function isShiftKeyDown()
return UserInputService:IsKeyDown(shiftKeyL) or UserInputService:IsKeyDown(shiftKeyR)
end
-- Handle user input began differently depending on whether a shift key is pressed
local function input(_input, _gameProcessedEvent)
if not isShiftKeyDown() then
-- Normal input
else
-- Shift input
end
end
UserInputService.InputBegan:Connect(input)

IsMouseButtonPressed

Esta función toma un botón de mouse Enum.UserInputType y devuelve un valor deBooleano que indica si está presionado actualmente.

El botón de ratón verificado depende del valor Enum.UserInputType pasado a la función como argumento. Por ejemplo:


local UserInputService = game:GetService("UserInputService")
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)

Dado que <Class.UserInputService> solo es client-side, esta función solo se puede usar en un LocalScript ".

Parámetros

mouseButton: Enum.UserInputType

El Enum.UserInputType del botón del ratón.


Devuelve

Si el botón de mouse que se da está actualmente apretado.

Muestras de código

Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

IsNavigationGamepad

Esta función true si el controlador de juego Enum.UserInputType especificado es permitido controlar la navegación y la selección GUIs .

Si quieres establecer un controlador para juegode navegación, puedes usar UserInputService:SetNavigationGamepad() . También puedes usar UserInputService:GetNavigationGamepads() para obtener una lista de todos los gamepads de navegación.

Por ejemplo, el código a continuación comprueba si el gamepad1 es como un controlador para juegode navegación:


local UserInputService = game:GetService("UserInputService")
if UserInputService:IsNavigationGamepad(UserInputType.Gamepad1) then
print("Gamepad is a navigation gamepad!")
else
print("Gamepad is not a navigation gamepad!")
end

Se puede recuperar una lista de todos los gamepads conectados, independientemente de la navegación usando`UserInput/GetConnectedGamepads.

Dado que <Class.UserInputService> solo es client-side, esta función solo se puede usar en un LocalScript .

Véase también:

Parámetros

gamepadEnum: Enum.UserInputType

El Enum.UserInputType del controlador para juegoespecificado.


Devuelve

Si la plataforma de juego especificada es una plataforma de juego de navegación.

RecenterUserHeadCFrame

void

Esta función centra el CFrame de la VR headset al orientación actual del headset usado por el usuario. Esto significa que la orientación actual del visorse establece en CFrame.new() .

Usa esta función para mover el CFrame de la cabeza al centro de la zona de juego si parece estar en un desplazamiento.

Esto se comporta idénticamente a la función VRService, VRService:RecenterUserHeadCFrame().

Dado que <Class.UserInputService> solo es client-side, esta función solo se puede usar en un LocalScript .


Devuelve

void

Muestras de código

UserInputService:RecenterUserHeadCFrame

local UserInputService = game:GetService("UserInputService")
UserInputService:RecenterUserHeadCFrame()

SetNavigationGamepad

void

La función SetNavigationGamepad establece si el gamepad especificado Enum.UserInputType puede mover el navegador de GUI. Un gamepad que está permitido para mover el navegador de GUI se considera un gamepad de navegación .

Si el argumento habilitado se pasa como true, el Gamepad puede mover el navegador de GUI. Si el argumento es false, el Gamepad no puede mover el navegador de GUI.

Si desea verificar si un Gamepad especificado es un set para ser un controlador para juegode navegación, puede usar la función UserInputService:IsNavigationGamepad(). También puede usar la función UserInputService:GetNavigationGamepads() para recuperar una lista de todos los Gamepads de navegación.

Dado que <Class.UserInputService> solo es client-side, esta función solo se puede usar en un LocalScript .

Véase también:

Parámetros

gamepadEnum: Enum.UserInputType

El Enum.UserInputType del controlador para juegoespecificado.

enabled: bool

Si la consola de juegos especificada puede mover el navegador de GUI.


Devuelve

void

Muestras de código

UserInputService:SetNavigationGamepad

local UserInputService = game:GetService("UserInputService")
UserInputService:SetNavigationGamepad(Enum.UserInputType.Gamepad1, true)

Eventos

DeviceAccelerationChanged

El evento DeviceAccelerationChanged se activa cuando un usuario se mueve un dispositivo que tiene un acelerómetro.

Un acelerómetro es un componente que se encuentra en la mayoría de los dispositivos móviles que mide la aceleración (cambio de velocidad).

Para determinar si el dispositivo de un usuario tiene un acelerómetro habilitado, see UserInputService.AccelerometerEnabled .

Este evento se puede usar para rastrear el movimiento de un dispositivo que tiene un acelerómetro. Un uso de ejemplo implica mover al personaje del jugador cuando un dispositivo móvil acelera.

Además, este evento se puede utilizar junto con UserInputService:GetDeviceAcceleration() para determinar el movimiento actual de un dispositivo del usuario si el dispositivo tiene un acelerómetro.

Este evento solo se activa localmente, lo que significa que solo el jugador cuyo dispositivo se mueve puede usar el evento y solo funcionará en un LocalScript .

Parámetros

acceleration: InputObject

Un InputObject , con un UserInputType de Accelerómetro y 2>Class.InputObject.Position|Position2> que muestra la fuerza de gravedad en cada eje local.


Muestras de código

Control Players Using the Accelerometer

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local SENSITIVITY = 0.2
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local ready = true
local function changeAcceleration(acceleration)
if ready then
ready = false
local accel = acceleration.Position
if accel.Y >= SENSITIVITY then
humanoid.Jump = true
end
if accel.Z <= -SENSITIVITY then
humanoid:Move(Vector3.new(-1, 0, 0))
end
if accel.Z >= SENSITIVITY then
humanoid:Move(Vector3.new(1, 0, 0))
end
if accel.X <= -SENSITIVITY then
humanoid:Move(Vector3.new(0, 0, 1))
end
if accel.X >= SENSITIVITY then
humanoid:Move(Vector3.new(0, 0, -1))
end
task.wait(1)
ready = true
end
end
UserInputService.DeviceAccelerationChanged:Connect(changeAcceleration)

DeviceGravityChanged

El evento UserInputService.DeviceGravityChanged activa cuando la gravedad del dispositivo Vector3 cambia en un dispositivo que tiene un acelerómetro.

El vector de gravedad de un dispositivo representa la fuerza de la gravedad en cada uno de los ejes X, Y y Z del dispositivo. Mientras que la gravedad nunca cambia, la fuerza que ejerce en cada eje cambia cuando el dispositivo gira y cambia la orientación. El valor de fuerza que se ejerce en cada eje es un vehículo de unidad que va desde -1 a 1.

Un acelerómetro es un componente que se encuentra en la mayoría de los dispositivos móviles que mide la aceleración (cambio de velocidad).

Este evento se puede usar para determinar la dirección del mundo real de la fuerza de gravedad en el dispositivo del usuario. Esto incluso se puede usar para simular la fuerza de gravedad en el dispositivo del usuario dentro del juego, como en los objetos del juego (ver ejemplo a continuación).

Para ver si el dispositivo de un usuario tiene un acelerómetro habilitado, see UserInputService.AccelerometerEnabled . Si el dispositivo tiene un acelerómetro habilitado, puede usar la función UserInputService:GetDeviceGravity() para obtener la fuerza de gravedad actual en el dispositivo del usuario.

Parámetros

gravity: InputObject

Un InputObject, con una propiedad InputObject.Position que muestra la fuerza de la gravedad en cada eje local. Esta posición se puede utilizar como una dirección para determinar la dirección de la gravedad relativa a la dispositivo.


Muestras de código

Move a Ball using the Accelerometer

local Workspace = game:GetService("Workspace")
local UserInputService = game:GetService("UserInputService")
local ball = script.Parent:WaitForChild("Ball")
local mass = ball:GetMass()
local gravityForce = ball:WaitForChild("GravityForce")
local function moveBall(gravity)
gravityForce.Force = gravity.Position * Workspace.Gravity * mass
end
if UserInputService.AccelerometerEnabled then
UserInputService.DeviceGravityChanged:Connect(moveBall)
end
Create a Gyroscopic Camera

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local camera = workspace.CurrentCamera
local currentRotation = camera.CFrame -- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
task.wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -0.5 or gravity.Position.Z > 0.5)
orientationSet = true
end
end
local function RotationChanged(_rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x, y, z = delta:ToEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs(character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0, 8, 10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0, 0, -10))
end)
end

DeviceRotationChanged

El evento DeviceRotationChanged se activa cuando un usuario gira un dispositivo que tiene un giroscopio.

Un giroscopio es un componente que se encuentra en la mayoría de los dispositivos móviles que detecta la orientación y la velocidad de rotación.

El evento es útil para rastrear la orientación del dispositivo y cómo cambia a medida que el usuario gira su dispositivo. Para determinar la actualización de la rotación del dispositivo, puede usar la función UserInputService:GetDeviceRotation().

Para ver si el dispositivo de un usuario tiene un giroscopio habilitado y que este evento se desencadenar, vea UserInputService.GyroscopeEnabled .

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Parámetros

rotation: InputObject

Un InputObject que proporciona información sobre la rotación del dispositivo. InputObject.Position representa el nuevo valor de rotación de un Vector3 y 1> Class.InputObj.Delta1> representa el cambio de rotación en un valor posicional de 4> Datatype.Vector34> posicional.

cframe: CFrame

Un CFrame que representa la orientación actual del dispositivo.


Muestras de código

Create a Gyroscopic Camera

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local camera = workspace.CurrentCamera
local currentRotation = camera.CFrame -- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
task.wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -0.5 or gravity.Position.Z > 0.5)
orientationSet = true
end
end
local function RotationChanged(_rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x, y, z = delta:ToEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs(character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0, 8, 10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0, 0, -10))
end)
end
Move a Ball using the Accelerometer

local Workspace = game:GetService("Workspace")
local UserInputService = game:GetService("UserInputService")
local ball = script.Parent:WaitForChild("Ball")
local mass = ball:GetMass()
local gravityForce = ball:WaitForChild("GravityForce")
local function moveBall(gravity)
gravityForce.Force = gravity.Position * Workspace.Gravity * mass
end
if UserInputService.AccelerometerEnabled then
UserInputService.DeviceGravityChanged:Connect(moveBall)
end

GamepadConnected

El evento GamepadConnected se activa cuando se conecta un gamepad al cliente.

Dado que un juego de Roblox soporta múltiples controladores, este evento es útil cuando se empareja con el evento UserInputService.GamepadDisconnected para rastrear qué controladores / gamepads están activos. También puedes usar UserInputService:GetConnectedGamepads() para encontrar el controlador / gamepad correcto para usar.

El siguiente ejemplo muestra un ejemplo de uso de un seguimiento cuando se conecta un gamepad al cliente.


local UserInputService = game:GetService("UserInputService")
local function GamepadConnected(gamepad)
print("Player has plugged controller: " .. tostring(gamepad))
end)
UserInputService.GamepadConnected:Connect(GamepadConnected)

Si desea ver qué dispositivos están conectados, puede usar la función UserInputService:GetConnectedGamepads() .

Dado que este evento se activa localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

gamepadNum: Enum.UserInputType

El Enum.UserInputType del controlador para juegoconectado.


GamepadDisconnected

El evento GamepadDisconnected se activa cuando se desconecta un gamepad.

Dado que un juego de Roblox soporta múltiples controladores, este evento es útil cuando se empareja con el evento UserInputService.GamepadConnected para rastrear qué controladores / gamepads están activos. También puedes usar UserInputService:GetConnectedGamepads() para encontrar el controlador / gamepad correcto para usar.

El siguiente ejemplo muestra un ejemplo de uso de un seguimiento cuando se desconecta un gamepad del cliente.


local UserInputService = game:GetService("UserInputService")
local function GamepadDisconnected(gamepad)
print("Player has unplugged controller: " .. tostring(gamepad))
end)
UserInputService.GamepadDisconnected:Connect(GamepadDisconnected)

Dado que este evento se activa localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

gamepadNum: Enum.UserInputType

El Enum.UserInputType del controlador para juegodesconectado.


InputBegan

El evento Inicio de sesión de inicio se activa cuando un usuario comienza a interactuar a través de un dispositivo de interfaz humana-ordenador (botón de ratón, toque comienzo, botón de teclado, etc.).

Se puede usar para rastrear el comienzo de la interacción del usuario, como cuando un usuario interactúa con un elemento de GUI, una consola de juegos, etc. No captura el movimiento del mouse.

Este evento se puede utilizar junto con UserInputService.InputChanged y UserInputService.InputEnded para rastrear cuando comienza, cambia y termina la entrada del usuario.

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Parámetros

Una instancia de InputObject que contiene información sobre la entrada del usuario.

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

Handling InputBegan

-- In order to use the InputBegan event, the UserInputService service must be used
local UserInputService = game:GetService("UserInputService")
-- A sample function providing multiple usage cases for various types of user input
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if input.UserInputType == Enum.UserInputType.Keyboard then
print("A key is being pushed down! Key:", input.KeyCode)
elseif input.UserInputType == Enum.UserInputType.MouseButton1 then
print("The left mouse button has been pressed down at", input.Position)
elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
print("The right mouse button has been pressed down at", input.Position)
elseif input.UserInputType == Enum.UserInputType.Touch then
print("A touchscreen input has started at", input.Position)
elseif input.UserInputType == Enum.UserInputType.Gamepad1 then
print("A button is being pressed on a gamepad! Button:", input.KeyCode)
end
if gameProcessed then
print("The game engine internally observed this input!")
else
print("The game engine did not internally observe this input!")
end
end)

InputChanged

El evento cambiado de entrada se activa cuando un usuario cambia cómo interactúa a través de un dispositivo de interfaz humana-ordenador (botón de ratón, toque comienzo, botón de teclado, etc).

Para ignorar los eventos que se manejan automáticamente por Roblox, como el desplazamiento en un ScrollingFrame , compruebe si el argumento gameProcessingEvent es falso. Este evento se puede usar junto con UserInputService.InputBegan y 2> Class.UserInputService.InputEnded2> para rastrear cuando el usuario ingresa,

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Parámetros

Una instancia de InputObject que contiene información sobre la entrada del usuario.

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

Handling InputChanged

-- In order to use the InputChanged event, the UserInputService service must be used
local UserInputService = game:GetService("UserInputService")
-- Prints the current input position and the change (delta) in position
local function printMovement(input)
print("Position:", input.Position)
print("Movement Delta:", input.Delta)
end
-- A sample function providing multiple usage cases for various types of user input
local function InputChanged(input, _gameProcessed)
if input.UserInputType == Enum.UserInputType.MouseMovement then
print("The mouse has been moved!")
printMovement(input)
elseif input.UserInputType == Enum.UserInputType.MouseWheel then
print("The mouse wheel has been scrolled!")
print("Wheel Movement:", input.Position.Z)
elseif input.UserInputType == Enum.UserInputType.Gamepad1 then
if input.KeyCode == Enum.KeyCode.Thumbstick1 then
print("The left thumbstick has been moved!")
printMovement(input)
elseif input.KeyCode == Enum.KeyCode.Thumbstick2 then
print("The right thumbstick has been moved!")
printMovement(input)
elseif input.KeyCode == Enum.KeyCode.ButtonL2 then
print("The pressure being applied to the left trigger has changed!")
print("Pressure:", input.Position.Z)
elseif input.KeyCode == Enum.KeyCode.ButtonR2 then
print("The pressure being applied to the right trigger has changed!")
print("Pressure:", input.Position.Z)
end
elseif input.UserInputType == Enum.UserInputType.Touch then
print("The user's finger is moving on the screen!")
printMovement(input)
elseif input.UserInputType == Enum.UserInputType.Gyro then
local _rotInput, rotCFrame = UserInputService:GetDeviceRotation()
local rotX, rotY, rotZ = rotCFrame:toEulerAnglesXYZ()
local rot = Vector3.new(math.deg(rotX), math.deg(rotY), math.deg(rotZ))
print("The rotation of the user's mobile device has been changed!")
print("Position", rotCFrame.p)
print("Rotation:", rot)
elseif input.UserInputType == Enum.UserInputType.Accelerometer then
print("The acceleration of the user's mobile device has been changed!")
printMovement(input)
end
end
UserInputService.InputChanged:Connect(InputChanged)

InputEnded

El evento Terminado de entrada se activa cuando un usuario deja de interactuar a través de un dispositivo de interfaz humana-ordenador (botón de ratón, toque comienzo, botón de teclado, etc). Esto es útil cuando se rastrea cuando un usuario libera una clavedel teclado, botón del ratón, toque la pantalla, etc.

Este evento se puede utilizar junto con UserInputService.InputBegan y UserInputService.InputChanged para rastrear cuando comienza, cambia y termina la entrada del usuario.

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Parámetros

Una instancia de InputObject que contiene información sobre la entrada del usuario.

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

Handling InputEnded

-- In order to use the InputChanged event, the UserInputService service must be used
local UserInputService = game:GetService("UserInputService")
-- A sample function providing multiple usage cases for various types of user input
UserInputService.InputEnded:Connect(function(input, gameProcessed)
if input.UserInputType == Enum.UserInputType.Keyboard then
print("A key has been released! Key:", input.KeyCode)
elseif input.UserInputType == Enum.UserInputType.MouseButton1 then
print("The left mouse button has been released at", input.Position)
elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
print("The right mouse button has been released at", input.Position)
elseif input.UserInputType == Enum.UserInputType.Touch then
print("A touchscreen input has been released at", input.Position)
elseif input.UserInputType == Enum.UserInputType.Gamepad1 then
print("A button has been released on a gamepad! Button:", input.KeyCode)
end
if gameProcessed then
print("The game engine internally observed this input!")
else
print("The game engine did not internally observe this input!")
end
end)

JumpRequest

El evento UserInputService JumpRequest se activa cuando hay una solicitud de salto del cliente, por ejemplo, cuando el cliente presiona la barra espaciadora o el botón de salto en el móvil.

Este evento se activa cuando el usuario intenta hacer su salto de Player.Character . El comportamiento predeterminado responde a una solicitud de salto estableciendo la propiedad de salto del jugador a true, lo que hace que el personaje del jugador salte.

El evento se puede usar para rastrear cada vez que un jugador quiere saltar. En lugar de usarlo para hacer que un jugador salte, se debe usar para cambiar el comportamiento de salto predeterminado - como desactivar el salto.

Por ejemplo, el código a continuación imprime "Salto" cada vez que el jugador envía una solicitud de salto.


local UserInputService = game:GetService("UserInputService")
function onJumpRequest()
print("Jump!")
end
UserInputService.JumpRequest:Connect(onJumpRequest)

Dado que este evento se dispara varias veces para una sola solicitud de salto, se recomienda el uso de un debounce .

Si desea conectar teclas o botones a otras acciones, considere usar eventos como UserInputService:GetKeysPressed() y UserInputService.InputBegan o el ContextActionService .

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .


Muestras de código

Disable Jumping

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
-- Fires when the user tries to jump
local function jump()
humanoid:SetStateEnabled(Enum.HumanoidStateType.Jumping, false)
end
UserInputService.JumpRequest:Connect(jump)

LastInputTypeChanged

El evento UserInputService.LastInputTypeChanged ocurre cada vez que el cliente cambia cómo están interactuando a través de un dispositivo de interfaz humana-ordenador. (i.e. desde MouseMovement a MouseWheel o desde Thumbstick1 a Thumbstick2).

Para obtener el valor de la última entrada, independientemente de si ha cambiado, puede usar la función UserInputService:GetLastInputType() .

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Parámetros

lastInputType: Enum.UserInputType

Un Enum.UserInputType que indica el último introducirde entrada.


Muestras de código

Hide Mouse During Keyboard Input

local UserInputService = game:GetService("UserInputService")
local mouseInput = {
Enum.UserInputType.MouseButton1,
Enum.UserInputType.MouseButton2,
Enum.UserInputType.MouseButton3,
Enum.UserInputType.MouseMovement,
Enum.UserInputType.MouseWheel,
}
local keyboard = Enum.UserInputType.Keyboard
local function toggleMouse(lastInputType)
if lastInputType == keyboard then
UserInputService.MouseIconEnabled = false
return
end
for _, mouse in pairs(mouseInput) do
if lastInputType == mouse then
UserInputService.MouseIconEnabled = true
return
end
end
end
UserInputService.LastInputTypeChanged:Connect(toggleMouse)

PointerAction

PointerAction se activa cuando el usuario realiza una acción de puntería específica. En particular, desplazando la rueda del mouse.

Parámetros

wheel: number
pan: Vector2
pinch: number
gameProcessedEvent: bool

TextBoxFocusReleased

El evento TextBoxFocusRelease se activa cuando un cliente pierde el enfoque en un TextBox - generalmente cuando un cliente deja de ingresar el texto en un TextBox presionando Return o haciendo clic / tocando en cualquier otro lugar de la pantalla.

Por ejemplo, el código a continuación imprime el nombre de la TextBox que pierde enfoque cuando el evento se activa.


local UserInputService = game:GetService("UserInputService")
function TextBoxFocusReleased(textbox)
print(textbox.Name)
end
UserInputService.TextBoxFocusReleased:Connect(TextBoxFocusReleased)

Puede usarse junto con UserInputService.TextBoxFocused para rastrear cuando un TextBox gana y pierde enfoque.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

textboxReleased: TextBox

El TextBox que perdió el enfoque.


Muestras de código

TextBoxFocusReleased

local UserInputService = game:GetService("UserInputService")
UserInputService.TextBoxFocusReleased:Connect(function(textbox)
print("The name of the released focus TextBox is " .. textbox.Name)
end)

TextBoxFocused

El evento TextBoxFocused se activa cuando un ganancia se enfoca en un TextBox - generalmente cuando un cliente hace clic / toca en una caja de texto para comenzar a escribir texto. Esto también se activa si un enfoque de caja de texto se enfoca usando TextBox:CaptureFocus() .

Por ejemplo, el código a continuación imprime el nombre de la TextBox enfocada cuando se activa el evento.


local UserInputService = game:GetService("UserInputService")
function TextBoxFocused(textbox)
print(textbox.Name)
end)
UserInputService.TextBoxFocused:Connect(TextBoxFocused)

Puede usarse junto con UserInputService.FocusReleased para rastrear cuando una caja de texto gana y pierde enfoque.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

textboxFocused: TextBox

El TextBox que ganó enfoque.


Muestras de código

Modifying a TextBox on Focused and FocusReleased

local UserInputService = game:GetService("UserInputService")
local function textBoxFocused(textBox)
textBox.BackgroundTransparency = 0
end
local function textBoxFocusReleased(textBox)
textBox.BackgroundTransparency = 0.7
end
UserInputService.TextBoxFocused:Connect(textBoxFocused)
UserInputService.TextBoxFocusReleased:Connect(textBoxFocusReleased)

TouchEnded

El evento TouchEnded se activa cuando un usuario suelta su dedo de la pantalla de un dispositivo TouchEnabled, terminando la entrada táctil con el dispositivo.

Este evento se puede usar para determinar cuando un usuario deja de tocar la pantalla de su dispositivo. Puede ser combinado con UserInputService.TouchStarted para determinar cuando un usuario comienza y termina tocando la pantalla.

Por ejemplo, el código a continuación imprime la posición de la pantalla donde el usuario deja de tocar la pantalla.


local UserInputService = game:GetService("UserInputService")
function TouchEnded(touch, gameProcessedEvent)
print("Touch ended at " .. tostring(touch.Position))
end
UserInputService.TouchEnded:Connect(TouchEnded)

El objeto de entrada táctil es el mismo objeto de entrada a lo largo de toda la vida del toque. Así que comparar InputObjects cuando son objetos táctiles es válido para determinar si es el mismo dedo.

Para comprobar si el dispositivo de un usuario está TouchEnabled y que los eventos de toque se desencadenar, consulte UserInputService.TouchEnabled .

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

Una instancia de InputObject que contiene información sobre la entrada del usuario.

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

The Difference Between TouchTap and TouchLongPress

local UserInputService = game:GetService("UserInputService")
-- The parent of this script (a ScreenGui)
local touchScreenGui = script.Parent
-- Create the GUI frame that the user interacts with through Touch
-- events
local touchGui = Instance.new("Frame")
touchGui.Name = "TouchGui"
touchGui.AnchorPoint = Vector2.new(0.5, 0.5)
-- Fires when the touches their device's screen
local function TouchTap(touchPositions, _gameProcessedEvent)
touchGui.Parent = touchScreenGui
touchGui.Position = UDim2.new(0, touchPositions[1].X, 0, touchPositions[1].Y)
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Fires when a user starts touching their device's screen and does not
-- move their finger for a short period of time
local function TouchLong(_touchPositions, _state, _gameProcessedEvent)
touchGui.Size = UDim2.new(0, 100, 0, 100)
end
-- Fires when the user moves their finger while touching their device's
-- screen
local function TouchMove(touch, _gameProcessedEvent)
touchGui.Position = UDim2.new(0, touch.Position.X, 0, touch.Position.Y)
end
-- Fires when the user stops touching their device's screen
local function TouchEnd(_touch, _gameProcessedEvent)
touchGui.Parent = nil
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Only use the Touch events if the user is on a mobile device
if UserInputService.TouchEnabled then
UserInputService.TouchTap:Connect(TouchTap)
UserInputService.TouchLongPress:Connect(TouchLong)
UserInputService.TouchMoved:Connect(TouchMove)
UserInputService.TouchEnded:Connect(TouchEnd)
end

TouchLongPress

Se activa cuando un usuario sostiene al menos un dedo por un corto período de tiempo en la misma posición de pantalla de un dispositivo TouchEnabled.

Este evento se puede usar para determinar cuando un usuario mantiene su dedo hacia abajo en un GUI o elemento.

El ejemplo a continuación imprime el state de la presión larga cuando el usuario sostiene al menos un dedo por un corto período de tiempo en la misma posición de la pantalla. Los estados posibles incluyen: Comenzar , Cambiar , 1> Finalizar 1> , 4> Cancelar 4> y 7> Ninguno7> .


local UserInputService = game:GetService("UserInputService")
function TouchLongPress(TouchPositions, state, gameProcessedEvent)
print("Long press event fired. State of press: " .. tostring(state))
end
UserInputService.TouchLongPress:Connect(TouchLongPress)

Para comprobar si el dispositivo de un usuario está TouchEnabled y que los eventos de toque se desencadenar, vea UserInputService.TouchEnabled .

Puede ser emparejado con UserInputService.TouchStarted y UserInputService.TouchEnded para determinar cuándo un usuario comienza y termina tocando la pantalla.

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

touchPositions: Array

Un arreglo de Vector2 objetos, que indica la posición de los dedos implicados en el gesto.

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

The Difference Between TouchTap and TouchLongPress

local UserInputService = game:GetService("UserInputService")
-- The parent of this script (a ScreenGui)
local touchScreenGui = script.Parent
-- Create the GUI frame that the user interacts with through Touch
-- events
local touchGui = Instance.new("Frame")
touchGui.Name = "TouchGui"
touchGui.AnchorPoint = Vector2.new(0.5, 0.5)
-- Fires when the touches their device's screen
local function TouchTap(touchPositions, _gameProcessedEvent)
touchGui.Parent = touchScreenGui
touchGui.Position = UDim2.new(0, touchPositions[1].X, 0, touchPositions[1].Y)
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Fires when a user starts touching their device's screen and does not
-- move their finger for a short period of time
local function TouchLong(_touchPositions, _state, _gameProcessedEvent)
touchGui.Size = UDim2.new(0, 100, 0, 100)
end
-- Fires when the user moves their finger while touching their device's
-- screen
local function TouchMove(touch, _gameProcessedEvent)
touchGui.Position = UDim2.new(0, touch.Position.X, 0, touch.Position.Y)
end
-- Fires when the user stops touching their device's screen
local function TouchEnd(_touch, _gameProcessedEvent)
touchGui.Parent = nil
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Only use the Touch events if the user is on a mobile device
if UserInputService.TouchEnabled then
UserInputService.TouchTap:Connect(TouchTap)
UserInputService.TouchLongPress:Connect(TouchLong)
UserInputService.TouchMoved:Connect(TouchMove)
UserInputService.TouchEnded:Connect(TouchEnd)
end

TouchMoved

El evento TouchMoved se activa cuando un usuario mueve su dedo en un dispositivo habilitado para tocar.

Este evento se puede usar para determinar cuando un usuario mueve su dedo mientras toca la pantalla de un dispositivo habilitado para tocar. Puede ser útil rastrear si un usuario está moviendo su dedo en la pantalla, así como dónde está moviendo su dedo.

El código a continuación imprime "Touch moved from" la posición anterior de Vector2 "a" la nueva posición de Vector2 de la mano del usuario en un dispositivo TouchEnabled.


local UserInputService = game:GetService("UserInputService")
function onTouchMoved(touch, gameProcessedEvent)
local oldPosition = touch.Position - touch.Delta
print("Touch moved from " .. tostring(oldPosition) .. "to " .. tostring(touch.Position))
end
UserInputService.TouchMoved:Connect(onTouchMoved)

Puede ser emparejado con UserInputService.TouchStarted y UserInputService.TouchEnded para determinar cuándo un usuario comienza a tocar la pantalla, cómo se mueve su dedo mientras la toca y cuándo deja de tocar la pantalla.

Para comprobar si el dispositivo de un usuario está TouchEnabled y que los eventos de toque se desencadenar, consulte UserInputService.TouchEnabled .

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

Una instancia de InputObject que contiene información sobre la entrada del usuario.

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

The Difference Between TouchTap and TouchLongPress

local UserInputService = game:GetService("UserInputService")
-- The parent of this script (a ScreenGui)
local touchScreenGui = script.Parent
-- Create the GUI frame that the user interacts with through Touch
-- events
local touchGui = Instance.new("Frame")
touchGui.Name = "TouchGui"
touchGui.AnchorPoint = Vector2.new(0.5, 0.5)
-- Fires when the touches their device's screen
local function TouchTap(touchPositions, _gameProcessedEvent)
touchGui.Parent = touchScreenGui
touchGui.Position = UDim2.new(0, touchPositions[1].X, 0, touchPositions[1].Y)
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Fires when a user starts touching their device's screen and does not
-- move their finger for a short period of time
local function TouchLong(_touchPositions, _state, _gameProcessedEvent)
touchGui.Size = UDim2.new(0, 100, 0, 100)
end
-- Fires when the user moves their finger while touching their device's
-- screen
local function TouchMove(touch, _gameProcessedEvent)
touchGui.Position = UDim2.new(0, touch.Position.X, 0, touch.Position.Y)
end
-- Fires when the user stops touching their device's screen
local function TouchEnd(_touch, _gameProcessedEvent)
touchGui.Parent = nil
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Only use the Touch events if the user is on a mobile device
if UserInputService.TouchEnabled then
UserInputService.TouchTap:Connect(TouchTap)
UserInputService.TouchLongPress:Connect(TouchLong)
UserInputService.TouchMoved:Connect(TouchMove)
UserInputService.TouchEnded:Connect(TouchEnd)
end

TouchPan

El evento TouchPan se activa cuando un usuario arrastra al menos un dedo en un dispositivo TouchEnabled .

Este evento se puede usar para determinar cuando un usuario mueve su dedo a lo largo de la pantalla de un dispositivo de toque habilitado - como para rotar el Camera en un guión de cámara script.

El fragmento de abajo imprime "Velocidad de arrastre del toque" seguido por la velocidad del toque del usuario cuando el usuario arrastra su dedo en la pantalla.


local UserInputService = game:GetService("UserInputService")
UserInputService.TouchPan:Connect(function(touchPositions, totalTranslation, velocity, state, gameProcessedEvent)
print("Speed of touch drag: " .. tostring(velocity))
end)

Echa un vistazo a otra útil función de UserInputService aquí UserInputService.TouchRotate .

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

touchPositions: Array

Un arreglo de Vector2 objetos, que indica las posiciones de los toques (por ejemplo, dedos) implicados en el gesto.

totalTranslation: Vector2

El tamaño del gesto de la sartén desde el principio hasta el final (en píxeles).

velocity: Vector2

La velocidad del gesto de la cazuela (en píxeles) por segundo.

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

TouchPinch

Se activa cuando un usuario coloca y mueve dos dedos en la pantalla de un dispositivo TouchEnabled .

Por instancia, el siguiente fragmento de código muestra cuánto ha cambiado el escalado de enfoque de la cámara desde el principio del toque.


local UserInputService = game:GetService("UserInputService")
UserInputService.TouchPinch:Connect(function(touchPositions, scale, velocity, state, gameProcessedEvent)
print("Scale difference since beginning of pinch: " .. tostring(scale))
end)

Para comprobar si el dispositivo de un usuario está TouchEnabled y que los eventos de toque se desencadenar, consulte UserInputService.TouchEnabled .

Este evento solo se activa cuando la ventana del cliente de Roblox esté en enfoque. Por ejemplo, los ingresos no se capturarán cuando la ventana esté minimizada. Como este evento solo se activa localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

touchPositions: Array

Un array de Vector2s , que indica la posición de la pantalla, en píxeles, de los dedos implicados en el gesto de pinch.

scale: number

La magnitud de la pinza desde el principio hasta el final (en píxeles) dividida por las posiciones de la pinza de inicio.

velocity: number

La velocidad del gesto de pinch (en píxeles) por segundo.

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

TouchRotate

El evento TouchRotate se activa cuando un usuario gira dos dedos en un dispositivo TouchEnabled .

Por ejemplo, el siguiente código imprime cuánto la cámara ha girado desde el comienzo de la rotación táctil.


local UserInputService = game:GetService("UserInputService")
UserInputService.TouchRotate:Connect(function(touchPositions, rotation, velocity, state, gameProcessedEvent)
print("Camera has rotated " .. tostring(rotation) .. " degrees!")
end)

Para comprobar si el dispositivo de un usuario está TouchEnabled y que los eventos de toque se desencadenar, consulte UserInputService.TouchEnabled .

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Los scripts principales que controlan la cámara del usuario en un dispositivo móvil usan código que funciona similarmente a este evento. La mejor práctica para este evento es usarlo al crear un sistema de cámara móvil para sobrescribir los scripts principales predeterminados.

Véase también:

Parámetros

touchPositions: Array

Un arreglo de Vector2s , que indica las posiciones de los dedos implicados en el gesto.

rotation: number

El número de grado que ha girado el gesto desde el comienzo del gesto.

velocity: number

El cambio en la rotación (en grados) dividido por la duración del cambio (en segundos).

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

TouchStarted

El evento TouchStarted se activa cuando un usuario coloca su dedo en un dispositivo TouchEnabled , comenzando la entrada de touch con el dispositivo.

Este evento se puede usar para determinar cuando un usuario comienza a tocar la pantalla de su dispositivo. Se puede emparejar con UserInputService.TouchEnded para determinar cuando un usuario comienza y termina tocando la pantalla.

El objeto de entrada táctil es el mismo objeto de entrada a lo largo de toda la vida del toque. Así que comparar InputObjects cuando son objetos táctiles es válido para determinar si es el mismo dedo.

Para comprobar si el dispositivo de un usuario está TouchEnabled y que los eventos de toque se desencadenar, consulte UserInputService.TouchEnabled .

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

Una instancia de InputObject que contiene información sobre la entrada del usuario.

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

Tracking Touches

local UserInputService = game:GetService("UserInputService")
local dragging
local dragInput
local dragStart
local startPos
local gui = script.Parent
local function touchStarted(input, _gameProcessed)
if not dragging then
dragging = true
dragInput = input
dragStart = input.Position
startPos = gui.Position
end
end
local function update(input, _gameProcessed)
if input == dragInput and dragging then
local delta = input.Position - dragStart
gui.Position = UDim2.new(
startPos.X.Scale,
startPos.X.Offset + delta.X,
startPos.Y.Scale,
startPos.Y.Offset + delta.Y
)
end
end
local function touchEnded(input, _gameProcessed)
if input == dragInput then
dragging = false
end
end
UserInputService.TouchStarted:Connect(touchStarted)
UserInputService.TouchMoved:Connect(update)
UserInputService.TouchEnded:Connect(touchEnded)

TouchSwipe

El evento TouchSwipe se activa cuando un usuario toca con los dedos en un dispositivo TouchEnabled .

Este evento se puede usar para determinar cuando un usuario desplaza sus dedos en la pantalla de su dispositivo y la dirección en la que desplazó el usuario.

Para un seguimiento más preciso del movimiento de la entrada táctil, usa usando UserInputService.TouchMoved

Para comprobar si el dispositivo de un usuario está TouchEnabled y que los eventos de toque se desencadenar, consulte UserInputService.TouchEnabled .

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

swipeDirection: Enum.SwipeDirection

Un Enum.SwipeDirection, que indica la dirección en la que el usuario ha desplazado.

numberOfTouches: number

Número de toques (por ejemplo, dedos) implicados en el gesto.

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

Touch Swipe a GUI

local UserInputService = game:GetService("UserInputService")
local gui = script.Parent
local swipePositionY = gui.Position.Y.Offset
local swipePositionX = gui.Position.X.Offset
local camera = workspace.CurrentCamera
local maxY = camera.ViewportSize.Y - gui.Size.Y.Offset
local maxX = camera.ViewportSize.X - gui.Size.X.Offset
local function TouchSwipe(swipeDirection, _numberOfTouches, _gameProcessedEvent)
if swipeDirection == Enum.SwipeDirection.Up then
swipePositionY = math.max(swipePositionY - 200, 0)
elseif swipeDirection == Enum.SwipeDirection.Down then
swipePositionY = math.min(swipePositionY + 200, maxY)
elseif swipeDirection == Enum.SwipeDirection.Left then
swipePositionX = math.max(swipePositionX - 200, 0)
elseif swipeDirection == Enum.SwipeDirection.Right then
swipePositionX = math.min(swipePositionX + 200, maxX)
end
gui:TweenPosition(UDim2.new(0, swipePositionX, 0, swipePositionY), "Out", "Quad", 0.25, true)
end
UserInputService.TouchSwipe:Connect(TouchSwipe)

TouchTap

El evento TouchTap se activa cuando el usuario toca / toca su dedo en la pantalla en un dispositivo TouchEnabled .

Este evento se activará independientemente de si el usuario toca / toca el mundo del juego o un elemento de GUI. Si estás buscando un evento que solo se activa cuando el usuario toca / toca el mundo del juego, usa UserInputService.TouchTapInWorld .

Para comprobar si el dispositivo de un usuario está TouchEnabled y que los eventos de toque se desencadenar, consulte UserInputService.TouchEnabled .

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .

Parámetros

touchPositions: Array

Un arreglo de Vector2 objetos, que indica la posición de los dedos implicados en el gesto de toque.

gameProcessedEvent: bool

Indica si el motor del juego observó internamente esta entrada y actuó sobre ella. Generalmente, esto se refiere a la capacidad de procesamiento de la interfaz de usuario, por lo que si se tocó o hizo clic en un botón desde esta entrada, gameProcessedEvent sería true . Esto también es cierto para los eventos de entrada conectados a través de ContextActionService .


Muestras de código

The Difference Between TouchTap and TouchLongPress

local UserInputService = game:GetService("UserInputService")
-- The parent of this script (a ScreenGui)
local touchScreenGui = script.Parent
-- Create the GUI frame that the user interacts with through Touch
-- events
local touchGui = Instance.new("Frame")
touchGui.Name = "TouchGui"
touchGui.AnchorPoint = Vector2.new(0.5, 0.5)
-- Fires when the touches their device's screen
local function TouchTap(touchPositions, _gameProcessedEvent)
touchGui.Parent = touchScreenGui
touchGui.Position = UDim2.new(0, touchPositions[1].X, 0, touchPositions[1].Y)
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Fires when a user starts touching their device's screen and does not
-- move their finger for a short period of time
local function TouchLong(_touchPositions, _state, _gameProcessedEvent)
touchGui.Size = UDim2.new(0, 100, 0, 100)
end
-- Fires when the user moves their finger while touching their device's
-- screen
local function TouchMove(touch, _gameProcessedEvent)
touchGui.Position = UDim2.new(0, touch.Position.X, 0, touch.Position.Y)
end
-- Fires when the user stops touching their device's screen
local function TouchEnd(_touch, _gameProcessedEvent)
touchGui.Parent = nil
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Only use the Touch events if the user is on a mobile device
if UserInputService.TouchEnabled then
UserInputService.TouchTap:Connect(TouchTap)
UserInputService.TouchLongPress:Connect(TouchLong)
UserInputService.TouchMoved:Connect(TouchMove)
UserInputService.TouchEnded:Connect(TouchEnd)
end

TouchTapInWorld

El evento TouchTapInWorld se activa cuando el usuario toca / toca su dedo en la pantalla en un dispositivo TouchEnabled . Se activa cuando el usuario toca en el mundo del juego.

Este evento se puede usar para determinar cuando un usuario toca la pantalla y no toca un elemento GUI . Si el usuario toca un elemento de GUI, UserInputService.TouchTap se ejecutará en lugar de TouchTapInWorld.

Para comprobar si el dispositivo de un usuario está TouchEnabled y que los eventos de toque se desencadenar, consulte UserInputService.TouchEnabled .

Este evento solo se activa cuando la ventana del cliente de Roblox esté en el enfoque. Por ejemplo, no se capturarán los elementos cuando la ventana esté minimizada.

Dado que solo se ejecuta localmente, solo se puede usar en un LocalScript .

Véase también:

Parámetros

position: Vector2

Un Vector2 que indica la posición del toque.

processedByUI: bool

Si el usuario tocó un elemento de la GUI.


Muestras de código

Create a Part in World at Touch Position

local UserInputService = game:GetService("UserInputService")
local camera = workspace.CurrentCamera
local LENGTH = 500
local function createPart(position, processedByUI)
-- Do not create a part if the player clicked on a GUI/UI element
if processedByUI then
return
end
-- Get Vector3 world position from the Vector2 viewport position
local unitRay = camera:ViewportPointToRay(position.X, position.Y)
local ray = Ray.new(unitRay.Origin, unitRay.Direction * LENGTH)
local hitPart, worldPosition = workspace:FindPartOnRay(ray)
-- Create a new part at the world position if the player clicked on a part
-- Do not create a new part if player clicks on empty skybox
if hitPart then
local part = Instance.new("Part")
part.Parent = workspace
part.Anchored = true
part.Size = Vector3.new(1, 1, 1)
part.Position = worldPosition
end
end
UserInputService.TouchTapInWorld:Connect(createPart)

WindowFocusReleased

El evento UserInputService WindowFocusRelease cuando la ventana del cliente Roblox pierde el enfoque - generalmente cuando el cliente Roblox está minimizado por el usuario.

Por ejemplo, el código a continuación imprime "Window focus released" cuando el cliente Roblox pierde el enfoque.


local UserInputService = game:GetService("UserInputService")
UserInputService.WindowFocusReleased:Connect(function()
print("Window focus released")
end)

Este evento se puede utilizar junto con UserInputService.WindowFocused para rastrear si el cliente Roblox está activamente enfocado en la pantalla del usuario.

Dado que solo se ejecuta localmente, solo se puede usar en un LocalScript .


Muestras de código

Window Focus AFK Script (Script)

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = Instance.new("RemoteEvent")
afkEvent.Name = "AfkEvent"
afkEvent.Parent = ReplicatedStorage
local function setAfk(player, afk)
if afk then
local forcefield = Instance.new("ForceField")
forcefield.Parent = player.Character
else
local forcefield = player.Character:FindFirstChildOfClass("ForceField")
if forcefield then
forcefield:Destroy()
end
end
end
afkEvent.OnServerEvent:Connect(setAfk)
Window Focus AFK Script (LocalScript)

local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = ReplicatedStorage:WaitForChild("AfkEvent")
local function focusGained()
afkEvent:FireServer(false)
end
local function focusReleased()
afkEvent:FireServer(true)
end
UserInputService.WindowFocused:Connect(focusGained)
UserInputService.WindowFocusReleased:Connect(focusReleased)

WindowFocused

El evento UserInputService WindowFocused se activa cuando la ventana del cliente Roblox gana enfoque - generalmente cuando el cliente Roblox está maximizado/abiertamente abierto en la pantalla del usuario.

Por ejemplo, el código a continuación imprime "Ventana enfocada" cuando el cliente Roblox gana enfoque.


local UserInputService = game:GetService("UserInputService")
UserInputService.WindowFocused:Connect(function()
print("Window focused")
end)

Este evento se puede utilizar junto con UserInputService.WindowFocusReleased para rastrear si el cliente Roblox está activamente enfocado en la pantalla del usuario.

Dado que este evento solo se activa localmente, solo se puede usar en un LocalScript .


Muestras de código

Window Focus AFK Script (Script)

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = Instance.new("RemoteEvent")
afkEvent.Name = "AfkEvent"
afkEvent.Parent = ReplicatedStorage
local function setAfk(player, afk)
if afk then
local forcefield = Instance.new("ForceField")
forcefield.Parent = player.Character
else
local forcefield = player.Character:FindFirstChildOfClass("ForceField")
if forcefield then
forcefield:Destroy()
end
end
end
afkEvent.OnServerEvent:Connect(setAfk)
Window Focus AFK Script (LocalScript)

local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = ReplicatedStorage:WaitForChild("AfkEvent")
local function focusGained()
afkEvent:FireServer(false)
end
local function focusReleased()
afkEvent:FireServer(true)
end
UserInputService.WindowFocused:Connect(focusGained)
UserInputService.WindowFocusReleased:Connect(focusReleased)