---
title: "Gamepad input"
url: /docs/en-us/input/gamepad
last_updated: 2026-06-11T23:11:51Z
description: "Explains how to accept input from USB gamepads, such as Xbox and PlayStation controllers."
---

# Gamepad input

Roblox accepts input from gamepads such as Xbox and PlayStation controllers. To simplify [cross‑platform](/docs/en-us/projects/cross-platform.md) inputs, including gamepads, Roblox provides the [Input Action System](/docs/en-us/input/input-action-system.md) to define **actions** such as "jump," "sprint," or "shoot" and set up **bindings** for multiple hardware inputs to drive those actions.

When binding gamepad inputs, see [common control schemas](#common-control-schemas) to create a consistent gamepad experience for players. After inputs are set, you can enhance the player's experience by including [haptic feedback](#haptic-feedback) on supported controllers.

As you build out support for gamepads, remember to test frequently using a connected gamepad or the [Controller Emulator](#controller-emulation) in Studio.

## Input type detection

In cross‑platform development, it's important that you determine and respond to the `Class.UserInputService.PreferredInput|PreferredInput` type a player is using, normally to ensure that [UI elements](/docs/en-us/ui.md#ui-objects) like on-screen buttons and menus work elegantly and support interaction across devices.

For example, a console assumes that gamepads are the default input, but a player on PC or laptop may also choose to connect a bluetooth gamepad. In this case, mouse/keyboard remains a valid input for that player, but you can assume they want to switch to the connected gamepad as the **primary** input type.

See [input type detection](/docs/en-us/input.md#input-type-detection) for more information.

> **Info:** For alternative gamepad detection methods, see the `Class.UserInputService.GamepadEnabled` property and the `Class.UserInputService.GamepadConnected|GamepadConnected`/`Class.UserInputService.GamepadDisconnected|GamepadDisconnected` events.
## Common control schemas

When considering specific control bindings for the [Input Action System](/docs/en-us/input/input-action-system.md), it's best to establish consistency across different experiences. The following input bindings will help players immediately feel familiar and comfortable with gamepad controls.

| Input | Common use cases |
| --- | --- |
| `Enum.KeyCode\|ButtonA` | Accepts player prompts or GUI selections. Alternatively used for primary actions such as jumping. |
| `Enum.KeyCode\|ButtonB` | Cancels player prompts or GUI selections. Alternatively used for secondary actions such as a dodge, roll, or sprint. |
| `Enum.KeyCode\|Thumbstick1` | Generally associated with character movement. |
| `Enum.KeyCode\|Thumbstick2` | Generally associated with camera movement. |
| `Enum.KeyCode\|ButtonL2`, `Enum.KeyCode\|ButtonR2` | Generally used for primary actions, such as shooting. |
| `Enum.KeyCode\|ButtonL1`, `Enum.KeyCode\|ButtonR1`, `Enum.KeyCode\|ButtonX`, `Enum.KeyCode\|ButtonY` | Secondary actions such as reloading, targeting, or accessing an inventory or minimap. |

#### Xbox

#### PlayStation

## Haptic feedback

Many gamepad controllers have motors built in to provide haptic feedback. Adding rumbles and vibrations can greatly enhance a player's experience and provide subtle feedback beyond visuals or audio.

Roblox supports haptics for PlayStation gamepads, Xbox gamepads, and the Quest Touch controller. Haptic feedback is managed through `Class.HapticEffect` instances which can be set to a specific `Class.HapticEffect.Type|Type` such as `Enum.HapticEffectType|GameplayCollision` or `Enum.HapticEffectType|UIClick`.

Once a `Class.HapticEffect` is in place, you can initiate it through the `Class.HapticEffect:Play()|Play()` method, for instance:

```lua
local Workspace = game:GetService("Workspace")

local effect = Instance.new("HapticEffect")
effect.Type = Enum.HapticEffectType.GameplayExplosion
effect.Parent = Workspace

-- Play the haptic effect
effect:Play()
```

## Controller emulation

The **Controller Emulator**, accessible from Studio's **Test** menu, lets you accurately emulate gamepad input directly in Studio. The default controller is a generic gamepad, but you can select alternatives from the upper‑left picker menu.

![View of the generic controller in the Controller Emulator.](../../assets/studio/general/Controller-Emulator.png)

While playtesting, you can control the experience with the virtual controller using your mouse.

You can also click **Edit mappings** in the upper‑right corner to view and edit key mappings for the virtual controller, for example `E` to `Enum.KeyCode.ButtonL2|ButtonL2` or `9` to `Enum.KeyCode.ButtonA|ButtonA`. These mappings are saved like other Studio settings (per controller, per user, per computer) and are translated to gamepad events in both the emulator window and the 3D viewport.