Skip to content


The Input namespace contains functions and hooks for responding to player input.

Class Functions

Class Function Name Return Type Description Tags
Input.GetActionValue(Player, string actionName) value Returns the current input value associated with the specified action. This will return a Vector2 for direction bindings, a number for basic and axis bindings, or nil for invalid bindings. nil may also be returned when called on the server with a non-networked action name or a networked action which simply hasn't been pressed yet. None
Input.IsActionHeld(Player, string actionName) boolean Returns true if the specified action is currently being held by the player, otherwise returns false. None
Input.GetCurrentInputType() InputType Returns the current active input type. Client-Only
Input.IsYAxisInverted(InputType) boolean Returns true if the player has inverted the Y axis in their settings for the given input type, otherwise returns false. Client-Only
Input.GetActionDescription(string actionName) string Returns the description set in the Bindings Manager for the specified action. Returns nil if given an invalid action name. Client-Only
Input.GetActions() Array<string> Returns a list of the names of each action from currently active binding sets. Actions are included in this list regardless of whether the action is currently held or not. Client-Only


Event Name Return Type Description Tags
Input.actionPressedEvent Event<Player player, string actionName, value value> Fired when a player starts an input action by pressing a key, button, or other input control. The third parameter, value, will be a Vector2 for direction bindings, or a number for axis and basic bindings. None
Input.actionReleasedEvent Event<Player player, string actionName> Fired when a player stops an input action by releasing a key, button, or other input control. None
Input.inputTypeChangedEvent Event<Player player, InputType inputType> Fired when the active input device has changed to a new type of input. None


Hook Name Return Type Description Tags
escapeHook Hook<Player player, table parameters> Hook called when the local player presses the Escape key. The parameters table contains a boolean named "openPauseMenu", which may be set to false to prevent the pause menu from being opened. Players may press Shift-Esc to force the pause menu to open without calling this hook. Client-Only


Example using:


Hotbars in games are a useful way for players to access things such as abilities, weapons, or tools quickly. This example shows how the mouse wheel can be used to scroll through all the slots in a hotbar. It supports wrapping around when scrolling past the start or end of the hotbar.

-- Client script.

-- The container that holds the slots.
local SLOTS_CONTAINER = script:GetCustomProperty("SlotsContainer"):WaitForObject()

-- The color of the slot frame when it is active.
local ACTIVE_COLOR = script:GetCustomProperty("ActiveColor")

-- The color of the slot frame when it is inactive.
local INACTIVE_COLOR = script:GetCustomProperty("InactiveColor")

-- The current active slot index.
local currentSlotIndex = 1

-- All the slots in the container.
local slots = SLOTS_CONTAINER:GetChildren()

-- Total slots, just caching it here for use later.
local totalSlots = #slots

-- Sets a slot to become active based on the index passed in.
local function SetActiveSlot(index)

-- Clears the last active slot based on the index passed in.
local function ClearActiveSlot(index)

-- Listens for when an action is pressed.
Input.actionPressedEvent:Connect(function(player, action, value)
    -- Checks to see if the action is the Zoom action.
    -- This could be a custom action, doesn't need to be named "Zoom".
    if action == "Zoom" then
        -- Need to store the old slot to compare later on.
        local oldSlotIndex = currentSlotIndex

        -- Scroll wheel will either be -1 or 1.
        if value > 0 then
            currentSlotIndex = currentSlotIndex == totalSlots and 1 or (currentSlotIndex + 1)
        elseif value < 0 then
            currentSlotIndex = currentSlotIndex == 1 and totalSlots or (currentSlotIndex - 1)

        -- If the slot has changed, clear the old one and set the new one.
        if oldSlotIndex ~= currentSlotIndex then

-- Set the active slot from the start (1 in this case).

See also: CoreObject.GetCustomProperty | CoreObjectReference.WaitForObject | UIImage.SetColor

Example using:



This client script demonstrates how to listen for all input actions being pressed/released. Results appear in the Event Log.

function OnActionPressed(player, action, value)
    print("Action: " .. action .. ", value: " .. tostring(value))

function OnActionReleased(player, action)
    print("Action: " .. action)


Example using:


Core has a default pause menu that appears when a player presses the ESC key. This client script demonstrates how to prevent Core's default pause from occurring and replace it with a custom menu. As a fallback in case your UI gets stuck, Shift + ESC allows you to access Core's default pause, even with the escape hook in place.

-- "MenuPanel" is a UI Panel assigned as a custom property to the script.
local CUSTOM_MENU = script:GetCustomProperty("MenuPanel"):WaitForObject()
-- "ExitButton" is a UI Button within that panel. Also assigned as a custom property.
local EXIT_BUTTON = script:GetCustomProperty("ExitButton"):WaitForObject()

CUSTOM_MENU.visibility = Visibility.FORCE_OFF
local isShowingMenu = false

function ShowMenu()
    -- Show our custom menu and enable mouse control
    isShowingMenu = true
    CUSTOM_MENU.visibility = Visibility.INHERIT

function HideMenu()
    -- Hide our custom menu and disable mouse control
    isShowingMenu = false
    CUSTOM_MENU.visibility = Visibility.FORCE_OFF

function OnEscape(localPlayer, params)
    -- Prevents Core's default pause from appearing
    params.openPauseMenu = false

    -- Toggle the custom menu on/off
    if isShowingMenu then

-- Intercept the ESC key being pressed

-- Send players to Core World when they press the custom "Exit" button

See also: Player.TransferToGame | UIButton.clickedEvent | UI.SetCanCursorInteractWithUI | Game.GetLocalPlayer

Example using:


In this example, the UI will update to show what input type the player is currently using, and will update the UI when the player changes the input type.

-- Client script.

-- UI image for mouse input.
local MOUSE_IMAGE = script:GetCustomProperty("MouseImage"):WaitForObject()

-- UI image for controller input.
local CONTROLLER_IMAGE = script:GetCustomProperty("ControllerImage"):WaitForObject()

-- Fired when the input has changed.
local function UpdateInputImage(player, changedInputType)
    -- Check the changed input type by comparing with the
    -- InputType enum.
    if changedInputType == InputType.KEYBOARD_AND_MOUSE then
        MOUSE_IMAGE.visibility = Visibility.FORCE_ON
        CONTROLLER_IMAGE.visibility = Visibility.FORCE_OFF
    elseif changedInputType == InputType.CONTROLLER then
        MOUSE_IMAGE.visibility = Visibility.FORCE_OFF
        CONTROLLER_IMAGE.visibility = Visibility.FORCE_ON


-- Update the input type image first time
UpdateInputImage(Game.GetLocalPlayer(), Input.GetCurrentInputType())

See also: CoreObject.GetCustomProperty | Game.GetLocalPlayer | CoreObjectReference.WaitForObject | Input.GetCurrentInputType | KEYBOARD_AND_MOUSE

Last update: January 13, 2022