UserInputService
*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.
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
-- 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à
Descrive se il dispositivo dell'utente ha un accelerometro.
Descrive se il dispositivo utilizzato da un utente ha una gamepad disponibile.
Descrive se il dispositivo dell'utente ha un giroscopio.
Descrive se il dispositivo dell'utente ha una tastiera disponibile.
Determina se il mouse dell'utente può essere spostato liberamente o è bloccato.
Scala la produzione di Mouse .
Descrivi se il dispositivo dell'utente ha un mouse disponibile.
L'ID del contenuto dell'immagine utilizzata come Iconadel mouse dell'utente.
Determina se l'icona Mouse è visibile.
Determina la posizione della tastiera sullo schermo.
Determina la dimensione della tastiera sullo schermo.
Descrive se un tastiera sullo schermo è attualmente visibile sullo schermo dell'utente.
Descrive se il dispositivo dell'utente ha uno schermo touch disponibile.
Indica se l'utente sta usando un headset di realtà virtuale.
Metodi
Restituisce se il gamepad Enum.UserInputType fornito supporta un pulsante corrispondente con il Enum.KeyCode fornito.
Restituisce un'area di Enum.UserInputType gamepad attualmente connessi.
Restituisce un InputObject che descrive l'accelerazione corrente del Dispositivo.
Restituisce un InputObject che descrive il veicolo attuale della vettoriale.
Restituisce un InputObject e un CFrame , che descrivono il veicolo attuale della vettoriale.
Restituisce il valore attuale di TextBox che il client è attualmente focalizzato.
Restituisce se un gamepad con il Enum.UserInputType gamepadNum è connesso.
Restituisce un'area di InputObjects per tutti gli input disponibili sul gamepad specificato, rappresentando lo stato di input dell'ultimo input.
Restituisce un'immagine per il richiesto Enum.KeyCode .
Restituisce un array di InputObjects associato con il keys attualmente premuto.
Restituisce il Enum.UserInputType associato all'input più recente dell'utente.
Restituisce un' array di InputObjects corrispondente ai pulsanti del mouse attualmente tenuti premuti.
Restituisce il cambiamento, in pixel, della posizione del GiocatoreMouse nell'ultimo frame renduto. Funziona solo se il mouse è bloccato.
Restituisce la posizione dell'area di lavoro attuale del GiocatoreMouse relativa all'angolo in alto a sinistra dello schermo.
Restituisce un'area di gamepads connessa e abilitata per la navigazione GUI in ordine crescente di priorità.
Restituisce una stringa che rappresenta una chiave che l'utente dovrebbe premere per inserire un dato Enum.KeyCode .
Restituisce un' array di KeyCodes che il gamepad associato con il supporto Enum.UserInputType supporta.
Determina se viene premuto un particolare pulsante su una particolare gamepad.
Restituisce se il key è attualmente bloccato.
Restituisce se il pulsante mouse button è attualmente premuto.
Restituisce vero se il gamepad specificato Enum.UserInputType è autorizzato a controllare la navigazione GUIs .
Ripristina il CFrame della VR Headset all'orientamento attuale della headset indossata dall'utente.
Imposta se o no il Gamepad navigator può muovere il GUI navigatore.
Eventi
Si attiva quando un utente si muove su un dispositivo che ha un accelerometro. Viene utilizzato per tracciare il movimento reale del dispositivo all'interno di un GiocoRoblox.
Si attiva quando la forza di gravità cambia su un dispositivo che ha un accelerometro abilitato - come un Dispositivomobile.
Si attiva quando un utente ruota un dispositivo che ha un giroscopio.
Si attiva quando viene connesso un gamepad al client. Passa il "gamepadNum" del gamepad che è stato connesso.
Si attiva quando viene disconnesso un gamepad dal client. Passa il Enum.UserInputType del gamepad che è stato disconnesso.
Si attiva quando un utente inizia ad interagire tramite un dispositivo dell'interfaccia uomo-corrispondente - come un mouse o un gamepad.
Si attiva quando un utente cambia il modo in cui interagisce con un Dispositivodell'interfaccia uomo-corrispondente.
Si attiva quando un utente smette di interagire tramite un Dispositivodell'interfaccia uomo-corrispettore.
Si attiva ogni volta che il client chiede il Saltadel loro personaggio.
Si attiva quando il cliente ha cambiato il suo Enum.UserInputType .
- PointerAction(wheel : number,pan : Vector2,pinch : number,gameProcessedEvent : bool):RBXScriptSignal
Si attiva quando l'utente esegue un'azione specifica del puntatore (ruota, panchina, Spostare).
Si attiva quando il client perde il focus su un TextBox .
Si è eseguito quando il client si è concentrato su un TextBox .
Si attiva quando un utente rilascia il dito dalla schermata su un dispositivo TouchEnabled - come la schermata di un Dispositivomobile.
- TouchLongPress(touchPositions : Array,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal
Si attiva quando un utente tiene almeno un dito per un breve periodo di tempo nella stessa posizione sullo schermo su un dispositivo TouchEnabled - come la schermata di un Dispositivomobile.
Si attiva quando un utente muove il dito su un dispositivo abilitato al tocco - come lo schermo di un Apple iPad o iPhone o un telefono Android Google.
- TouchPan(touchPositions : Array,totalTranslation : Vector2,velocity : Vector2,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal
Fired when a user drags at least one finger on a TouchEnabled device - such as the screen of a mobile Dispositivo.
- TouchPinch(touchPositions : Array,scale : number,velocity : number,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal
Fired when a user pinches their fingers on a TouchEnabled device - such as the screen of a mobile Dispositivo.
- TouchRotate(touchPositions : Array,rotation : number,velocity : number,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal
Si attiva quando un utente ruota due dita su un TouchEnabled dispositivo - come la schermata di un Dispositivomobile.
Si attiva quando un utente mette il dito su un dispositivo abilitato al tocco - come lo schermo di un Apple iPad o iPhone o un telefono Android Google.
- TouchSwipe(swipeDirection : Enum.SwipeDirection,numberOfTouches : number,gameProcessedEvent : bool):RBXScriptSignal
Fired when a user swipes their fingers on a TouchEnabled device - such as the screen of a mobile Dispositivo.
Fired when a user taps their finger on a TouchEnabled device - such as the screen of a mobile Dispositivo.
Si attiva quando un utente tocca il mondo di gioco su un TouchEnabled dispositivo - come lo schermo di un Dispositivomobile.
Si attiva quando la finestra del client Roblox perde il focus sullo schermo dell'utente.
Si attiva quando la finestra del client Roblox ottiene focus sullo schermo dell'utente.
Proprietà
AccelerometerEnabled
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.AccelerometerEnabledif accelerometerEnabled thenprint("Accelerometer enabled!")elseprint("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
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
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
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
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
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.GyroscopeEnabledif gyroIsEnabled thenprint("Gyroscope is enabled!")elseprint("Gyroscope is not enabled!")end
Poiché UserInputService è solo lato client, questa proprietà può essere utilizzata solo in un LocalScript .
Campioni di codice
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
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
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
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:
- Predefinito : Il mouse si muove liberamente intorno allo schermo dell'utente.
- LockCenter : Il mouse è bloccato e non può essere spostato dal centro dello schermo dell'utente.
- 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
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
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
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
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
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 thenprint("The user's device has an available mouse!")elseprint("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
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
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
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
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
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
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
local UserInputService = game:GetService("UserInputService")
print(UserInputService.OnScreenKeyboardPosition)
OnScreenKeyboardSize
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
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
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 thenprint("The user's device has a touchscreen!")elseprint("The user's device does not have a touchscreen!")end
Vedi anche:
Campioni di codice
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
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.VREnabledif isUsingVR thenprint("User is using a VR headset!")elseprint("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
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
Il Enum.UserInputType del gamepad.
Il Enum.KeyCode del pulsante in questione.
Restituzioni
Se il gamepad specificato supporta un pulsante corrispondente con il Enum.KeyCode specificato.
Campioni di codice
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
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
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
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à:
- La proprietà delta descrive la quantità di rotazione che è stata l'ultima
- Il CFrame è la rotazione attuale del Dispositivorispetto alla sua cornice di riferimento predefinita.
Campioni di codice
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
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
Il Enum.UserInputType della gamepad in questione.
Restituzioni
Se un gamepad associato a Enum.UserInputType è connesso.
Campioni di codice
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
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
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
Il Enum.KeyCode per il quale ottenere l'immagine associata.
Restituzioni
L'ID dell'immagine restituita.
Campioni di codice
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
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
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>
Nome | Descrizione |
---|
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
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
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)
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
Campioni di codice
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:
- UserInputService:SetNavigationGamepad() , per abilitare o disabilitare un gamepad per la navigazione GUI
- UserInputService:IsNavigationGamepad() , per verificare se un gamepad è abilitato per la navigazione GUI
- UserInputService:GetConnectedGamepads() , per restituire tutti i gamepad connessi indipendentemente dal controllo di navigazione GUI
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.Parentlocal mapKey = Enum.KeyCode.MtextLabel.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 chiave | Restituisci 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 chiave | Restituisci 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.Parentlocal key = Enum.KeyCode.ButtonAlocal mappings = {ButtonA = "rbxasset://BUTTON_A_ASSET", -- Replace with the desired ButtonA assetButtonCross = "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 chiave | PlayStation Valore di ritorno | Valore 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 chiave | Immagine | ID risorsa |
---|
Parametri
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
Il Enum.UserInputType del gamepad.
Restituzioni
Campioni di codice
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.ButtonAlocal gamepad = Enum.UserInputType.Gamepad1local isButtonHeld = UserInputService:IsGamepadButtonDown(gamepad, button)
Poiché UserInputService è solo lato client, questa funzione può essere utilizzata solo in un LocalScript .
Vedi anche:
- UserInputService:IsKeyDown() - Un metodo simile con un uso diverso: Per controllare se un dato key su un keyboard è stato premuto.
Parametri
Il Enum.UserInputType del gamepad specificato.
Il Enum.KeyCode del pulsante specificato.
Restituzioni
Se viene premuto il pulsante specificato gamepad sul gamepad specificato.
Campioni di codice
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:
- Enum.UserInputType.IsGamepadButtonDown - Un evento simile con un uso diverso: Per controllare se un dato button su un gamepad è stato premuto.
Parametri
Il Enum.KeyCode della chiave.
Restituzioni
Se la chiave specificata viene tenuta premuta.
Campioni di codice
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
Il Enum.UserInputType del pulsante del mouse.
Restituzioni
Se il pulsante del mouse specificato è attualmente premuto.
Campioni di codice
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) thenprint("Gamepad is a navigation gamepad!")elseprint("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
Il Enum.UserInputType del gamepad specificato.
Restituzioni
Se la gamepad specificata è una gamepad di navigazione.
RecenterUserHeadCFrame
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
Campioni di codice
local UserInputService = game:GetService("UserInputService")
UserInputService:RecenterUserHeadCFrame()
SetNavigationGamepad
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
Il Enum.UserInputType del gamepad specificato.
Se la gamepad specificata può muovere il navigatore GUI.
Restituzioni
Campioni di codice
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
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
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
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
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
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
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
Campioni di codice
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
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
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
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.
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
-- 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.
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
-- 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.
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
-- 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
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
Un Enum.UserInputType che indica l'ultimo inserisci / scrividi input.
Campioni di codice
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
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
Campioni di codice
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
Campioni di codice
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.
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
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
Un array di Vector2 oggetti, che indica la posizione dei dita coinvolti nel gesto.
Il Enum.UserInputState della gestione.
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
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.
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
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
Un array di Vector2 oggetti, che indica le posizioni dei pulsanti (ad esempio, dita) coinvolti nel gesto.
La dimensione del paniere dal punto di partenza all'arrivo (in pixel).
La velocità della manovra della pan (in pixel) per secondo.
Il Enum.UserInputState della gestione.
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
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
Un array di Vector2s , che indica la posizione dello schermo, in pixel, dei datori di punta coinvolti nel gesto di punta.
La magnitudine del pizzolino dal punto di partenza alla fine (in pixel) divisa dalle posizioni di partenza dei pizzolini.
La velocità del gesto di punta (in pixel) per secondo.
Il Enum.UserInputState della gestione.
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
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
Il numero di gradi che il gesto ha rotolato dall'inizio del gesto.
Il cambiamento di rotazione (in gradi) diviso dalla durata del cambiamento (in secondi).
Il Enum.UserInputState della gestione.
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
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.
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
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
Un Enum.SwipeDirection , che indica la direzione in cui l'utente ha scorso.
Numero di tocchi (ad esempio, dita) coinvolti nel gesto.
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
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
Un array di Vector2 oggetti, che indica la posizione dei dita coinvolti nel gesto di tocco.
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
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
Indipendentemente dal fatto che l'utente abbia toccato un elemento GUI.
Campioni di codice
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
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)
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
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)
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)