Input della tastiera

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

Roblox accetta l'input da gamepad USB come Xbox e controller PlayStation.Poiché i gamepad vengono in diverse varietà, devi seguire una configurazione aggiuntiva per verificare che gli input del gamepad di un Giocatoresono utilizzabili nella tua esperienza.

Per configurare gli input del gamepad, puoi usare ContextActionService o UserInputService per rilevare i gamepad connessi per un Dispositivodel Giocatore, verificare gli input supportati che sono compatibili con Roblox, ricevere l'input e altro ancora.

Quando si legano gli input del gamepad, vedi schemi di controllo comuni per creare un'esperienza di gioco coerente per i giocatori.Dopo aver impostato gli input, puoi migliorare l'esperienza del Giocatoreincludendo feedback tattile sui controller supportati.

Rileva le tastiere di gioco

Puoi determinare se il dispositivo di un Giocatoreha attualmente una gamepad attiva utilizzando la ProprietàUserInputService.GamepadEnabled.

Rilezione del gamepad

local UserInputService = game:GetService("UserInputService")
if UserInputService.GamepadEnabled then
print("Player has gamepad enabled...")
end

Puoi controllare i gamepad connessi tramite UserInputService.GamepadConnected e UserInputService.GamepadDisconnected eventi.Questi eventi si attivano quando un dispositivo è connesso o disconnesso rispettivamente, e entrambi gli eventi passano un Enum.UserInputType a una funzione connessa che indica quale gamepad ha causato l'evento.Nella maggior parte dei casi, il gamepad connesso è Gamepad1 .

Controllo della connessione e della disconnessione

local UserInputService = game:GetService("UserInputService")
UserInputService.GamepadConnected:Connect(function(gamepad)
print("User has connected controller: " .. tostring(gamepad))
end)
UserInputService.GamepadDisconnected:Connect(function(gamepad)
print("User has disconnected controller: " .. tostring(gamepad))
end)

Puoi anche interrogare se un particolare controller è connesso utilizzando il metodo UserInputService:GetGamepadConnected().Questo richiede un Enum.UserInputType come argomento e accetta solo i valori di Gamepad1 attraverso Gamepad8 .

Connessione specifica del gamepad alla query

local UserInputService = game:GetService("UserInputService")
if UserInputService:GetGamepadConnected(Enum.UserInputType.Gamepad1) then
print("Gamepad1 is connected")
elseif UserInputService:GetGamepadConnected(Enum.UserInputType.Gamepad2) then
print("Gamepad2 is connected")
end

Verifica gli input supportati

Poiché i gamepad possono avere diversi set di input, dovresti controllare quali input sono supportati con UserInputService:GetSupportedGamepadKeyCodes() .Questo metodo prende un Enum.UserInputType come argomento e restituisce una tabella con un elenco di tutti gli input disponibili per il controller specificato.

Verifica degli input supportati

local UserInputService = game:GetService("UserInputService")
local availableInputs = UserInputService:GetSupportedGamepadKeyCodes(Enum.UserInputType.Gamepad2)
print("This controller supports the following controls:")
for _, control in availableInputs do
print(control)
end

Ricevi input

ContextActionService è utile per legare i controlli a entrambi i gamepad e ad altre fonti di input come mouse e tastiera o tocco mobile su schermi touch, o per legare più funzioni a un singolo input di pulsante su qualsiasi Dispositivo.Ad esempio, il seguente esempio di codice lega un'azione OpenSpellBook a il pulsante del gamepad ButtonR2 e la chiave della tastiera B.

Azione di legame del servizio ContextActionService

local ContextActionService = game:GetService("ContextActionService")
local function openSpellBook(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
-- Apri il libro delle magie
end
end
ContextActionService:BindAction("OpenSpellBook", openSpellBook, false, Enum.KeyCode.ButtonR2, Enum.KeyCode.B)

In alternativa, puoi usare UserInputService per legare i controlli direttamente da un gamepad.Quando si rilevano eventi del gamepad attraverso questo servizio, utilizza l'evento InputBegan per rilevare quando il pulsante è stato inizialmente premuto e InputEnded per rilevare quando il pulsante viene rilasciato.Nella funzione di manipolazione, la proprietà InputObject.UserInputType indica quale gamepad ha lanciato l'evento e InputObject.KeyCode indica il pulsante o lo stick specifico che l'ha lanciato.

Rilevamento della pressione del pulsante di UserInputService

local UserInputService = game:GetService("UserInputService")
UserInputService.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Gamepad1 then
if input.KeyCode == Enum.KeyCode.ButtonA then
print("Button A pressed on Gamepad1")
end
end
end)

Stato del gamepad

Puoi rilevare lo stato attuale di tutti i pulsanti e bastonci su un gamepad con il metodo UserInputService:GetGamepadState().Questo è utile se devi controllare gli input del gamepad attuale quando si verifica un evento distinto nella tua esperienza, come controllare se vengono premuti bot specifici quando un personaggio tocca un oggetto.

Controllo dello stato degli input del gamepad

local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local leftFoot = character:WaitForChild("LeftFoot")
-- Quando il piede sinistro viene a contatto con qualcosa, controlla lo stato dell'input del gamepad
leftFoot.Touched:Connect(function(hit)
local state = UserInputService:GetGamepadState(Enum.UserInputType.Gamepad1)
for _, input in state do
-- Se il ButtonR2 è attualmente tenuto, stampa un Messaggio
if input.KeyCode == Enum.KeyCode.ButtonR2 and input.UserInputState == Enum.UserInputState.Begin then
print("Character's left foot touched something while holding right trigger")
end
end
end)

Attiva la pressione

Puoi rilevare quanta pressione viene applicata ai trigger del gamepad controllando il valore Position.Z dell'input grilletto.

Pressione di attivazione di prova

local UserInputService = game:GetService("UserInputService")
UserInputService.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Gamepad1 then
if input.KeyCode == Enum.KeyCode.ButtonL2 then
print("Pressure on left trigger has changed:", input.Position.Z)
elseif input.KeyCode == Enum.KeyCode.ButtonR2 then
print("Pressure on right trigger has changed:", input.Position.Z)
end
end
end)

Schemi di controllo comuni

Le piattaforme di gioco vengono in una varietà di forme e dimensioni.Come con qualsiasi metodo di input del giocatore, è meglio creare una certa coerenza tra i diversi giochi e le esperienze.

I seguenti sono comuni legami di input che aiuteranno i giocatori a sentirsi immediatamente familiari e a proprio agio con i Controllidel gamepad:

IngressoUse case comuni
ButtonAAccetta prompt del giocatore o selezioni GUI. In alternativa utilizzato per azioni primarie come il salto.
ButtonBAnnulla i prompt del giocatore o le selezioni dell'interfaccia grafica. In alternativa utilizzato per azioni secondarie come una schivata, una rotolata o una corsa.
Thumbstick1Generalmente associato al movimento del personaggio.
Thumbstick2Generalmente associato al movimento della fotocamera.
ButtonL2 , ButtonR2Generalmente utilizzato per azioni primarie, come il tiro.
ButtonL1 , ButtonR1 , ButtonX , ButtonYAzioni secondarie come ricarica, targeting o accesso a un inventario o minimappa.

Feedback Riscontro/Replica

Molti controller di gamepad hanno motori integrati per fornire Riscontro/Replicatattile.L'aggiunta di rumble e vibrazioni può migliorare notevolmente l'esperienza di un Giocatoree fornire feedback sottili oltre le visuali o l'audio/suono.Puoi usare il HapticService per verificare il supporto alle vibrazioni prima di accendere i motori .

Assistenzaalle vibrazioni

Non tutti i controller hanno motori quindi è importante controllare il supporto prima di tentare di utilizzare i motori tattili.Per query se un dato controller ha il Assistenzadelle vibrazioni, chiama HapticService:IsVibrationSupported() .

Controlla il supporto delle vibrazioni

local HapticService = game:GetService("HapticService")
local gamepad = Enum.UserInputType.Gamepad1
local isVibrationSupported = HapticService:IsVibrationSupported(gamepad)

Alcuni controller hanno motori multipli per diverse scale di vibrazione.Una volta controllato se un gamepad supporta la vibrazione, dovresti anche controllare se supporta i motori che intendi utilizzare attraverso HapticService:IsMotorSupported() .

Controlla i motori supportati

local HapticService = game:GetService("HapticService")
local gamepad = Enum.UserInputType.Gamepad1
local isVibrationSupported = HapticService:IsVibrationSupported(gamepad)
if isVibrationSupported then
local largeMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.Large)
local smallMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.Small)
local leftTriggerMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.LeftTrigger)
local rightTriggerMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.RightTrigger)
local leftHandMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.LeftHand)
local rightHandMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.RightHand)
end
Dimensione o posizioneDescrizione
LargeMotore più grande, utile per il rumble generico.
SmallMotore più piccolo, utile per rumble più sottili come scivolamento delle ruote, scossa elettrica, ecc.
LeftTriggerSotto il grillettosinistro.
RightTriggerSotto il grillettodestro.
LeftHandSul lato sinistro del controller.
RightHandSul lato destro del controller.

Attiva i motori

Una volta confermato che il gamepad di un Giocatoresupporta la vibrazione, puoi accendere un motore specifico con HapticService:SetMotor() .Questo metodo prende il gamepad e l'ampiezza della vibrazione come argomenti.L'ampiezza può essere qualsiasi valore tra 0 e 1.

Attivazione del motore

local HapticService = game:GetService("HapticService")
local gamepad = Enum.UserInputType.Gamepad1
local isVibrationSupported = HapticService:IsVibrationSupported(gamepad)
if isVibrationSupported then
local largeMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.Large)
if largeMotor then
HapticService:SetMotor(gamepad, Enum.VibrationMotor.Large, 0.5)
end
end

Emulazione controller

Il Controller Emulator ti consente di emulare con precisione l'input del gamepad direttamente in Studio.Il controller predefinito è un gamepad generico, ma puoi selezionare alternative per PlayStation, Xbox e dispositivi Quest dal menu a discesa in alto a sinistra.

Emulate Device Controllers button indicated in Test tab View of the generic controller in the Controller Emulator.

Durante il playtest, puoi controllare l'esperienza con il controller virtuale utilizzando il Topo, or mouse as computer mouse.

Puoi anche fare clic su Modifica mappe nell'angolo in alto a destra per visualizzare e modificare le mappe delle chiavi per il controller virtuale, ad esempio E a ButtonL2 o 9 a ButtonA .Queste mappe vengono salvate come altre impostazioni di Studio (per controller, per utente, per computer) e tradotte negli eventi del gamepad sia nella finestra dell'emulatore che nella vista 3D.