UserInputService

Visualizza obsoleti

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Non costruibile
Assistenza
Non Replicato

UserInputService è un servizio utilizzato per rilevare e catturare i diversi tipi di input disponibili su un Dispositivoutente.

Il principale scopo di questo servizio è consentire alle esperienze di collaborare con più forme di input disponibili, come gamepad, schermi touch e tastiere. Consente a un LocalScript di eseguire diverse azioni a seconda del dispositivo e, in turn, fornire la migliore esperienza per l'utente finale.

Alcuni usi di questo servizio includono la rilevazione dell'input dell'utente quando interagisce con interfacce utente, strumenti e altre istanze di gioco. Per rilevare l'input dell'utente, il servizio deve cercare un evento come quando l'utente tocca lo schermo di un dispositivo mobile utilizzando UserInputService.TouchStarted , o connette un gamepad

Poiché questo servizio è lato client solo, funzionerà solo quando viene utilizzato in un LocalScript o in un ModuleScript richiesto da un LocalScript . Poiché UserInputService è lato client solo, gli utenti nel gioco possono solo rilevare il proprio input - e non l'input di altri.

Vedi anche ContextActionService, un servizio che ti consente di associare funzioni a più input dell'utente.

Campioni di codice

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)

Sommario

Proprietà

  • Sola Lettura
    Non Replicato
    Lettura Parallela

    Descrive se il dispositivo dell'utente ha un accelerometro.

  • Sola Lettura
    Non Replicato
    Lettura Parallela

    Descrive se il dispositivo utilizzato da un utente ha una gamepad disponibile.

  • Sola Lettura
    Non Replicato
    Lettura Parallela

    Descrive se il dispositivo dell'utente ha un giroscopio.

  • Sola Lettura
    Non Replicato
    Lettura Parallela

    Descrive se il dispositivo dell'utente ha una tastiera disponibile.

  • Determina se il mouse dell'utente può essere spostato liberamente o è bloccato.

  • Non Replicato
    Lettura Parallela

    Scala la produzione di Mouse .

  • Sola Lettura
    Non Replicato
    Lettura Parallela

    Descrivi se il dispositivo dell'utente ha un mouse disponibile.

  • MouseIcon:ContentId
    Lettura Parallela

    L'ID del contenuto dell'immagine utilizzata come Iconadel mouse dell'utente.

  • Lettura Parallela

    Determina se l'icona Mouse è visibile.

  • Sola Lettura
    Non Replicato
    Lettura Parallela

    Determina la posizione della tastiera sullo schermo.

  • Sola Lettura
    Non Replicato
    Lettura Parallela

    Determina la dimensione della tastiera sullo schermo.

  • Sola Lettura
    Non Replicato
    Lettura Parallela

    Descrive se un tastiera sullo schermo è attualmente visibile sullo schermo dell'utente.

  • Sola Lettura
    Non Replicato
    Lettura Parallela

    Descrive se il dispositivo dell'utente ha uno schermo touch disponibile.

  • Sola Lettura
    Non Replicato
    Lettura Parallela

    Indica se l'utente sta usando un headset di realtà virtuale.

Metodi

Eventi

Proprietà

AccelerometerEnabled

Sola Lettura
Non Replicato
Lettura Parallela

Questa proprietà descrive se il dispositivo dell'utente ha un accelerometro

Un accelerometro è un componente trovato nella maggior parte dei dispositivi mobili che misura l'accelerazione (cambiamento di velocità).

Ad esempio, lo snippet di codice seguente mostra come controllare se il dispositivo dell'utente ha un accelerometro.


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

Se il dispositivo ha un accelerometro abilitato, puoi ottenere la sua accelerazione attuale utilizzando la funzione UserInputService:GetDeviceAcceleration() o la traccia quando l'accelerazione del Dispositivocambia utilizzando l'evento UserInputService.DeviceAccelerationChanged .

Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript .

Campioni di codice

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

Sola Lettura
Non Replicato
Lettura Parallela

Questa proprietà descrive se il dispositivo utilizzato da un utente ha una gamepad disponibile. Se le gamepad sono disponibili, puoi utilizzare UserInputService:GetConnectedGamepads() per recuperare un elenco di gamepad connessi.

Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript .

Vedi anche:

Campioni di codice

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

Sola Lettura
Non Replicato
Lettura Parallela

Questa proprietà descrive se il dispositivo dell'utente ha un giroscopio.

Un giroscopio è un componente trovato nella maggior parte dei dispositivi mobili che rileva orientamento e velocità di rotazione.

Se il dispositivo di un utente ha un accelerometro, puoi utilizzarlo nel tuo gioco utilizzando la funzione UserInputService:GetDeviceRotation() e l'evento 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

Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript .

Campioni di codice

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

Sola Lettura
Non Replicato
Lettura Parallela

Questa proprietà descrive se il dispositivo dell'utente ha una tastiera disponibile. Questa proprietà è true quando il dispositivo dell'utente ha una tastiera disponibile e false quando non lo fa.

Può essere utilizzato per determinare se l'utente ha una tastiera disponibile - che può essere importante se si vuole controllare se si può utilizzare UserInputService:IsKeyDown() o UserInputService:GetKeysPressed() per controllare l'input della tastiera.

Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript .

Campioni di codice

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

Lettura Parallela

Questa proprietà imposta il modo in cui il mouse dell'utente si comporta in base al Enum.MouseBehavior Enum. Il valore predefinito è Enum.MouseBehavior.Default.

Può essere impostato su tre valori:

  1. Predefinito : Il mouse si muove liberamente intorno allo schermo dell'utente.
  2. LockCenter : Il mouse è bloccato e non può essere spostato dal centro dello schermo dell'utente.
  3. LockCurrentPosition : Il mouse è bloccato e non può essere spostato da, è la sua posizione attuale sullo schermo dell'utente al momento della blocco.

Il valore di questa Proprietànon influisce sulla sensibilità del tracciamento del mouse. Ad esempio, GetMouseDelta restituisce la stessa posizione di schermo Vector2 indipendentemente dal fatto che il mouse sia bloccato o in grado di muoversi liberamente intorno alla schermata dell'utente. Di Risultato, gli script predefiniti come quelli che controllano la tele

Questa proprietà viene sovrascritta se un GuiButton con Modal abilitato è GuiButton.Visible a meno che il pulsante destro del mouse del Giocatorenon sia down.

Nota che, se il mouse è bloccato, UserInputService.InputChanged continuerà ad essere visualizzato quando il giocatore si muove il mouse e passerà nel Delta che il mouse ha cercato di muovere. Inoltre, se il giocatore viene espulso dalla Gioco, il mouse verrà forzatamente sbloccato.

Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript .

Campioni di codice

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 Replicato
Lettura Parallela

Questa proprietà determina la sensibilità del Mouse dell'utente.

La sensibilità determina la misura in cui una delle mosse del mouse fisico si traduce in una delle mosse del mouse in gioco. Questo può essere utilizzato per regolare la sensibilità con cui vengono tracciati gli eventi, come GetMouseDelta , alle mosse del mouse.

Questa proprietà non influisce sulla velocità di movimento dell'Iconadel mouse. Nor does it affect the sensibilità della fotocamera setting found in the Impostazioni tab of the client's Impostazioni menu, which also adjusts the sensitivity of events tracking mouse movement.

Questa proprietà ha un valore massimo di 10 e un valore minimo di 0. Un valore inferiore corrisponde a una minore sensibilità e un valore superiore a una maggiore sensibilità.

Quando la sensibilità è 0, gli eventi che tracciano il movimento del Topo, or mouse as computer mousesaranno ancora attivati, ma tutti i parametri e le proprietà che indicano la posizione del mouse cambieranno ( Vector2.new() , o Vector3.new() nel caso di InputObject.Delta

Campioni di codice

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

Sola Lettura
Non Replicato
Lettura Parallela

Questa proprietà descrive se il dispositivo dell'utente ha un mouse disponibile. Questa proprietà è true quando il dispositivo dell'utente ha un Topo, or mouse as computer mousedisponibile e false quando non lo ha.


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

È importante controllare questo prima di utilizzare le funzionalità del mouse UserInputService come UserInputService:GetMouseLocation() .

Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript .

Vedi anche:

Campioni di codice

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
Lettura Parallela

La proprietà MouseIcon determina l'immagine utilizzata come punter. Se vuoto, viene utilizzata una freccia predefinita. Mentre il cursore si posiziona su determinati oggetti UI come un ImageButton , TextButton , 1> Class.Loaded1> , o 4> Class.ProximityPrompt

Per nascondere completamente il cursore, non usare un'immagine trasparente. Invece, imposta Class.UserInputService.MouseIconEnabled su false.

Campioni di codice

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

Lettura Parallela

Questa proprietà determina se l'icona Mouse è visibile quando è visibile l'icona del mouse, quando true l'icona del mouse non è visibile, quando false non lo è.

Ad esempio, lo snippet del codice seguente nasconde l'Iconadel Topo, or mouse as computer mouse.


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

Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript .

Campioni di codice

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

Sola Lettura
Non Replicato
Lettura Parallela

Questa proprietà descrive la posizione della tastiera sullo schermo in pixel. La posizione della tastiera è Vector2.new(0, 0) quando non è visibile.

Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript , o in un Script con 1> Class.BaseScript.RunContext|RunContext1> impostato su 4> Enumerate.RunContext.Client4> .

Vedi anche OnScreenKeyboardVisible e OnScreenKeyboardSize .

Campioni di codice

UserInputService.OnScreenKeyboardPosition

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

OnScreenKeyboardSize

Sola Lettura
Non Replicato
Lettura Parallela

Questa proprietà descrive la dimensione della tastiera sullo schermo in pixel. La dimensione della tastiera è Vector2.new(0, 0) quando non è visibile.

Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript , o in un Script con 1> Class.BaseScript.RunContext|RunContext1> impostato su 4> Enumerate.RunContext.Client4> .

Vedi anche OnScreenKeyboardVisible e OnScreenKeyboardPosition .

OnScreenKeyboardVisible

Sola Lettura
Non Replicato
Lettura Parallela

Questa proprietà descrive se è attualmente visibile una tastiera sullo schermo dell'utente.

Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript , o in un Script con 1> Class.BaseScript.RunContext|RunContext1> impostato su 4> Enumerate.RunContext.Client4> .

Vedi anche OnScreenKeyboardSize e OnScreenKeyboardPosition .

TouchEnabled

Sola Lettura
Non Replicato
Lettura Parallela

Questa proprietà descrive se il dispositivo dell'utente ha una schermata touch disponibile.

La proprietà viene utilizzata per determinare se il dispositivo dell'utente ha uno schermo touch, e quindi se gli eventi touch verranno Lanciare. Se TouchEnabled è vero, puoi utilizzare gli eventi UserInputService come UserInputService.TouchStarted e UserInputService.TouchEnded per tracciare quando un utente inizia e finisce a toccare lo schermo del suo Dispositivo.

Il codice snippet seguente stampa se il dispositivo dell'utente ha uno schermo touch.


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

Vedi anche:

Campioni di codice

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

Sola Lettura
Non Replicato
Lettura Parallela

Questa proprietà descrive se l'utente sta usando un Dispositivodi realtà virtuale (VR).

Se un dispositivo VR è abilitato, puoi interagire con la sua posizione e la sua posizione attraverso funzioni come UserInputService:GetUserCFrame() . Puoi anche reagire alla sua posizione con l'evento UserInputService.UserCFrameChanged .


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

Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript .

Vedi anche:

Campioni di codice

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

Metodi

GamepadSupports

Questa funzione restituisce se il gamepad Ennum Ennum.UserInputType supporta un pulsante corrispondente con il Ennum.KeyCode . Questa funzione viene utilizzata per determinare gli input del gamepad validi.

Per determinare quale Enum.UserInputType gamepad sono connessi, usa UserInputService:GetConnectedGamepads() .

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .

Vedi anche:

Parametri

gamepadNum: Enum.UserInputType

Il Enum.UserInputType del gamepad.

gamepadKeyCode: Enum.KeyCode

Il Enum.KeyCode del pulsante in questione.


Restituzioni

Se il gamepad specificato supporta un pulsante corrispondente con il Enum.KeyCode specificato.

Campioni di codice

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

Questa funzione restituisce un array di Enum.UserInputType gamepads attualmente connessi. Se nessun gamepad è connesso, questo array sarà vuoto. Inoltre, restituisce solo oggetti di tipo gamepad che sono gamepad. Ad esempio, questo evento restituirà un oggetto gamepad1 connesso, ma non un oggetto tastiera.

Ad esempio, il seguente codice snippet recupera i gamepad connessi e li memorizza in una variabile chiamata connectedGamepads .


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

Per controllare se un controller specifico è connesso, usa UserInputService:GetGamepadConnected() .

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .

Vedi anche:


Restituzioni

Un array di UserInputTypes corrispondente con i gamepad connessi al Dispositivodell'utente.

Campioni di codice

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 funzione GetDeviceAcceleration determina l'accelerazione corrente del Dispositivodell'utente. Ritorna un InputObject che descrive l'accelerazione corrente del Dispositivo.

Perché questo funzioni, il dispositivo dell'utente deve avere un accelerometro abilitato. Per controllare se un dispositivo dell'utente ha un accelerometro abilitato, puoi controllare la ProprietàUserInputService.AccelerometerEnabled.

Se vuoi invece monitorare quando la accelerazione del Dispositivodell'utente cambia, puoi usare l'evento UserInputService.DeviceAccelerationChanged.

Poiché si esegue solo localmente, può essere utilizzato solo in un LocalScript .


Restituzioni

Campioni di codice

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

Questa funzione restituisce un InputObject che descrive il veicolo attuale della vettoriale.

Il vectore di gravità è determinato dall'orientamento del Dispositivorispetto alla forza di gravità reale. Ad esempio, se un dispositivo è perfettamente in piedi (portrait), il vectore di gravità è Vector3.new(0, 0, -9.18) . Se la parte superiore del dispositivo punta verso

Questa funzione potrebbe essere utilizzata per abilitare il dispositivo dell'utente a influenzare o controllare la gravità nel gioco o muovere oggetti in gioco come una palla.

La gravità viene tracciata solo per i giocatori che utilizzano un dispositivo con un gyroscope abilitato - come un Dispositivomobile.

Per verificare se il dispositivo di un utente ha un accelerometro abilitato, controlla il valore di UserInputService.GyroscopeEnabled . Se il dispositivo ha un accelerometro abilitato, puoi anche utilizzare l'evento UserInputService.DeviceGravityChanged per tracciare quando la forza di gravità sul dispositivo dell'utente cambia.

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .


Restituzioni

Campioni di codice

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

Questa funzione restituisce un InputObject e un CFrame che descrive il vettorialedi rotazione corrente del Dispositivo.

Questo viene attivato con un InputObject. La proprietà Posizione dell'input object è un Enum.InputType.Gyroscope che traccia la rotazione totale in ciascun asse del dispositivo locale.

La rotazione del dispositivo può essere tracciata solo su dispositivi con un gyroscope .

Poiché questa funzione viene eseguita localmente, può essere utilizzata solo in un LocalScript .


Restituzioni

Un tuo contenente due proprietà:

  1. La proprietà delta descrive la quantità di rotazione che è stata l'ultima
  2. Il CFrame è la rotazione attuale del Dispositivorispetto alla sua cornice di riferimento predefinita.

Campioni di codice

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

Questa funzione restituisce il TextBox il cui client è attualmente focalizzato. Un TextBox può essere selezionato manualmente dall'utente, o la selezione può essere forzata utilizzando la funzione TextBox:CaptureFocus(). Se nessun TextBox viene selezionato, questa funzione restituirà nil .

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .

Vedi anche:


Restituzioni

Campioni di codice

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

Questa funzione restituisce se un gamepad con il Enum.UserInputType è connesso al client.

Questo può essere utilizzato per controllare se un particolare gamepad, come 'Gamepad1' è connesso al Dispositivodel client.

Per recuperare un elenco di tutti i gamepad connessi, usa UserInputService:GetConnectedGamepads() .

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .

Vedi anche:

Parametri

gamepadNum: Enum.UserInputType

Il Enum.UserInputType della gamepad in questione.


Restituzioni

Se un gamepad associato a Enum.UserInputType è connesso.

Campioni di codice

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

Questa funzione restituisce un array di InputObjects per tutti gli input disponibili sul gamepad Enum.UserInputType, rappresentando lo stato di input dell'ultimo input per ciascun input.

Per trovare il UserInputTypes dei gamepad connessi, usa UserInputService:GetConnectedGamepads() .

Poiché questa funzione si esegue solo localmente, può essere utilizzata solo in un LocalScript .

Vedi anche:

Parametri

gamepadNum: Enum.UserInputType

Il Enum.UserInputType corrispondente con il gamepad in questione.


Restituzioni

Un array di InputObjects rappresentante lo stato attuale di tutti gli input disponibili per la piattaforma di gioco fornita.

GetImageForKeyCode

ContentId

Questo metodo prende il richiesto Enum.KeyCode e restituisce l'immagine associata per il dispositivo di gioco connesso attualmente (限定 a Xbox, PlayStation e Windows). Ciò significa che se il controller connesso è un controller Xbox, l'utente vede le risorse di Xbox. Allo stesso modo, se il dispositivo connesso è un controller PlayStation, l'utente vede le risorse di PlayStation

Parametri

keyCode: Enum.KeyCode

Il Enum.KeyCode per il quale ottenere l'immagine associata.


Restituzioni

ContentId

L'ID dell'immagine restituita.

Campioni di codice

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

Questa funzione restituisce un array di InputObjects associato alle chiavi attualmente premuto.

Questa lista può essere itérata attraverso per determinare quali sono attualmente i pulsanti che vengono premuti, utilizzando i valori InputObject.KeyCode .

Per controllare se viene premuto una chiave specifica, usa UserInputService:IsKeyDown() .

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .


Restituzioni

Un array di InputObjects associato alle chiavi attualmente premuto.

Campioni di codice

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

Questa funzione restituisce 'enum.UserInputType' associato all'input più recente dell'utente.

Ad esempio, se l'input precedente dell'utente aveva premuto la barra spaziatrice, il Enum.UserInputType restituito sarebbe stato 'Keyboard' .

L'evento UserInputService.LastInputTypeChanged può essere utilizzato per tracciare quando l'ultimo Enum.UserInputType usato dall'utente cambia.

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .


Restituzioni

Il Enum.UserInputType associato all'input più recente dell'utente.

Campioni di codice

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

Questa funzione restituisce un array di InputObjects corrispondente ai pulsanti del mouse attualmente premuti.

I pulsanti del mouse che sono tracciati da questa funzione includono:


<tr>
<td>Button1 del mouse</td>
<td>Il pulsante sinistro del mouse.</td>
</tr>
<tr>
<td>Button2 del mouse</td>
<td>Il pulsante destro del mouse.</td>
</tr>
<tr>
<td>Button3 del mouse</td>
<td>Il pulsante del mouse centrale.</td>
</tr>
NomeDescrizione

Se l'utente non sta premendo alcun pulsante del mouse quando la funzione viene chiamata, restituirà un vettorevuoto.

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .


Restituzioni

Un array di InputObjects corrispondente ai pulsanti del mouse attualmente tenuti premuti.

Campioni di codice

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

Questa funzione restituisce il cambiamento, in pixel, della posizione del GiocatoreMouse nell'ultimo frame renduto come un Vector2 . Questa funzione funziona solo se il mouse è stato bloccato usando la ProprietàUserInputService.MouseBehavior. Se il mouse non è stato bloccato, i valori restituiti saranno zero.

La sensibilità del Topo, or mouse as computer mouse, determinata nelle impostazioni del client e UserInputService.MouseDeltaSensitivity, influenzerà il Risultato.

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .


Restituzioni

Cambia nel movimento del Topo, or mouse as computer mouse.

Campioni di codice

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

Questa funzione restituisce un Vector2 rappresentante la posizione di schermo attuale del GiocatoreMouse in pixel rispetto all'angolo in alto a sinistra. Questo non conta il GUI inset.

Se il posizione del puntatore del mouse è offscreen o il dispositivo del Giocatorenon ha un Topo, or mouse as computer mouse, il valore restituito sarà non determinato.

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .


Restituzioni

Un Vector2 che rappresenta la posizione della schermata attuale del Topo, or mouse as computer mouse, in pixel.

Campioni di codice

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

Questa funzione restituisce un array di gamepad UserInputTypes che sono connessi e abilitati per la navigazione GUI. Questa lista è in ordine crescente di priorità, il che significa che può essere ripetuta per determinare quale gamepad dovrebbe avere il controllo della navigazione.

Se un gamepad connesso è un gamepad di navigazione, ne determinano solo quale gamepad(s) controlla le interfacce utente di navigazione. Questo non influisce sui Controllidi navigazione.

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .

Vedi anche:


Restituzioni

Un array di UserInputTypes che può essere utilizzato per la navigazione GUI, nell'ordine di priorità decrescente.

GetStringForKeyCode

GetStringForKeyCode restituisce una stringa rappresentante una chiave che l'utente dovrebbe premere per inserire un determinato Enum.KeyCode , tenendo presente la loro layout della tastiera. Per i codici di chiave che richiedono un modificatore per essere tenuto premuto, questa funzione restituisce la chiave per essere premuta in aggiunta al modificatore. Vedi gli esempi seguenti per ulteriori spiegazioni.

Quando si utilizza Roblox con una tastiera non QWERTY, i codici chiave vengono mapmati in posizioni QWERTY equivalenti. Ad esempio, premendo A su


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

Esempi sulla tastiera 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>Equl.KeyCode.Equals</code></td>
<td><code>=)</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.At</code></td>
<td><code>2</code> perché <code>@</code> è scritto con <kbd>Shift</kbd><kbd>2</kbd></td>
</tr>
</tbody>
Codice di chiaveRestituisci il valore

Esempi sulla tastiera 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>Equl.KeyCode.Equals</code></td>
<td><code>=)</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.At</code></td>
<td><code>É</code></td>
</tr>
</tbody>
Codice di chiaveRestituisci il valore

Uso del Gamepad

GetStringForKeyCode() restituisce la mappa di stringa per il Enum.KeyCode per il gamepad più recentemente connesso. Se il controller non è supportato, la funzione restituisce la conversione di stringa predefinita per il richiesto codice di chiave.

L'esempio seguente mostra come puoi mappare le risorse personalizzate per 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

Mappature Gamepad

I codici della chiave del pad direzionale non hanno alcuna differenza in base al Dispositivo. Enum.KeyCode.ButtonSelect ha un comportamento leggermente diverso in alcuni casi. Usa entrambi i mappaggi PlayStation per assicurarti che gli utenti vedano i pulsanti corretti.


<tbody>
<tr>
<td><code>Enum.KeyCode.ButtonA</code></td>
<td><code>ButtonCross</code></td>
<td><code>ButtonA</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonB</code></td>
<td><code>ButtonCircle</code></td>
<td><code>ButtonB.</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonX</code></td>
<td><code>ButtonSquare</code></td>
<td><code>ButtonX</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonY</code></td>
<td><code>Triangolo dei pulsanti</code></td>
<td><code>ButtonY</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonL1</code></td>
<td><code>ButtonL1</code></td>
<td><code>ButtonLB</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonL2</code></td>
<td><code>ButtonL2</code></td>
<td><code>ButtonLT.</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonL3</code></td>
<td><code>ButtonL3</code></td>
<td><code>ButtonLS</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonR1</code></td>
<td><code>ButtonR1</code></td>
<td><code>ButtonRB</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonR2</code></td>
<td><code>ButtonR2</code></td>
<td><code>ButtonRT</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonR3</code></td>
<td><code>ButtonR3</code></td>
<td><code>ButtonRS</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonStart</code></td>
<td><code>Opzioni di pulsante</code></td>
<td><code>Inizio pulsante</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonSelect</code></td>
<td><code>ButtonTouchpad</code> e <code>ButtonShare</code></td>
<td><code>ButtonSelect</code></td>
</tr>
</tbody>
Codice di chiavePlayStation Valore di ritornoValore di restituzione Xbox

Immagini di sistema per KeyCodes

Quando si utilizzano Enum.KeyCode che potrebbero essere rappresentati migliore come un'immagine, come per un ImageLabel in un'interfaccia utente, si possono utilizzare i seguenti icon di legacy. Tuttavia, è consigliato utilizzare GetImageForKeyCode() come metodo più moderno per recuper


<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.ButtonY</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxY.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxY.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonA</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxA.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxA.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonB</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>Enum.KeyCode.DPadLeft</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>Enum.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>Enum.KeyCode.DPadUp</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadUp.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadUp.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.DPadDown</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>Enum.KeyCode.ButtonSelect</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>Enum.KeyCode.ButtonStart</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>Enum.KeyCode.Backspace</code></td>
<td>
<img src="../../../assets/scripting/controls/backspace.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/backspace.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.Return</code></td>
<td>
<img src="../../../assets/scripting/controls/return.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/return.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.LeftShift</code></td>
<td>
<img src="../../../assets/scripting/controls/shift.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/shift.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.RightShift</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>Enum.KeyCode.Period</code></td>
<td>
<img src="../../../assets/scripting/controls/period.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/price.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>
Codice di chiaveImmagineID risorsa

Parametri

keyCode: Enum.KeyCode

Restituzioni

GetSupportedGamepadKeyCodes

Questa funzione restituisce un array di KeyCodes che il gamepad associato con il supporto Enum.UserInputType fornisce.

Questa funzione può essere utilizzata per determinare quali KeyCodes sono supportati e non supportati da un gamepad connesso. Per determinare se un codice chiave specifico è supportato, usa UserInputService:GamepadSupports() .

Se chiamato su una gamepad non esistente, o non connessa, questa funzione restituirà un vettorevuoto.

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .

Vedi anche:

Parametri

gamepadNum: Enum.UserInputType

Il Enum.UserInputType del gamepad.


Restituzioni

Un array di KeyCodes supportato dalla piattaforma di gioco.

Campioni di codice

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

Questa funzione controlla se viene premuto un particolare pulsante su una particolare gamepad. Ritorna true se il gamepad ha il pulsante specificato button premuto, altrimenti restituisce false.

Tipi di ingresso validi

Il gamepad specificato dovrebbe essere uno dei seguenti valori dell'interruttore utente:


<tr>
<td>Tipo di input dell'utente.Gamepad1-8</td>
</tr>
Nome

Codici di valida

Il pulsante specificato dovrebbe essere uno dei seguenti valori dell'enumerazione KeyCodes:


<tr>
<td>Enum.KeyCode.ButtonX</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonY</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonA</td>
</tr>
<tr>
<td>ButtonCode.KeyCode.ButtonB</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonR1</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonL1</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonR2</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonL2</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonR3</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonL3</td>
</tr>
<tr>
<td>ButtonStart di Enum.KeyCode.</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonSelect</td>
</tr>
<tr>
<td>PadLeft.KeyCode.DPadLeft</td>
</tr>
<tr>
<td>DPadRight</td>
</tr>
<tr>
<td>DPadUp di KEYCode.</td>
</tr>
<tr>
<td>DPadDown di Enum.KeyCode.</td>
</tr>
Nome

Questo può essere utilizzato per controllare se un pulsante specifico, come A, viene tenuto premuto. Ad esempio:


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

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .

Vedi anche:

Parametri

gamepadNum: Enum.UserInputType

Il Enum.UserInputType del gamepad specificato.

gamepadKeyCode: Enum.KeyCode

Il Enum.KeyCode del pulsante specificato.


Restituzioni

Se viene premuto il pulsante specificato gamepad sul gamepad specificato.

Campioni di codice

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

Questa funzione restituisce se l'utente sta tenendo premuto la chiave associata all'Enum.KeyCode . Ritorna true se la chiave specificata viene premuta o false se non viene premuta.

Questo può essere utilizzato per controllare se viene premuto una chiave specifica, come la barra spaziatrice. Ad esempio:


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

Per recuperare una lista di tutte le chiavi premute dall'utente, usa la funzione UserInputService:GetKeysPressed() .

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .

Vedi anche:

Parametri

keyCode: Enum.KeyCode

Il Enum.KeyCode della chiave.


Restituzioni

Se la chiave specificata viene tenuta premuta.

Campioni di codice

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

Questa funzione prende un pulsante del mouse Enum.UserInputType e restituisce un bool che indica se è attualmente premuto.

Il pulsante del mouse controllato dipende dal valore Enum.UserInputType passato alla funzione come argomento. Ad esempio:


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

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript."

Parametri

mouseButton: Enum.UserInputType

Il Enum.UserInputType del pulsante del mouse.


Restituzioni

Se il pulsante del mouse specificato è attualmente premuto.

Campioni di codice

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

Questa funzione restituisce true se il gamepad specificato Enum.UserInputType è autorizzato a controllare la navigazione e la selezione GUIs .

Se vuoi impostare un gamepad di navigazione, puoi usare UserInputService:SetNavigationGamepad(). Puoi anche usare UserInputService:GetNavigationGamepads() per ottenere un elenco di tutti i gamepad di navigazione.

Ad esempio, il codice seguente controlla se il gamepad1 è come un gamepad di navigazione:


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

Una lista di tutti i gamepad connessi, indipendentemente dalla navigazione, può essere recuperata utilizzando `UserInput/GetConnectedGamepads.

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .

Vedi anche:

Parametri

gamepadEnum: Enum.UserInputType

Il Enum.UserInputType del gamepad specificato.


Restituzioni

Se la gamepad specificata è una gamepad di navigazione.

RecenterUserHeadCFrame

void

Questa funzione ripristina il CFrame della VR headset all'orientamento attuale dell'headset indossato dall'utente. Ciò significa che l'orientamento attuale della headset è impostato su CFrame.new() .

Usa questa funzione per spostare il CFrame Headset al centro dell'area di gioco se sembra essere in un Dislocamentostrano.

Questo si comporta identificativamente alla funzione VRService, VRService:RecenterUserHeadCFrame().

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .


Restituzioni

void

Campioni di codice

UserInputService:RecenterUserHeadCFrame

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

SetNavigationGamepad

void

La funzione SetNavigationGamepad imposta se il gamepad specificato Enum.UserInputType può spostare il navigatore GUI. Un gamepad che è autorizzato a spostare il navigatore GUI è considerato un gamepad navigator.

Se l'argomento abilitato viene passato come true , il Gamepad può muovere il navigatore GUI. Se l'argomento è false , il Gamepad non può muovere il navigatore GUI.

Se vuoi controllare se un Gamepad specificato è un set per essere un gamepaddi navigazione, puoi utilizzare la funzione UserInputService:IsNavigationGamepad(). Puoi anche utilizzare la funzione UserInputService:GetNavigationGamepads() per recuperare un elenco di tutti i Gamepad di navigazione.

Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .

Vedi anche:

Parametri

gamepadEnum: Enum.UserInputType

Il Enum.UserInputType del gamepad specificato.

enabled: bool

Se la gamepad specificata può muovere il navigatore GUI.


Restituzioni

void

Campioni di codice

UserInputService:SetNavigationGamepad

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

Eventi

DeviceAccelerationChanged

L'evento DeviceAccelerationChanged si attiva quando un utente si muove su un dispositivo che ha un accelerometro.

Un accelerometro è un componente trovato nella maggior parte dei dispositivi mobili che misura l'accelerazione (cambiamento di velocità).

Per determinare se il dispositivo di un utente ha un accelerometro abilitato, vedi UserInputService.AccelerometerEnabled .

Questo evento può essere utilizzato per tracciare il movimento di un dispositivo che ha un accelerometro. Un esempio di utilizzo include il movimento del personaggio del giocatore quando un dispositivo mobile accelera.

Inoltre, questo evento può essere utilizzato insieme a UserInputService:GetDeviceAcceleration() per determinare il movimento corrente del dispositivo dell'utente se il dispositivo ha un accelerometro.

Questo evento si attiva solo localmente - il che significa che solo il giocatore il cui dispositivo si muove può utilizzarlo e funzionerà solo in un LocalScript .

Parametri

acceleration: InputObject

Un InputObject , con un UserInputType di 'Acceleratore' e un 1> Class.InputObject.Position|Position1> che mostra la forza della gravità su ciascun asse del dispositivo locale.


Campioni di codice

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'evento UserInputService.DeviceGravityChanged attiva quando la gravità del DispositivoVector3 cambia su un dispositivo che ha un accelerometro.

Il vettore di gravità di un Dispositivorappresenta la forza della gravità su ciascuno degli assi X, Y e Z del Dispositivo. Mentre la gravità non cambia, la forza che esercita su ciascun asse cambia quando il dispositivo ruota e cambia orientamento. Il valore di forza esercitato su ciascun asse è un vettore di unità che va da -1 a 1.

Un accelerometro è un componente trovato nella maggior parte dei dispositivi mobili che misura l'accelerazione (cambiamento di velocità).

Questo evento può essere utilizzato per determinare la direzione del mondo reale della forza di gravità su un Dispositivodell'utente. Questo può essere utilizzato anche per simulare la forza di gravità su un dispositivo dell'utente all'interno del Gioco, come sui oggetti in gioco (vedi esempio sotto).

Per controllare se il dispositivo di un utente ha un accelerometro abilitato, vedi UserInputService.AccelerometerEnabled . Se il dispositivo ha un accelerometro abilitato, puoi utilizzare la funzione UserInputService:GetDeviceGravity() per ottenere la forza di gravità corrente sul Dispositivodell'utente.

Parametri

gravity: InputObject

Un InputObject , con una proprietà InputObject.Position che mostra la forza della gravità su ciascun asse del dispositivo locale. Questa posizione può essere utilizzata come una direzione per determinare la direzione della gravità rispetto al Dispositivo.


Campioni di codice

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'evento DeviceRotationChanged si attiva quando un utente ruota un dispositivo che ha un giroscopio.

Un giroscopio è un componente trovato nella maggior parte dei dispositivi mobili che rileva orientamento e velocità di rotazione.

L'evento è utile per tracciare l'orientamento del dispositivo e come le modifiche come l'utente ruota il loro Dispositivo. Per determinare la rotazione attuale del dispositivo, puoi utilizzare la funzione UserInputService:GetDeviceRotation() .

Per controllare se il dispositivo di un utente ha un accelerometro abilitato e che questo evento si Lanciare, vedi UserInputService.GyroscopeEnabled .

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Parametri

rotation: InputObject

Un InputObject che fornisce informazioni sulla rotazione del Dispositivo. InputObject.Position rappresenta il nuovo valore di rotazione in posizione di un Vector3 e 1> Class.InputObj.Delta1> rappresenta la variazione di rotazione in posizione di un 4> Datatype.Vector34> posizionale

cframe: CFrame

Un CFrame che rappresenta l'orientamento attuale del Dispositivo.


Campioni di codice

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'evento GamepadConnected si attiva quando viene connesso un gamepad al client.

Poiché un gioco Roblox supporta più controllori, questo evento è utile quando viene abbinato all'evento UserInputService.GamepadDisconnected per tracciare quali controllori/gamepad sono attivi. Puoi anche usare UserInputService:GetConnectedGamepads() per trovare il gamepad corretto da usare.

L'esempio seguente mostra un esempio di utilizzo di un tracking quando viene connesso un gamepad al client.


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

Se vuoi vedere quali dispositivi sono connessi, puoi utilizzare la funzione UserInputService:GetConnectedGamepads() .

Poiché questo evento si attiva localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

gamepadNum: Enum.UserInputType

Il Enum.UserInputType della gamepad connessa.


GamepadDisconnected

L'evento GamepadDisconnected si attiva quando viene disconnesso un gamepad.

Poiché un gioco Roblox supporta più controllori, questo evento è utile quando viene abbinato all'evento UserInputService.GamepadConnected per tracciare quali controllori/gamepad sono attivi. Puoi anche usare UserInputService:GetConnectedGamepads() per trovare il gamepad corretto da usare.

L'esempio seguente mostra un esempio di utilizzo di un tracking quando un gamepad viene disconnesso dal client.


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

Poiché questo evento si attiva localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

gamepadNum: Enum.UserInputType

Il Enum.UserInputType della gamepad disconnessa.


InputBegan

L'evento InputBegan si attiva quando un utente inizia ad interagire tramite un dispositivo di interfaccia uomo-corrispondente (tasto del mouse, tocco iniziale, pulsante della tastiera, ecc.).

Può essere utilizzato per tracciare l'inizio dell'interazione utente, come quando un utente interagisce per la prima volta con un elemento GUI, un gamepad, ecc. Non cattura i movimenti del mouse.

Questo evento può essere utilizzato insieme a UserInputService.InputChanged e UserInputService.InputEnded per tracciare quando l'input dell'utente inizia, cambia e finisce.

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Parametri

Un'esempioInputObject che contiene informazioni sull'input dell'utente.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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'evento InputChanged si attiva quando un utente cambia il modo in cui interagisce tramite un dispositivo di interfaccia uomo-corrispondente (tasto del mouse, inizio del tocco, pulsante della tastiera, ecc).

Per ignorare gli eventi che vengono gestiti automaticamente da Roblox, come lo scorrimento in un ScrollingFrame , controlla se l'argomento gameProcessingEvent è falso. Questo evento può essere utilizzato insieme a UserInputService.InputBegan e 1> Class.UserInputService.InputEnded1> per tracciare quando inizia,

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Parametri

Un'esempioInputObject che contiene informazioni sull'input dell'utente.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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'evento InputEnded si attiva quando un utente smette di interagire tramite un dispositivo di interfaccia utente-computer (tasto del mouse, inizio del tocco, pulsante del tastiera, ecc). Questo è utile quando si traccia quando un utente rilascia una chiave di tastiera, un pulsante del mouse, un tocco sullo schermo, ecc.

Questo evento può essere utilizzato insieme a UserInputService.InputBegan e UserInputService.InputChanged per tracciare quando l'input dell'utente inizia, cambia e finisce.

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Parametri

Un'esempioInputObject , che contiene informazioni sull'input dell'utente.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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'evento UserInputService del Class.UserInputService viene attivato quando viene eseguita una richiesta di salto dal client, ad esempio quando il client premere la barra spaziatrice o il pulsante di salto sul mobile.

Questo evento si attiva quando l'Giocatoretenta di fare il suo SaltaPlayer.Character . Il comportamento predefinito risponde a una richiesta di salto impostando la proprietà Humanoid.Jump del Giocatoresu true, il che rende il personaggio dell'utente a Salta.

L'evento può essere utilizzato per tracciare ogni volta che un giocatore vuole Salta. Invece di utilizzarlo per fare un giocatore Salta, questo dovrebbe essere utilizzato per cambiare il comportamento di salto predefinito - come disabilitare il salto.

Ad esempio, il codice seguente stampa "Salta" ogni volta che il giocatore invia una Richiestadi salto.


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

Poiché questo evento si attiva più volte per una singola Richiestadi salto, viene suggerito di utilizzare un debounce .

Se desideri connettere chiavi o pulsanti a altre azioni, considera l'uso di eventi come UserInputService:GetKeysPressed() e UserInputService.InputBegan o il ContextActionService .

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .


Campioni di codice

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'evento UserInputService.LastInputTypeChanged attiva ogni volta che il client cambia il modo in cui interagisce tramite un Dispositivodi interfaccia umano-computer. (ad esempio, da MouseMovement a MouseWheel o da Thumbstick1 a Thumbstick2).

Per ottenere il valore dell'ultimo inserisci / scrividi input, indipendentemente dal fatto che sia cambiato o no, puoi utilizzare la funzione UserInputService:GetLastInputType() .

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Parametri

lastInputType: Enum.UserInputType

Un Enum.UserInputType che indica l'ultimo inserisci / scrividi input.


Campioni di codice

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 aziona quando l'utente esegue un'azione specifica del mouse. In particolare, scorrendo la ruota del mouse.

Parametri

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

TextBoxFocusReleased

L'evento TextBoxFocusRelease si attiva quando un client perde il focus su un TextBox - tipicamente quando un client stoppa l'ingresso del testo in un TextBox facendo clic/toccare da qualche altra parte sulla schermata.

Ad esempio, il codice seguente stampa il nome della TextBox che perde focus quando si attiva l'evento.


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

Può essere utilizzato insieme a UserInputService.TextBoxFocused per tracciare quando un TextBox guadagna e perde focus.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

textboxReleased: TextBox

Il TextBox che ha perso il focus.


Campioni di codice

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'evento TextBoxFocused viene attivato quando un'adesione si concentra su un TextBox - di solito quando un client clicca / tocca su un'adesione per iniziare l'input del testo. Questo si attiva anche se un'adesione si concentra utilizzando TextBox:CaptureFocus() .

Ad esempio, il codice seguente stampa il nome della TextBox quando si attiva l'evento.


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

Può essere utilizzato insieme a UserInputService.FocusReleased per tracciare quando una casella di testo guadagna e perde focus.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

textboxFocused: TextBox

Il TextBox che ha ottenuto il focus.


Campioni di codice

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'evento TouchEnded si attiva quando un utente rilascia il suo dito dalla schermata di un DispositivoTouchEnabled, terminando l'input del tocco con il Dispositivo.

Questo evento può essere utilizzato per determinare quando un utente smette di toccare lo schermo del loro Dispositivo. Può essere abbinato con UserInputService.TouchStarted per determinare quando un utente inizia e smette di toccare lo schermo.

Ad esempio, il codice seguente stampa la posizione di schermo in cui l'utente smette di toccare lo schermo.


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

L'oggetto touch input è lo stesso oggetto touch throughout il lifetime of the touch. So comparando InputObjects quando sono touch objects è valido per determinare se è lo stesso dito.

Per controllare se il dispositivo di un utente è TouchEnabled e che gli eventi di touch verranno Lanciare, vedi UserInputService.TouchEnabled .

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

Un'esempioInputObject che contiene informazioni sull'input dell'utente.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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

Si attiva quando un utente tiene almeno un dito per un breve periodo di tempo nella stessa posizione sullo schermo di un DispositivoTouchEnabled .

Questo evento può essere utilizzato per determinare quando un utente tiene il dito a terra su un in-game GUI o elemento.

L'esempio seguente stampa il state della lunga pressione quando l'utente tiene almeno un dito per un breve periodo di tempo nella stessa posizione sullo schermo. Possibili stati includono: Inizio , Cambia , 1> Fine1> , 4> Cancella4> e 7> Nessuno7> .


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)

Per controllare se il dispositivo di un utente è TouchEnabled e che gli eventi di touch verranno Lanciare, vedi UserInputService.TouchEnabled .

Può essere abbinato con UserInputService.TouchStarted e UserInputService.TouchEnded per determinare quando un utente inizia e finisce di toccare lo schermo.

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

touchPositions: Array

Un array di Vector2 oggetti, che indica la posizione dei dita coinvolti nel gesto.

Il Enum.UserInputState della gestione.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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'evento TouchMoved si attiva quando un utente muove il dito su un DispositivoTouchEnabled.

Questo evento può essere utilizzato per determinare quando un utente muove il dito mentre tocca lo schermo di un DispositivoTouchEnabled. Potrebbe essere utile tracciare se un utente sta muovendo il dito sullo schermo, nonché dove muove il dito.

Il codice seguente stampa "Touch moved from" la posizione Vector2 precedente "to" la nuova posizione Vector2 dell'utente su un DispositivoTouchEnabled .


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)

Può essere abbinato con UserInputService.TouchStarted e UserInputService.TouchEnded per determinare quando un utente inizia a toccare lo schermo, come il loro dito si muove quando lo toccano e quando lo toccano finché non lo toccano.

Per controllare se il dispositivo di un utente è TouchEnabled e che gli eventi di touch verranno Lanciare, vedi UserInputService.TouchEnabled .

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

Un'esempioInputObject che contiene informazioni sull'input dell'utente.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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'evento TouchPan si attiva quando un utente trascina almeno un dito su un dispositivo TouchEnabled .

Questo evento può essere utilizzato per determinare quando un utente fa clic con il dito sulla schermata di un dispositivo TouchEnabled - come per ruotare il Camera in uno script di fotocamera personalizzato.

Il seguente snippet stampa "Velocità diagonamento del tocco" seguita dalla velocità del tocco dell'utente quando l'utente trascina il dito sullo schermo.


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

Dai un'occhiata a un'altra utile funzione UserInputService qui UserInputService.TouchRotate .

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

touchPositions: Array

Un array di Vector2 oggetti, che indica le posizioni dei pulsanti (ad esempio, dita) coinvolti nel gesto.

totalTranslation: Vector2

La dimensione del paniere dal punto di partenza all'arrivo (in pixel).

velocity: Vector2

La velocità della manovra della pan (in pixel) per secondo.

Il Enum.UserInputState della gestione.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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

Spara quando un utente inserisce e muove due dita sullo schermo di un TouchEnabled Dispositivo.

Ad esempio, lo snippet seguente mostra quanto la scala di zoom della fotocamera sia cambiata dall'inizio del pizzaiolo.


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

Per controllare se il dispositivo di un utente è TouchEnabled e che gli eventi di touch verranno Lanciare, vedi UserInputService.TouchEnabled .

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata. Come questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

touchPositions: Array

Un array di Vector2s , che indica la posizione dello schermo, in pixel, dei datori di punta coinvolti nel gesto di punta.

scale: number

La magnitudine del pizzolino dal punto di partenza alla fine (in pixel) divisa dalle posizioni di partenza dei pizzolini.

velocity: number

La velocità del gesto di punta (in pixel) per secondo.

Il Enum.UserInputState della gestione.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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'evento TouchRotate si attiva quando un utente ruota due dita su un dispositivo TouchEnabled .

Ad esempio, il seguente codice stampa quanto la fotocamera abbia ruotato fin dall'inizio della rotazione del tocco.


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

Per controllare se il dispositivo di un utente è TouchEnabled e che gli eventi di touch verranno Lanciare, vedi UserInputService.TouchEnabled .

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Gli script del core che controllano la fotocamera dell'utente su un dispositivo mobile utilizzano il codice che funziona allo stesso modo su questo evento. La migliore pratica per questo evento è utilizzarlo quando si crea un sistema di fotocamera mobile per sovrascrivere gli script del core predefiniti.

Vedi anche:

Parametri

touchPositions: Array

Un array di Vector2s , che indica le posizioni dei dita coinvolti nel gesto.

rotation: number

Il numero di gradi che il gesto ha rotolato dall'inizio del gesto.

velocity: number

Il cambiamento di rotazione (in gradi) diviso dalla durata del cambiamento (in secondi).

Il Enum.UserInputState della gestione.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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'evento TouchStarted si attiva quando un utente mette il dito su un DispositivoTouchEnabled , iniziando l'input del tocco con il Dispositivo.

Questo evento può essere utilizzato per determinare quando un utente inizia a toccare lo schermo del loro Dispositivo. Può essere abbinato con UserInputService.TouchEnded per determinare quando un utente inizia e finisce a toccare lo schermo.

L'oggetto touch input è lo stesso oggetto touch throughout il lifetime of the touch. So comparando InputObjects quando sono touch objects è valido per determinare se è lo stesso dito.

Per controllare se il dispositivo di un utente è TouchEnabled e che gli eventi di touch verranno Lanciare, vedi UserInputService.TouchEnabled .

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

Un'esempioInputObject che contiene informazioni sull'input dell'utente.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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'evento TouchSwipe si attiva quando un utente tocca con il dito un DispositivoTouchEnabled .

Questo evento può essere utilizzato per determinare quando un utente passa il dito sullo schermo del suo dispositivo e la direzione in cui l'utente passa.

Per un monitoraggio più preciso del movimento dell'input del tocco, usa usando UserInputService.TouchMoved

Per controllare se il dispositivo di un utente è TouchEnabled e che gli eventi di touch verranno Lanciare, vedi UserInputService.TouchEnabled .

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

swipeDirection: Enum.SwipeDirection

Un Enum.SwipeDirection , che indica la direzione in cui l'utente ha scorso.

numberOfTouches: number

Numero di tocchi (ad esempio, dita) coinvolti nel gesto.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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'evento TouchTap si attiva quando l'utente tocca / tocca il dito sullo schermo su un DispositivoTouchEnabled .

Questo evento si attiverà indipendentemente dal fatto che l'utente tocchi / tocchi il mondo del gioco o un elemento GUI. Se stai cercando un evento che si attiva solo quando l'utente tocca / tocca il Mondodel gioco, usa UserInputService.TouchTapInWorld .

Per controllare se il dispositivo di un utente è TouchEnabled e che gli eventi di touch verranno Lanciare, vedi UserInputService.TouchEnabled .

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .

Parametri

touchPositions: Array

Un array di Vector2 oggetti, che indica la posizione dei dita coinvolti nel gesto di tocco.

gameProcessedEvent: bool

Indica se il motore di gioco ha osservato internamente questo input e ha agito su di esso. In generale, questo si riferisce alla elaborazione UI, quindi se un pulsante è stato toccato o cliccato da questo input, gameProcessedEvent sarebbe true . Questo è anche vero per gli eventi di input connessi tramite ContextActionService .


Campioni di codice

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'evento TouchTapInWorld si attiva quando l'utente tocca / tocca il dito sullo schermo su un DispositivoTouchEnabled . Viene attivato quando l'utente tocca nel Mondodi gioco.

Questo evento può essere utilizzato per determinare quando un utente tocca lo schermo e non tocca un elemento GUI . Se l'utente tocca un elemento GUI, UserInputService.TouchTap viene attivato invece di TouchTapInWorld.

Per controllare se il dispositivo di un utente è TouchEnabled e che gli eventi di touch verranno Lanciare, vedi UserInputService.TouchEnabled .

Questo evento si attiva solo quando la finestra client Roblox è in focus. Ad esempio, gli input non saranno catturati quando la finestra è minimizzata.

Poiché si esegue solo localmente, può essere utilizzato solo in un LocalScript .

Vedi anche:

Parametri

position: Vector2

Un Vector2 che indica la posizione del tocco.

processedByUI: bool

Indipendentemente dal fatto che l'utente abbia toccato un elemento GUI.


Campioni di codice

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'evento UserInputService WindowFocusRelease si attiva quando la finestra del client Roblox perde focus - tipicamente quando il client Roblox viene minimizzato dall'utente.

Ad esempio, il codice seguente stampa "Window focus released" ogni volta che il client Roblox perde focus.


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

Questo evento può essere utilizzato insieme a UserInputService.WindowFocused per tracciare se il client Roblox è attivamente focus sullo schermo dell'utente.

Poiché si esegue solo localmente, può essere utilizzato solo in un LocalScript .


Campioni di codice

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'evento UserInputService WindowFocused si attiva quando la finestra del client Roblox ottiene focus - tipicamente quando la finestra del client Roblox è massimizzata / attivamente aperta sullo schermo dell'utente.

Ad esempio, il codice seguente stampa "Window focused" ogni volta che il client Roblox ottiene focus.


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

Questo evento può essere utilizzato insieme a UserInputService.WindowFocusReleased per tracciare se il client Roblox è attivamente focalizzato sullo schermo di un utente.

Poiché questo evento si attiva solo localmente, può essere utilizzato solo in un LocalScript .


Campioni di codice

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)