UserInputService

Afficher les obsolètes

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

Création impossible
Service
Non répliqué

UserInputService est un service utilisé pour détecter et capturer les différents types d'entrée disponibles sur l'appareil d'un utilisateur.

Le but principal de ce service est d'autoriser les expériences à collaborer avec plusieurs formes d'entrée disponibles, telles que les gamepads, les écrans tactiles et les claviers. Il permet à un LocalScript de effectuer différentes actions en fonction du dispositif et, à son tour, de fournir la meilleure expérience pour l'utilisateur final.

Certains usages de ce service incluent la détection de l'entrée de l'utilisateur lorsqu'il interagit avec des interfaces utilisateur, des outils et d'autres instances de jeu. Pour détecter l'entrée de l'utilisateur, le service doit rechercher un événement de service. Par exemple, le service peut détecter des événements tels que lorsque l'utilisateur touche l'écran d'un appare

Puisque ce service est côté client uniquement, il ne fonctionnera que lorsqu'il est utilisé dans un LocalScript ou un ModuleScript requis par un LocalScript . En tant que service d'entrée client, les utilisateurs dans le jeu ne peuvent détecter que leur propre entrée - et non l'entrée des autres.

Voir aussi ContextActionService, un service qui vous permet de lier des fonctions à plusieurs entrées de l'utilisateur.

Échantillons de code

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)

Résumé

Propriétés

  • Lecture uniquement
    Non répliqué
    Lecture parallèle

    Détermine si le dispositif de l'utilisateur a un accéléromètre.

  • Lecture uniquement
    Non répliqué
    Lecture parallèle

    Détermine si le périphérique utilisé par un utilisateur a un gamepad disponible.

  • Lecture uniquement
    Non répliqué
    Lecture parallèle

    Décrire si le périphérique de l'utilisateur a un gyroscope.

  • Lecture uniquement
    Non répliqué
    Lecture parallèle

    Détermine si le périphérique de l'utilisateur a un clavier disponible.

  • Détermine si la souris de l'utilisateur peut être déplacée librement ou verrouillée.

  • Non répliqué
    Lecture parallèle

    Échelle la sortie de la valeur (modifier) de l'utilisateur de Mouse .

  • Lecture uniquement
    Non répliqué
    Lecture parallèle

    Détermine si le périphérique de l'utilisateur a une souris disponible.

  • MouseIcon:ContentId
    Lecture parallèle

    L'ID de contenu de l'image utilisée comme icône de souris de l'utilisateur.

  • Lecture parallèle

    Détermine si l'icône Mouse est visible.

  • Lecture uniquement
    Non répliqué
    Lecture parallèle

    Détermine la position de la clavier sur l'écran.

  • Lecture uniquement
    Non répliqué
    Lecture parallèle

    Détermine la taille du clavier sur l'écran.

  • Lecture uniquement
    Non répliqué
    Lecture parallèle

    Détermine si un clavier sur l'écran est actuellement visible sur l'écran de l'utilisateur.

  • Lecture uniquement
    Non répliqué
    Lecture parallèle

    Décrire si le dispositif de l'utilisateur a un écran tactile disponible.

  • Lecture uniquement
    Non répliqué
    Lecture parallèle

    Indique si l'utilisateur utilise un casque de réalité virtuelle.

Méthodes

Évènements

Propriétés

AccelerometerEnabled

Lecture uniquement
Non répliqué
Lecture parallèle

Cette propriété décrit si le dispositif de l'utilisateur a un accéléromètre

Un accéléromètre est un composant trouvé dans la plupart des appareils mobiles qui mesure l'accélération (changement de vitesse).

Par exemple, le code suivant montre comment vérifier si le dispositif de l'utilisateur a un accéléromètre.


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

Si le dispositif a un accéléromètre activé, vous pouvez obtenir sa accélération actuelle en utilisant la fonction UserInputService:GetDeviceAcceleration() ou la piste lorsque l'accélération du appareilchange en utilisant l'événement UserInputService.DeviceAccelerationChanged .

Puisque UserInputService n'est côté client que, cette propriété ne peut être utilisée que dans un LocalScript.

Échantillons de code

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

Lecture uniquement
Non répliqué
Lecture parallèle

Cette propriété décrit si le dispositif utilisé par un utilisateur a un gamepad disponible. Si les gamepads sont disponibles, vous pouvez utiliser UserInputService:GetConnectedGamepads() pour récupérer une liste de gamepads connectés.

Puisque UserInputService n'est côté client que, cette propriété ne peut être utilisée que dans un LocalScript.

Voir aussi :

Échantillons de code

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

Lecture uniquement
Non répliqué
Lecture parallèle

Cette propriété décrit si le périphérique de l'utilisateur a un gyroscope.

Un gyroscope est un composant trouvé dans la plupart des appareils mobiles qui détecte l'orientation et la vitesse de rotation.

Si le périphérique d'un utilisateur a un gyroscope, vous pouvez l'intégrer dans votre jeu en utilisant la fonction UserInputService:GetDeviceRotation() et l'événement 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

Puisque UserInputService n'est côté client que, cette propriété ne peut être utilisée que dans un LocalScript.

Échantillons de code

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

Lecture uniquement
Non répliqué
Lecture parallèle

Cette propriété décrit si le périphérique de l'utilisateur a un clavier disponible. Cette propriété est true lorsque le périphérique de l'utilisateur a un clavier disponible, et false lorsqu'il ne l'a pas.

Il peut être utilisé pour déterminer si l'utilisateur a un clavier disponible - ce qui peut être important si vous voulez vérifier si vous pouvez utiliser UserInputService:IsKeyDown() ou UserInputService:GetKeysPressed() pour vérifier l'entrée du clavier.

Puisque UserInputService n'est côté client que, cette propriété ne peut être utilisée que dans un LocalScript.

Échantillons de code

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

Lecture parallèle

Cette propriété détermine comment la souris de l'utilisateur se comporte en fonction de l'Enum.MouseBehavior enum. La valeur par défaut est Enum.MouseBehavior.Default.

Il peut être réglé sur trois valeurs :

  1. Par défaut : La souris se déplace librement autour de l'écran de l'utilisateur.
  2. LockCenter : La souris est verrouillée et ne peut pas bouger du centre de l'écran de l'utilisateur.
  3. Verrouiller la position actuelle de la souris : La souris est verrouillée et ne peut pas bouger, elle est à sa position actuelle sur l'écran de l'utilisateur au moment du verrouillage.

La valeur de cette propriété n'affecte pas la sensibilité de la suivie des événements de déplacement de la souris. Par exemple, GetMouseDelta renvoie la même position d'écran Vector2 indépendamment de si la souris est verrouillée ou peut se déplacer librement autour de l'écran de l'utilisateur. Par resultats, les scripts par défaut

Cette propriété est remplacée si un GuiButton avec Modal activé est GuiButton.Visible à moins que le bouton droit de la souris du joueur ne soit en bas.

Remarquez que, si la souris est verrouillée, UserInputService.InputChanged ne s'exécutera toujours pas lorsque le joueur déplace la souris et sera passé dans le Delta que la souris a essayé de déplacer. De plus, si le joueur est expulsé du jeu, la souris sera forcée à s'ouvrir.

Puisque UserInputService n'est côté client que, cette propriété ne peut être utilisée que dans un LocalScript.

Échantillons de code

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

Non répliqué
Lecture parallèle

Cette propriété détermine la sensibilité de l'utilisateur de Mouse.

La sensibilité détermine la mesure dans laquelle une déplacement de la souris physique se traduit en un déplacement de la souris dans le jeu. Cela peut être utilisé pour ajuster la sensibilité de la traçabilité des événements, comme GetMouseDelta , la traçabilité des événements de la souris.

Cette propriété n'affecte pas le mouvement de l'icône de la souris. Elle n'affecte pas non plus la sensibilité de la caméra réglage trouvé dans l'onglet Paramètres du menu Paramètres du client, qui ajuste également la sensibilité du suivi des événements de la souris.

Cette propriété a une valeur maximale de 10 et une valeur minimale de 0. Une valeur inférieure correspond à une sensibilité plus faible et une valeur maximale plus élevée.

Lorsque la sensibilité est réglée sur 0, les événements qui suivent le mouvement de la souris se déclenchent toujours, mais tous les paramètres et propriétés indiquant le changement de position de la souris se retournent Vector2.new() , ou Vector3.new() dans le cas de Class.Input

Échantillons de code

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

Lecture uniquement
Non répliqué
Lecture parallèle

Cette propriété décrit si le dispositif de l'utilisateur a une souris disponible. Cette propriété est true lorsque le dispositif de l'utilisateur a une souris disponible, et false lorsqu'il ne l'a pas.


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

Il est important de vérifier ceci avant d'utiliser les fonctions de la souris UserInputService telles que UserInputService:GetMouseLocation().

Puisque UserInputService n'est côté client que, cette propriété ne peut être utilisée que dans un LocalScript.

Voir aussi :

Échantillons de code

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
Lecture parallèle

La propriété Icône de souris détermine l'image utilisée comme pointeur. Si elle est vide, une flèche par défaut est utilisée. Alors que le curseur passe sur certains objets de l'interface utilisateur tels qu'un ImageButton, TextButton, 1> Class.Loaded1> ou 4> Class.Proximity

Pour cacher entièrement le curseur, ne nez pas utiliser une image transparente. Au lieu de cela, définissez UserInputService.MouseIconEnabled sur false.

Échantillons de code

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

Lecture parallèle

Cette propriété détermine si l'icône Mouse est visible lorsque true l'icône de la souris est visible, lorsque false il n'est pas.

Par exemple, le code ci-dessous masque l'icône de la souris.


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

Puisque UserInputService n'est côté client que, cette propriété ne peut être utilisée que dans un LocalScript.

Échantillons de code

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

Lecture uniquement
Non répliqué
Lecture parallèle

Cette propriété décrit la position de la clavier sur l'écran en pixels. La position de la clavier est Vector2.new(0, 0) quand elle n'est pas visible.

Comme UserInputService est côté client uniquement, cette propriété ne peut être utilisée que dans un LocalScript ou un Script avec un 1> Class.BaseScript.RunContext|RunContext1> défini sur 4> Enum.RunContext.Client4>.

Voir également OnScreenKeyboardVisible et OnScreenKeyboardSize .

Échantillons de code

UserInputService.OnScreenKeyboardPosition

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

OnScreenKeyboardSize

Lecture uniquement
Non répliqué
Lecture parallèle

Cette propriété décrit la taille de la clavier sur l'écran en pixels. La taille de la clavier est Vector2.new(0, 0) quand elle n'est pas visible.

Comme UserInputService est côté client uniquement, cette propriété ne peut être utilisée que dans un LocalScript ou un Script avec un 1> Class.BaseScript.RunContext|RunContext1> défini sur 4> Enum.RunContext.Client4>.

Voir également OnScreenKeyboardVisible et OnScreenKeyboardPosition .

OnScreenKeyboardVisible

Lecture uniquement
Non répliqué
Lecture parallèle

Cette propriété décrit si une clavier sur l'écran est actuellement visible sur l'écran de l'utilisateur.

Comme UserInputService est côté client uniquement, cette propriété ne peut être utilisée que dans un LocalScript ou un Script avec un 1> Class.BaseScript.RunContext|RunContext1> défini sur 4> Enum.RunContext.Client4>.

Voir également OnScreenKeyboardSize et OnScreenKeyboardPosition .

TouchEnabled

Lecture uniquement
Non répliqué
Lecture parallèle

Cette propriété décrit si le dispositif de l'utilisateur a un écran tactile disponible.

La propriété est utilisée pour déterminer si le dispositif de l'utilisateur a un écran tactile, et donc si les événements de touche seront lancer. Si TouchEnabled est vrai, vous pouvez utiliser les événements d'entrée de l'utilisateur comme UserInputService.TouchStarted et UserInputService.TouchEnded pour suivre quand un utilisateur commence et arrête de toucher l'écran de son appareil.

L'élément de code ci-dessous imprime si le dispositif de l'utilisateur a un écran tactile.


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

Voir aussi :

Échantillons de code

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

Lecture uniquement
Non répliqué
Lecture parallèle

Cette propriété décrit si l'utilisateur utilise un appareil de réalité virtuelle (VR).

Si un appareil VR est activé, vous pouvez interagir avec son emplacement et son mouvement à travers des fonctions telles que UserInputService:GetUserCFrame() . Vous pouvez également réagir à la déplacement du VR en utilisant l'événement 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

Puisque UserInputService n'est côté client que, cette propriété ne peut être utilisée que dans un LocalScript.

Voir aussi :

Échantillons de code

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éthodes

GamepadSupports

Cette fonction renvoie si la manette de jeu donnée Enum.UserInputType prend en charge un bouton correspondant au Enum.KeyCode donné. Cette fonction est utilisée pour déterminer les entrées de jeu valides.

Pour déterminer les gamepads Enum.UserInputType connectés, utilisez UserInputService:GetConnectedGamepads() .

Comme UserInputService est côté client uniquement, cette fonction ne peut être utilisée qu' dans un LocalScript .

Voir aussi :

Paramètres

gamepadNum: Enum.UserInputType

Le Enum.UserInputType de la manette de jeu.

gamepadKeyCode: Enum.KeyCode

Le Enum.KeyCode du bouton en question.


Retours

Si la manette de jeu prend en charge un bouton correspondant au Enum.KeyCode donné.

Échantillons de code

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

Cette fonction renvoie un tableau de Enum.UserInputType de gamepads actuellement connectés. Si aucun gamepad ne est connecté, ce tableau sera vide. De plus, il ne renvoie que les objets de type gamepad qui sont des gamepads. Par instance, cet événement renverra un objet de type clavier mais pas un objet de type gamepad.

Par exemple, le code suivant récupère les gamepads connectés et les stocke dans une variable nommée connectedGamepads .


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

Pour vérifier si une manette spécifique est connectée, utilisez UserInputService:GetGamepadConnected() .

Comme UserInputService est côté client uniquement, cette fonction ne peut être utilisée qu' dans un LocalScript .

Voir aussi :


Retours

Une table UserInputTypes correspondant aux gamepads connectés à l'appareil de l'utilisateur.

Échantillons de code

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 fonction GetDeviceAcceleration détermine l'accélération actuelle du appareilde l'utilisateur. Elle renvoie un InputObject qui décrit l'accélération actuelle du appareil.

Pour que cela fonctionne, l'appareil de l'utilisateur doit avoir un accéléromètre activé. Pour vérifier si un appareil de l'utilisateur a un accéléromètre activé, vous pouvez vérifier la propriété UserInputService.AccelerometerEnabled.

Si vous voulez suivre l'accélération du appareilde l'utilisateur au lieu de cela, vous pouvez utiliser l'événement UserInputService.DeviceAccelerationChanged.

Puisqu'il ne s'exécute que localement, il ne peut être utilisé que dans un LocalScript .


Retours

Échantillons de code

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

Cette fonction renvoie un InputObject décrivant le force vectoriellede gravité actuel du appareil.

Le vécteur de gravité est déterminé par l'orientation de l'appareil par rapport à la force de gravité réelle du monde réel. Par instance, si un appareil est parfaitement droit (portrait), le vécteur de gravité est Vector3.new(0, 0, -9.18) . Si le côté gauche de l

Cette fonction peut être utilisée pour activer le dispositif de l'utilisateur pour impacter ou contrôler la gravité dans le jeu ou déplacer des objets dans le jeu tels qu'un ballon.

La gravité n'est appliquée qu'aux joueurs qui utilisent un appareil avec un gyroscope activé - comme un appareil mobile.

Pour vérifier si le périphérique d'un utilisateur a un gyroscope activé, vérifiez la valeur de UserInputService.GyroscopeEnabled . Si le périphérique a un gyroscope activé, vous pouvez également utiliser l'événement UserInputService.DeviceGravityChanged pour suivre quand la force de gravité sur le périphérique change.

Comme UserInputService est côté client uniquement, cette fonction ne peut être utilisée qu' dans un LocalScript .


Retours

Échantillons de code

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

Cette fonction renvoie un InputObject et un CFrame décrivant le force vectoriellede rotation actuel de l'appareil.

Ceci est déclenché par un objet d'entrée. La propriété Position de l'objet d'entrée est un Enum.InputType.Gyroscope qui suit la rotation totale dans chaque axe local.

La rotation de l'appareil ne peut être suivie que sur les appareils avec un gyroscope .

Puisque cette fonction se déclenche localement, il ne peut être utilisé que dans un LocalScript.


Retours

Un tableau contenant deux propriétés :

  1. La propriété Delta décrit la quantité de rotation qui s'est dernièrement produite
  2. Le CFrame est la rotation actuelle de l'appareil par rapport à son cadre de référence par défaut.

Échantillons de code

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

Cette fonction renvoie le TextBox que le client est actuellement focalisé sur. Un TextBox peut être sélectionné manuellement par l'utilisateur, ou la sélection peut être forcée en utilisant la fonction TextBox:CaptureFocus(). Si aucun TextBox n'est sélectionné, cette fonction renverra nil.

Comme UserInputService est côté client uniquement, cette fonction ne peut être utilisée qu' dans un LocalScript .

Voir aussi :


Retours

Échantillons de code

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

Cette fonction renvoie si un gamepad avec le Enum.UserInputType donné est connecté au client.

Ceci peut être utilisé pour vérifier si un gamepad spécifique, comme 'Gamepad1' est connecté à l'appareil du client.

Pour récupérer une liste de tous les gamepads connectés, utilisez UserInputService:GetConnectedGamepads() .

Comme UserInputService est côté client uniquement, cette fonction ne peut être utilisée qu' dans un LocalScript .

Voir aussi :

Paramètres

gamepadNum: Enum.UserInputType

Le Enum.UserInputType de la manette de jeu en question.


Retours

Whether a gamepad associé avec Enum.UserInputType est connecté.

Échantillons de code

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

Cette fonction renvoie un tableau de InputObjects pour tous les entrants disponibles sur le gamepad donné Enum.UserInputType, représentant l'état d'entrée de chaque entrée.

Pour trouver le UserInputTypes des gamepads connectés, utilisez UserInputService:GetConnectedGamepads() .

Puisque cette fonction ne s'exécute que localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

gamepadNum: Enum.UserInputType

Le Enum.UserInputType correspondant à la manette en question.


Retours

Un tableau de InputObjects représentant l'état actuel de tous les entrants disponibles pour le gamepad donné.

GetImageForKeyCode

ContentId

Cette méthode prend le Enum.KeyCode demandé et renvoie l'image associée pour le périphérique de jeu actuellement connecté (limité à Xbox, PlayStation et Windows). Cela signifie que si le contrôleur connecté est un manetteXbox, l'utilisateur voit les ressources Xbox. De même, si le périphérique est un manettePlayStation, l'utilisateur voit les ressources PlayStation.

Paramètres

keyCode: Enum.KeyCode

Le Enum.KeyCode pour lequel récupérer l'image associée.


Retours

ContentId

L'ID de ressource d'image renvoyé.

Échantillons de code

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

Cette fonction renvoie un tableau de InputObjects associé aux touches actuellement pressées.

Cet tableau peut être itéré pour déterminer les touches qui sont actuellement pressées, en utilisant les valeurs InputObject.KeyCode.

Pour vérifier si une clé spécifique est pressée, utilisez UserInputService:IsKeyDown() .

Comme UserInputService est côté client uniquement, cette fonction ne peut être utilisée qu' dans un LocalScript .


Retours

Un tableau de InputObjects associé aux touches actuellement pressées.

Échantillons de code

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

Cette fonction renvoie « Entrée d'utilisateur » associée avec la dernière entrée de l'utilisateur.

Par exemple, si l'entrée précédente de l'utilisateur avait appuyé sur la barre d'espace, le Enum.UserInputType renvoyé serait 'Clavier'.

L'événement UserInputService.LastInputTypeChanged peut être utilisé pour suivre quand le dernier Enum.UserInputType utilisé par l'utilisateur change.

Comme UserInputService est côté client uniquement, cette fonction ne peut être utilisée qu' dans un LocalScript .


Retours

Le Enum.UserInputType associé avec l'entrée la plus récente de l'utilisateur.

Échantillons de code

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

Cette fonction renvoie un tableau de InputObjects correspondant aux boutons de souris actuellement pressés.

Les boutons de souris qui sont suivis par cette fonction incluent :


<tr>
<td>Bouton de souris1</td>
<td>Le bouton de souris gauche.</td>
</tr>
<tr>
<td>Bouton de souris 2</td>
<td>Bouton de souris droit.</td>
</tr>
<tr>
<td>Bouton de souris 3</td>
<td>Le bouton de souris au milieu.</td>
</tr>
NomDescription

Si l'utilisateur ne presse aucun bouton de souris lorsque la fonction est appelée, il renverra un matricevide.

Comme UserInputService est côté client uniquement, cette fonction ne peut être utilisée qu' dans un LocalScript .


Retours

Une tableau de InputObjects correspondant aux boutons de la souris actuellement maintenus enfoncés.

Échantillons de code

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

Cette fonction renvoie le changement, en pixels, de la position du joueur dans le dernier cadre rendu en tant que Mouse . Cette fonction ne fonctionne que si la souris a été verrouillée à l'aide de la propriété Vector2. Si la souris n'a pas été verrouillée, les valeurs renvoyées seront nulles.

La sensibilité de la souris, déterminée dans les paramètres du client et UserInputService.MouseDeltaSensitivity, affectera le resultats.

Comme UserInputService est côté client uniquement, cette fonction ne peut être utilisée qu' dans un LocalScript .


Retours

Change dans le mouvement de la souris.

Échantillons de code

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

Cette fonction renvoie un Vector2 représentant la position d'écran actuelle du joueur dans les pixels par rapport au coin supérieur gauche. Cela ne tient pas compte de l'Mouse dansset.

Si le lieu du pointeur de la souris est hors-écran ou si le périphérique du joueur n'a pas de souris, la valeur renvoyée sera indéterminée.

Comme UserInputService est côté client uniquement, cette fonction ne peut être utilisée qu' dans un LocalScript .


Retours

Un Vector2 représentant la position actuelle de l'écran de la souris, en pixels.

Échantillons de code

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

Cette fonction renvoie un tableau de gamepad UserInputTypes qui sont connectés et activés pour la navigation de l'interface graphique. Cette liste est en ordre décroissant de priorité, ce qui signifie qu'elle peut être itérée pour déterminer lequel des gamepads doit avoir la navigation contrôlée.

Que ce soit une manette de jeu connectée ou une manette de jeu de navigation, seule la manette de jeu de navigation contrôle les interfaces graphiques de navigation. Cela n'affecte pas les contrôles de navigation.

Puisque UserInputService n'est côté client que, cette fonction ne peut être utilisée que dans un LocalScript.

Voir aussi :


Retours

Une série de UserInputTypes qui peut être utilisée pour la navigation de l'interface graphique, dans un ordre décroissant de priorité.

GetStringForKeyCode

GetStringForKeyCode renvoie une chaîne représentant une clé que l'utilisateur doit appuyer pour entrer un Enum.KeyCode donné, en gardant à l'esprit leur disposition clavier. Pour les codes de clé qui nécessitent un modificateur pour être maintenus, cette fonction renvoie la clé pour être pressée en plus du modificateur. Voir les exemples ci-dessous pour plus d'explication.

Lors de l'utilisation de Roblox avec un clavier non-QWERTY, les codes de clé sont mapés à des positions QWERTY équivalentes. Par exemple, en appuyant sur 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"

Exemples sur le clavier QWERTY


<tbody>
<tr>
<td><code>enum.keycode.q</code></td>
<td><code>Q</code></td>
</tr>
<tr>
<td><code>enum.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> parce que <code>@</code> est écrit avec <kbd>Maj</kbd><kbd>2</kbd></td>
</tr>
</tbody>
Clé d'échangeRetourner la valeur

Exemples sur le clavier AZERTY


<tbody>
<tr>
<td><code>enum.keycode.q</code></td>
<td><code>A</code></td>
</tr>
<tr>
<td><code>enum.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>
Clé d'échangeRetourner la valeur

Utilisation de Gamepad

GetStringForKeyCode() renvoie la conversion de la chaîne pour le Enum.KeyCode pour le gamepad connecté le plus récemment. Si le contrôleur connecté n'est pas pris en charge, la fonction renvoie la conversion de chaîne par défaut pour le code de clé demandé.

L'exemple suivant montre comment vous pouvez mapper les ressources personnalisées pour 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

Mappes de manette

Les codes de clé du pad directionnel ne diffèrent pas en fonction du appareil. Enum.KeyCode.ButtonSelect a un comportement légèrement différent dans certains cas. Utilisez les mappes PlayStation pour vous assurer que les utilisateurs voient les bons boutons.


<tbody>
<tr>
<td><code>enum.keycode.buttona</code></td>
<td><code>BoutonCross</code></td>
<td><code>BoutonA</code></td>
</tr>
<tr>
<td><code>ButtonB du code d'enceinte</code></td>
<td><code>Cercle des boutons</code></td>
<td><code>BoutonB</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonx</code></td>
<td><code>Bouton carré</code></td>
<td><code>Bouton X</code></td>
</tr>
<tr>
<td><code>enum.keycode.button</code></td>
<td><code>Bouton triangulaire</code></td>
<td><code>Bouton Y</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonL1</code></td>
<td><code>BoutonL1</code></td>
<td><code>BoutonLB</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonl2</code></td>
<td><code>BoutonL2</code></td>
<td><code>BoutonLT</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonl3</code></td>
<td><code>BoutonL3</code></td>
<td><code>Bouton LS</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonr1</code></td>
<td><code>BoutonR1</code></td>
<td><code>Bouton RB</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonr2</code></td>
<td><code>BoutonR2</code></td>
<td><code>BoutonRT</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonr3</code></td>
<td><code>BoutonR3</code></td>
<td><code>Bouton RS</code></td>
</tr>
<tr>
<td><code>bouton de démarrage du code d'objet</code></td>
<td><code>Options de bouton</code></td>
<td><code>bouton de démarrage</code></td>
</tr>
<tr>
<td><code>bouton de sélection de code d'administration</code></td>
<td><code>ButtonTouchpad</code> et <code>ButtonShare</code></td>
<td><code>BoutonSélectionner</code></td>
</tr>
</tbody>
Clé d'échangeValeur de retour de PlayStationValeur de retour Xbox

Images système pour les codes clés

Lors de l'utilisation d'un Enum.KeyCode Class.ImageLabel dans une interface utilisateur, vous pouvez utiliser les icônes suivantes ici. Cependant, il est recommandé d'utiliser ImageLabel comme une méthode plus moderne et plus cross-plateforme pour récupérer les icônes des contrôleurs Xbox et PlayStation.


<tbody>
<tr>
<td><code>enum.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.button</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>ButtonB du code d'enceinte</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 du code d'indexation</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 .KeyCode.DPadRight</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 clé du code du commerce</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 du code d'enceinte</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>bouton de sélection de code d'administration</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>bouton de démarrage du code d'objet</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>enum.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>enum.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>enum.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>enum.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>enum.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>enum.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>Code d'indexation du clavier</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>Code d'indexation gauche</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>Code d'indexation de la touche enfoncée droite</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>enum.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>enum.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>enum.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>Code d'objet de la série clé</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>enum.keycode.space</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>
Clé d'échangeImageID de ressource

Paramètres

keyCode: Enum.KeyCode

Retours

GetSupportedGamepadKeyCodes

Cette fonction renvoie un tableau de KeyCodes que le gamepad associé avec le Enum.UserInputType prend en charge.

Cette fonction peut être utilisée pour déterminer les KeyCodes pris en charge et non pris en charge par un gamepad connecté. Pour déterminer si un code spécifique est pris en charge, utilisez UserInputService:GamepadSupports().

Si vous appelez un gamepad non existant ou non connecté, cette fonction renverra un matricevide.

Comme UserInputService est côté client uniquement, cette fonction ne peut être utilisée qu' dans un LocalScript .

Voir aussi :

Paramètres

gamepadNum: Enum.UserInputType

Le Enum.UserInputType de la manette de jeu.


Retours

Un tableau de KeyCodes pris en charge par le gamepad donné.

Échantillons de code

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

Cette fonction vérifie si un bouton spécifique est pressé sur un gamepad spécifique. Il renvoie true si le Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'un Entrée d'

Type d'entrée valide

Le gamepad spécifié doit être l'un des valeurs de l'ensemble suivant UserInputType :


<tr>
<td>Type d'entrée d'utilisateur.Gamepad1-8</td>
</tr>
Nom

Codes de clé valides

Le bouton spécifié doit être l'un des valeurs de l'énumème KeyCodes suivantes :


<tr>
<td>enum.keycode.buttonX</td>
</tr>
<tr>
<td>enum.keyCode.ButtonY</td>
</tr>
<tr>
<td>enum.keycode.buttona</td>
</tr>
<tr>
<td>ButtonB du code d'interface</td>
</tr>
<tr>
<td>enum.keycode.buttonr1</td>
</tr>
<tr>
<td>enum.keycode.boutonl1</td>
</tr>
<tr>
<td>enum.keycode.buttonr2</td>
</tr>
<tr>
<td>enum.keycode.buttonL2</td>
</tr>
<tr>
<td>ButtonR3</td>
</tr>
<tr>
<td>enum.keyCode.ButtonL3</td>
</tr>
<tr>
<td>bouton de menu.KeyCode.ButtonStart</td>
</tr>
<tr>
<td>ButtonSelect</td>
</tr>
<tr>
<td>PadLeft.KeyCode.DPadLeft</td>
</tr>
<tr>
<td>PadRight.KeyCode.DPadRight</td>
</tr>
<tr>
<td>Pad de clés du code.</td>
</tr>
<tr>
<td>Pad vers le bas</td>
</tr>
Nom

Ceci peut être utilisé pour vérifier si un bouton spécifique, comme A, est maintenu enfoncé. Par exemple :


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

Puisque UserInputService n'est côté client que, cette fonction ne peut être utilisée que dans un LocalScript.

Voir aussi :

Paramètres

gamepadNum: Enum.UserInputType

Le Enum.UserInputType du gamepad donné.

gamepadKeyCode: Enum.KeyCode

Le Enum.KeyCode du bouton spécifié.


Retours

Que le bouton spécifié sur le gamepad donné est pressé.

Échantillons de code

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

Cette fonction renvoie si l'utilisateur maintene la touche associée au Enum.KeyCode donnée. Il renvoie true si la touche spécifiée est maintenue ou false si elle n'est pas maintenue.

Ceci peut être utilisé pour vérifier si une clé spécifique, comme la barre d'espace, est pressée. Par exemple :


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

Pour récupérer une liste de toutes les touches appuyées par l'utilisateur, utilisez la fonction UserInputService:GetKeysPressed().

Puisque UserInputService n'est côté client que, cette fonction ne peut être utilisée que dans un LocalScript.

Voir aussi :

Paramètres

keyCode: Enum.KeyCode

Le Enum.KeyCode de la clé.


Retours

Whether the specified key is being held down.

Échantillons de code

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

Cette fonction prend un bouton de souris Enum.UserInputType et renvoie un bool qui indique si elle est actuellement pressée.

Le bouton de souris vérifié dépend de la valeur Enum.UserInputType donnée à la fonction en tant qu'argument. Par exemple :


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

Puisque UserInputService n'est côté client que, cette fonction ne peut être utilisée que dans un LocalScript."

Paramètres

mouseButton: Enum.UserInputType

Le Enum.UserInputType du bouton de la souris.


Retours

Whether the given mouse button is currently held down.

Échantillons de code

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

Cette fonction renvoie true si la manette de jeu spécifiée Enum.UserInputType est autorisée à contrôler la navigation et la sélection GUIs.

Si vous voulez définir un gamepad de navigation, vous pouvez utiliser UserInputService:SetNavigationGamepad() . Vous pouvez également utiliser UserInputService:GetNavigationGamepads() pour obtenir une liste de tous les gamepads de navigation.

Par exemple, le code ci-dessous vérifie si le gamepad1 est un gamepad de navigation :


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

Une liste de tous les gamepads connectés, indépendamment de la navigation, peut être récupérée en utilisant `UserInput/GetConnectedGamepads.

Puisque UserInputService n'est côté client que, cette fonction ne peut être utilisée que dans un LocalScript.

Voir aussi :

Paramètres

gamepadEnum: Enum.UserInputType

Le Enum.UserInputType du gamepad spécifié.


Retours

Whether the specified gamepad is a navigation gamepad.

RecenterUserHeadCFrame

void

Cette fonctionnalité réinitialise la CFrame de la tête VR de l'utilisateur à l'orientation actuelle de la tête portée par l'utilisateur. Cela signifie que l'orientation actuelle de la casqueest réglée sur CFrame.new().

Utilisez cette fonction pour déplacer le CFrame de la tête au centre de la zone de jeu si vous pensez qu'il est à un décentrageétrange.

Cela se comporte identiquement à la fonction VRService, VRService:RecenterUserHeadCFrame().

Puisque UserInputService n'est côté client que, cette fonction ne peut être utilisée que dans un LocalScript.


Retours

void

Échantillons de code

UserInputService:RecenterUserHeadCFrame

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

SetNavigationGamepad

void

La fonction SetRotationGamepad détermine si la plateforme de jeu spécifiée Enum.UserInputType peut déplacer le navateur GUI. Une plateforme de jeu qui peut déplacer le navateur GUI est considérée comme une plateforme de jeu de navigation.

Si l'argument activé est passé comme true, le Gamepad peut déplacer le navigateur de l'interface graphique. Si l'argument est false, le Gamepad ne peut pas déplacer le navigateur de l'interface graphique.

Si vous voulez vérifier si un Gamepad spécifié est un jeu de navigation, vous pouvez utiliser la fonction UserInputService:IsNavigationGamepad(). Vous pouvez également utiliser la fonction UserInputService:GetNavigationGamepads() pour récupérer une liste de tous les jeux de navigation.

Puisque UserInputService n'est côté client que, cette fonction ne peut être utilisée que dans un LocalScript.

Voir aussi :

Paramètres

gamepadEnum: Enum.UserInputType

Le Enum.UserInputType du gamepad spécifié.

enabled: bool

Whether the specified gamepad can move the GUI navigator.


Retours

void

Échantillons de code

UserInputService:SetNavigationGamepad

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

Évènements

DeviceAccelerationChanged

L'événement DeviceAccelerationChanged se déclenche lorsqu'un utilisateur déplace un appareil qui a un accéléromètre.

Un accéléromètre est un composant trouvé dans la plupart des appareils mobiles qui mesure l'accélération (changement de vitesse).

Pour déterminer si le dispositif d'un utilisateur a un accéléromètre activé, voir UserInputService.AccelerometerEnabled.

Cet événement peut être utilisé pour suivre le mouvement d'un appareil qui a un accéléromètre. Une utilisation d'échantillon inclut de déplacer le personnage du joueur lorsqu'un appareil mobile accélère.

De plus, cet événement peut être utilisé avec UserInputService:GetDeviceAcceleration() pour déterminer la vitesse actuelle d'un appareil de l'utilisateur si l'appareil a un accéléromètre.

Cet événement ne se déclenche que localement - ce qui signifie que seul le joueur dont le périphérique se déplace peut utiliser cet événement et il ne fonctionnera que dans un LocalScript .

Paramètres

acceleration: InputObject

Un InputObject, avec un UserInputType de Accélérateur et un 2>Class.InputObject.Position|Position2> qui montre la force de gravité sur chaque axe local.


Échantillons de code

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

L'événement UserInputService.DeviceGravityChanged déclenche lorsque la gravité du Vector3 d'un appareil change lorsqu'un appareil a un accéléromètre.

Le vécteur de gravité d'un appareil représente la force de gravité sur chacun des axes X, Y et Z de l'appareil. Bien que la gravité ne change jamais, la force qu'elle exerce sur chaque axe change lorsque l'appareil tourne et change d'orientation. La valeur de force exigée sur chaque axe est un vécteur d'unité allant de -1 à 1.

Un accéléromètre est un composant trouvé dans la plupart des appareils mobiles qui mesure l'accélération (changement de vitesse).

Cet événement peut être utilisé pour déterminer la direction dans le monde réel de la force de gravité sur un appareil de l'utilisateur. Cela peut également être utilisé pour simuler la force de gravité sur un appareil de l'utilisateur dans le jeu, telle que sur les objets dans le jeu (voir exemple ci-dessous).

Pour vérifier si le dispositif d'un utilisateur a un accéléromètre activé, voir UserInputService.AccelerometerEnabled. Si le dispositif a un accéléromètre activé, vous pouvez utiliser la fonction UserInputService:GetDeviceGravity() pour obtenir la force de gravité actuelle sur le appareilde l'utilisateur.

Paramètres

gravity: InputObject

Un InputObject, avec une propriété InputObject.Position qui montre la force de gravité sur chaque axe local. Cette position peut être utilisée comme une direction pour déterminer la direction de la gravité relative à l'appareil.


Échantillons de code

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

L'événement DeviceRotationChanged se déclenche lorsqu'un utilisateur fait pivoter un appareil qui a un gyroscope.

Un gyroscope est un composant trouvé dans la plupart des appareils mobiles qui détecte l'orientation et la vitesse de rotation.

L'événement est utile pour suivre l'orientation du dispositif et comment les modifications lorsque l'utilisateur tourne son appareil. Pour déterminer la rotation actuelle du dispositif, vous pouvez utiliser la fonction UserInputService:GetDeviceRotation().

Pour vérifier si le périphérique d'un utilisateur a un gyroscope activé et que cet événement se lancer, voir UserInputService.GyroscopeEnabled.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Paramètres

rotation: InputObject

Un InputObject fournissant des informations sur la rotation de l'appareil. InputObject.Position représente la nouvelle rotation d'un Vector3 valeur de position et 1> Class.InputObject.Delta1> représente la modification de la rotation dans un 4> Datatype.Vector34> positional valeur.

cframe: CFrame

Un CFrame représentant l'orientation actuelle de l'appareil.


Échantillons de code

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

L'événement GamepadConnected se déclenche lorsqu'un gamepad est connecté au client.

Puisqu'un jeu Roblox prend en charge plusieurs contrôleurs, cet événement est utile lorsqu'il est associé à l'événement UserInputService.GamepadDisconnected pour suivre les contôleurs/gamepads actifs. Vous pouvez également utiliser UserInputService:GetConnectedGamepads() pour trouver le bon gamepad à utiliser.

L'exemple suivant montre un exemple d'utilisation d'un suivi lorsqu'une manette est connectée au client.


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

Si vous voulez voir les appareils connectés, vous pouvez utiliser la fonction UserInputService:GetConnectedGamepads().

Puisque cet événement se déclenche localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

gamepadNum: Enum.UserInputType

Le Enum.UserInputType de la manette de jeu connectée.


GamepadDisconnected

L'événement GamepadDisconnected se déclenche lorsqu'un gamepad est déconnecté.

Puisqu'un jeu Roblox prend en charge plusieurs contrôleurs, cet événement est utile lorsqu'il est associé à l'événement UserInputService.GamepadConnected pour suivre les contôleurs/gamepads actifs. Vous pouvez également utiliser UserInputService:GetConnectedGamepads() pour trouver le bon gamepad à utiliser.

L'exemple suivant montre un exemple d'utilisation d'un suivi lorsqu'un gamepad est déconnecté du client.


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

Puisque cet événement se déclenche localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

gamepadNum: Enum.UserInputType

Le Enum.UserInputType de la manette de jeu déconnectée.


InputBegan

L'événement InputBegan se déclenche lorsqu'un utilisateur commence à interagir via un appareil d'interface humain-ordinateur (bouton de souris, bouton de touche, bouton de clavier, etc.).

Il peut être utilisé pour suivre le début de l'interaction de l'utilisateur, comme lorsqu'un utilisateur interagit d'abord avec un élément GUI, un gamepad, etc. Il ne capture pas les mouvements de la molette de la souris.

Cet événement peut être utilisé avec UserInputService.InputChanged et UserInputService.InputEnded pour suivre quand l'entrée de l'utilisateur commence, change et se termine.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Paramètres

Une instance InputObject qui contient des informations sur l'entrée de l'utilisateur.

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

L'événement entrée modifiée se déclenche lorsqu'un utilisateur change la façon dont ils interagissent via un appareil d'interface humain-ordinateur (bouton de souris, bouton de toucher, bouton de clavier, etc).

Pour ignorer les événements qui sont automatiquement traités par Roblox, comme le défilement dans un ScrollingFrame , vérifiez que l' argument gameProcessingEvent est faux. Cet événement peut être utilisé avec UserInputService.InputBegan et 1> Class.UserInputService.InputEnded1> pour suivre quand l'entrée

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Paramètres

Une instance InputObject qui contient des informations sur l'entrée de l'utilisateur.

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

L'événement Terminé maintenant se déclenche lorsqu'un utilisateur arrête d'interagir via un appareil d'interface humain-ordinateur (bouton de souris, bouton de touche, bouton de clavier, etc). Ceci est utile lorsque vous traquez quand un utilisateur libère une touche de clavier, un bouton de souris, une entrée de touche, etc.

Cet événement peut être utilisé avec UserInputService.InputBegan et UserInputService.InputChanged pour suivre quand l'entrée de l'utilisateur commence, change et se termine.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Paramètres

Une instance InputObject qui contient des informations sur l'entrée de l'utilisateur.

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

L'événement UserInputService JumpRequest se déclenche lorsqu'il y a une demande de saut du client, par exemple lorsque le client appuie sur la barre d'espace ou le bouton de saut sur mobile.

Cet événement se déclenche toujours lorsque l'utilisateur essaie de faire sauter son Player.Character. Le comportement par défaut répond à une demande de saut en définissant la propriété Humanoid.Jump du joueur sur vrai, ce qui fait sauter le personnage du joueur.

L'événement peut être utilisé pour suivre chaque fois qu'un joueur souhaite sauter. Au lieu de l'utiliser pour faire sauter un joueur, cela devrait être utilisé pour modifier le comportement de saut par défaut - comme désactiver le saut.

Par exemple, le code ci-dessous imprime « sauter » à chaque fois que le joueur envoie une demande de saut.


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

Puisque cet événement se déclenche plusieurs fois pour une seule demande de saut, l'utilisation d'un débounce est recommandée.

Si vous souhaitez connecter des clés ou des boutons à d'autres actions, considérez l'utilisation d'événements tels que UserInputService:GetKeysPressed() et UserInputService.InputBegan ou le ContextActionService.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .


Échantillons de code

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

L'événement UserInputService.LastInputTypeChanged se déclenche chaque fois que le client change la façon dont ils interagissent via un appareil d'interface humain-ordinateur. (i.e. de MouseMovement à MouseWheel ou de Thumbstick1 à Thumbstick2).

Pour obtenir la valeur de l' dernier taperd'entrée, indépendamment de si elle a changé ou non, vous pouvez utiliser la fonction UserInputService:GetLastInputType().

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Paramètres

lastInputType: Enum.UserInputType

Un Enum.UserInputType indiquant le dernier taperd'entrée.


Échantillons de code

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 déclenche lorsque l'utilisateur effectue une action de pointeur spécifique. En particulier, le défilement de la molette de souris.

Paramètres

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

TextBoxFocusReleased

L'événement TextBoxFocusReleasee se déclenche lorsqu'un client perd le focus sur un TextBox - généralement lorsqu'un client arrête l'entrée de texte dans un TextBox en appuyant sur retour ou en cliquant/touchant ailleurs sur l'écran.

Par exemple, le code ci-dessous imprime le nom de la boîte de texte perdant le focus lorsque l'événement se déclenche.


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

Il peut être utilisé avec UserInputService.TextBoxFocused pour suivre quand un TextBox gagne et perd le focus.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

textboxReleased: TextBox

Le TextBox qui a perdu le focus.


Échantillons de code

TextBoxFocusReleased

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

TextBoxFocused

L'événement TextBoxFocused se déclenche lorsqu'un gain de focus sur un TextBox - généralement lorsqu'un client clique/touche sur un champ de texte pour commencer à saisir du texte. Cela déclenche également l'événement si un champ de texte est focalisé en utilisant TextBox:CaptureFocus().

Par exemple, le code ci-dessous imprime le nom de la zone de texte quand l'événement se déclenche.


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

Il peut être utilisé avec UserInputService.FocusReleased pour suivre quand un champ de texte gagne et perd le focus.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

textboxFocused: TextBox

Le TextBox qui a gagné du focus.


Échantillons de code

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

L'événement TouchEnded se déclenche lorsqu'un utilisateur a libéré son doigt de l'écran d'un appareil TouchEnabled, ce qui met fin à l'entrée tactile avec l'appareil.

Cet événement peut être utilisé pour déterminer quand un utilisateur arrête de toucher l'écran de leur appareil. Il peut être combiné avec UserInputService.TouchStarted pour déterminer quand un utilisateur commence et arrête de toucher l'écran.

Par exemple, le code ci-dessous imprime la position de l'écran où l'utilisateur arrête de toucher l'écran.


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

L'objet d'entrée tactile est le même objet d'entrée tout au long de la vie du toucher. Ainsi, comparer InputObjects lorsqu'ils sont des objets tactiles est valide pour déterminer si c'est le même doigt.

Pour vérifier si le périphérique d'un utilisateur est TouchEnabled et que les événements de touche seront lancer, voir UserInputService.TouchEnabled.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

Une instance InputObject qui contient des informations sur l'entrée de l'utilisateur.

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

Activé lorsqu'un utilisateur maintient au moins un doigt pendant une courte durée sur la même position d'écran qu'un appareil TouchEnabled.

Cet événement peut être utilisé pour déterminer quand un utilisateur maintient son doigt vers un élément dans le jeu.

L'exemple ci-dessous imprime le state de la longue pression lorsque l'utilisateur maintient au moins un doigt pendant une courte période sur la même position d'écran. Les états possibles incluent : Commencer , Changer , 1> Finir1> , 4> Annuler4> et 7> Aucun7> .


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)

Pour vérifier si le périphérique d'un utilisateur est TouchEnabled et que les événements de touche seront lancer, voir UserInputService.TouchEnabled.

Il peut être combiné avec UserInputService.TouchStarted et UserInputService.TouchEnded pour déterminer quand un utilisateur commence et arrête de toucher l'écran.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

touchPositions: Array

Un tableau d'objets Vector2, indiquant la position des doigts impliqués dans le geste.

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

L'événement TouchMoved se déclenche lorsqu'un utilisateur déplace son doigt sur un appareil TouchEnabled.

Cet événement peut être utilisé pour déterminer quand un utilisateur déplace son doigt pendant qu'il touche l'écran d'un appareil TouchEnabled. Il peut être utile de suivre si un utilisateur déplace son doigt sur l'écran, ainsi que l'endroit où le doigt de l'utilisateur se déplace.

Le code ci-dessous imprime « Touch déplacé de » la position précédente de Vector2 « à » la nouvelle position de Vector2 de l'utilisateur sur un appareil 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)

Il peut être combiné avec UserInputService.TouchStarted et UserInputService.TouchEnded pour déterminer quand un utilisateur commence à toucher l'écran, comment son doigt se déplace lorsqu'il le touche et quand il arrête de toucher l'écran.

Pour vérifier si le périphérique d'un utilisateur est TouchEnabled et que les événements de touche seront lancer, voir UserInputService.TouchEnabled.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

Une instance InputObject qui contient des informations sur l'entrée de l'utilisateur.

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

L'événement TouchPan se déclenche lorsqu'un utilisateur fait glisser au moins un doigt sur un appareil TouchEnabled.

Cet événement peut être utilisé pour déterminer quand un utilisateur fait pivoter son doigt sur l'écran d'un appareil TouchEnabled - tel qu'il tourne le Camera dans un script de caméra personnalisé.

Le snippet ci-dessous imprime « la vitesse de déplacement de la touche » suivie de la vitesse de la touche de l'utilisateur lorsque l'utilisateur fait glisser leur doigt sur l'écran.


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

Regardez une autre fonction UserInputService ici UserInputService.TouchRotate .

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

touchPositions: Array

Une tableau de Vector2 objets, indiquant les positions des touches (par exemple, les doigts) impliqués dans le geste.

totalTranslation: Vector2

La taille du panier de gestion du début à la fin (en pixels).

velocity: Vector2

La vitesse du panier (en pixels) par seconde.

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

Activé lorsqu'un utilisateur place et déplace deux doigts sur l'écran d'un appareil TouchEnabled.

Par instance, le snippet ci-dessous imprime la mesure dans laquelle la mise à l'échelle de zoom de la caméra a changé depuis le début du toucher pince.


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

Pour vérifier si le périphérique d'un utilisateur est TouchEnabled et que les événements de touche seront lancer, voir UserInputService.TouchEnabled.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée. En tant qu'événement local, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

touchPositions: Array

Une tableau de Vector2s , indiquant la position de l'écran, en pixels, des doigts impliqués dans le geste de pince.

scale: number

La magnitude du pincement de la fin de la ligne de départ (en pixels) divisée par les positions de pincement de la ligne de départ.

velocity: number

La vitesse du geste de pince (en pixels) par seconde.

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

L'événement TouchRotate se déclenche lorsqu'un utilisateur fait pivoter deux doigts sur un appareil TouchEnabled.

Par exemple, le code suivant imprime combien la caméra a tourné depuis le début de la rotation tactile.


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

Pour vérifier si le périphérique d'un utilisateur est TouchEnabled et que les événements de touche seront lancer, voir UserInputService.TouchEnabled.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Les scripts de base qui contrôlent la caméra de l'utilisateur sur un appareil mobile utilisent du code qui fonctionne de manière similaire à cet événement. La meilleure pratique pour cet événement est d'utiliser le lors de la création d'un système de caméra mobile pour écraser les scripts de base.

Voir aussi :

Paramètres

touchPositions: Array

Une tableau de Vector2s , indiquant les positions des doigts impliqués dans le geste.

rotation: number

Nombre de degrés que le geste a tourné depuis le début du geste.

velocity: number

Le changement de rotation (en degrés) divisé par la durée du changement (en secondes).

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

L'événement TouchStarted se déclenche lorsqu'un utilisateur place son doigt sur un appareil TouchEnabled, commençant l'entrée tactile avec l'appareil.

Cet événement peut être utilisé pour déterminer quand un utilisateur commence à toucher l'écran de leur appareil. Il peut être combiné avec UserInputService.TouchEnded pour déterminer quand un utilisateur commence et arrête de toucher l'écran.

L'objet d'entrée tactile est le même objet d'entrée tout au long de la vie du toucher. Ainsi, comparer InputObjects lorsqu'ils sont des objets tactiles est valide pour déterminer si c'est le même doigt.

Pour vérifier si le périphérique d'un utilisateur est TouchEnabled et que les événements de touche seront lancer, voir UserInputService.TouchEnabled.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

Une instance InputObject qui contient des informations sur l'entrée de l'utilisateur.

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

L'événement TouchSwipe se déclenche lorsqu'un utilisateur fait glisser ses doigts sur un appareil TouchEnabled.

Cet événement peut être utilisé pour déterminer quand un utilisateur fait glisser ses doigts sur l'écran de son appareil et dans quelle direction il a fait glisser.

Pour une meilleure traçabilité du mouvement de l'entrée tactile, utilisez en utilisant UserInputService.TouchMoved

Pour vérifier si le périphérique d'un utilisateur est TouchEnabled et que les événements de touche seront lancer, voir UserInputService.TouchEnabled.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

swipeDirection: Enum.SwipeDirection

Une Enum.SwipeDirection, indiquant la direction dans laquelle l'utilisateur a swipé.

numberOfTouches: number

Nombre de touches (par exemple, les doigts) impliqués dans le geste.

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

L'événement TouchTap se déclenche lorsque l'utilisateur touche / touche son doigt sur l'écran sur un appareil TouchEnabled.

Cet événement se déclenchera indépendamment de si l'utilisateur touche/touche le monde du jeu ou un élément GUI. Si vous recherchez un événement qui ne se déclenche que lorsque l'utilisateur touche/touche le monde du jeu, utilisez UserInputService.TouchTapInWorld.

Pour vérifier si le périphérique d'un utilisateur est TouchEnabled et que les événements de touche seront lancer, voir UserInputService.TouchEnabled.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .

Paramètres

touchPositions: Array

Un tableau d'objets Vector2, indiquant la position des doigts impliqués dans le geste de tap.

gameProcessedEvent: bool

Indique si le moteur de jeu a observé internement cette entrée et a agi dessus. Généralement, ceci se réfère à la navigation de l'interface utilisateur, donc si un bouton a été touché ou cliqué à partir de cette entrée, gameProcessedEvent serait true . Ceci est également vrai pour les événements d'entrée connectés via ContextActionService.


Échantillons de code

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

L'événement TouchTapInWorld se déclenche lorsque l'utilisateur touche / touche son doigt sur l'écran sur un appareil TouchEnabled. Il est déclenché lorsque l'utilisateur touche dans le monde du jeu.

Cet événement peut être utilisé pour déterminer quand un utilisateur appuie sur l'écran et ne touche pas à un élément GUI. Si l'utilisateur appuie sur un élément GUI, UserInputService.TouchTap s'exécute au lieu de TouchTapInWorld.

Pour vérifier si le périphérique d'un utilisateur est TouchEnabled et que les événements de touche seront lancer, voir UserInputService.TouchEnabled.

Cet événement ne se déclenche que lorsque la fenêtre client Roblox est en focus. Par exemple, les entrées ne seront pas capturées lorsque la fenêtre est minimisée.

Puisqu'il ne s'exécute que localement, il ne peut être utilisé que dans un LocalScript .

Voir aussi :

Paramètres

position: Vector2

Un Vector2 indiquant la position de la touche.

processedByUI: bool

Whether the user tapped a GUI element.


Échantillons de code

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

L'événement UserInputService WindowFocusRelease s'enclenche lorsque la fenêtre du client Roblox perd le focus - généralement lorsque le client Roblox est minimisé par l'utilisateur.

Par exemple, le code ci-dessous imprime "Window focus released" chaque fois que le client Roblox perd le focus.


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

Cet événement peut être utilisé avec UserInputService.WindowFocused pour suivre si le client Roblox est activement focalisé sur l'écran d'un utilisateur.

Puisqu'il ne s'exécute que localement, il ne peut être utilisé que dans un LocalScript .


Échantillons de code

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

L'événement UserInputService WindowFocused se déclenche lorsque la fenêtre du client Roblox gagne en focus - généralement lorsque le client Roblox est maximisé/activement ouvert sur l'écran de l'utilisateur.

Par exemple, le code ci-dessous imprime "Window focused" chaque fois que le client Roblox gagne du focus.


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

Cet événement peut être utilisé avec UserInputService.WindowFocusReleased pour suivre si le client Roblox est activement focalisé sur l'écran d'un utilisateur.

Puisque cet événement ne se déclenche que localement, il ne peut être utilisé que dans un LocalScript .


Échantillons de code

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)