Class
ContextActionService
NotCreatableService
A service used to bind user input to contextual actions.
Allows an experience to bind user input to contextual actions, or actions that
are only enabled under some condition or period of time. For example, allowing
a player to open a door only while close by. In code, an action is simply a
string (the name of the action) used by the service to differentiate between
unique actions. The action string is provided to
BindAction and
UnbindAction, among other member
functions. If two actions are bound to the same input, the most recently bound
will take priority. When the most recent action is unbound, the one bound
before that takes control again. Since this service deals with user input, you
can only use it in client-side LocalScripts.
Context and Action#
A context is simply a condition during which a player may perform some
action. Some examples include holding a Tool, being
seated in a car or standing near a door. Whatever the case may
be, it is up to your LocalScripts to call
BindAction when the context is
entered and UnbindAction when the
context is left.
An action is simply some input that can be performed by the player while
in that context. Such an action could open/close some menu, trigger a
secondary tool action or send a request to the server using
RemoteFunction:InvokeServer(). An action is identified by a unique
string as the first parameter of both
BindAction and
UnbindAction. The string can be
anything, but it should reflect the action being performed, not the input
being used. For example, don't use "KeyH" as an action name - use "CarHorn"
instead. It is best to define your actions as a constant at the top of your
script since you will use it in at least three different places in your code.
Binding Actions Contextually#
It's better to use ContextActionService's
BindAction than
UserInputService.InputBegan for most cases. For
UserInputService.InputBegan, your connected function would have to
check if the player is in the context of the action being performed. In most
cases, this is harder than just calling a function when a context is entered/
left. For example, if you want to have the H key trigger a car horn sound
while the player is sitting in it, the player might type "hello" in chat or
otherwise use the H key for something else. It is harder to determine if
something else is using the H key (like chat) - the car might honk when the
player didn't mean to. If you instead use
BindAction and
UnbindAction when the player
enters/leaves the car, ContextActionService will make sure that H
key presses trigger the honk action only when it is the most recently bound
action. If something else (like chat) takes control, you won't have to worry
about checking that.
Inspecting Bound Actions#
To see a list of actions and their bound inputs, you can inspect the "Action Bindings" tab in the Developer Console (F9 while in game). This shows all bindings, including those bound by Roblox core scripts and default camera/control scripts too. This is useful for debugging if your actions are being bound/unbound at the correct times, or if some other action is stealing input from your actions. For example, if you are attempting to bind WASD, it may be the case that default character movement scripts are binding over those same keys. Similarly, the camera control script can steal right-click input if the script runs after yours.
Keyboardless Input#
This service is especially useful for supporting gamepad and touch input. For
gamepad input, you might choose to bind the B button to an action that returns
the user to the previous menu when they enter another menu. For touch,
on-screen touch buttons can be used in place of key presses: these buttons
display only while the action is bound, and the position, text and/or images
of these buttons can be configured through this service. They're somewhat
limited in the amount of customization provided by this service; it's usually
a better idea to make your own on-screen buttons using ImageButton or
TextButton.
Methods 15#
| BindAction | Bind user input to an action given an action handling function. |
| BindActionAtPriority | Behaves like BindAction but also
allows a priority to be assigned to the bound action for overlapping input
types (higher before lower). |
| BindActionToInputTypes | Binds functionToBind to input events such as key presses, mouse movement, or controller input.Deprecated |
| BindActivate | Bind a KeyCode with a specific UserInputType to trigger
Tool.Activation and ClickDetector events. |
| GetAllBoundActionInfo | Get a table of information about all bound actions (key is the name passed
to BindAction, value is a table
from GetBoundActionInfo
when called with the key). |
| GetBoundActionInfo | Get a table of information about a bound action given its name originally
passed to BindAction. |
| GetButton | Retrieves a ImageButton of a
bound action that had a touch
input button created.Yields |
| GetCurrentLocalToolIcon | Return the BackpackItem.TextureId of a Tool currently
equipped by the Player. |
| SetDescription | Given the name of a bound action with a touch button, sets the description of the action. |
| SetImage | If actionName key contains a bound action, then image is set as the
image of the touch button. |
| SetPosition | Given the name of a bound action with a touch button, sets the position of the button within the ContextButtonFrame. |
| SetTitle | Given the name of a bound action with a touch button, sets the text shown on the button. |
| UnbindAction | Unbind an action from input given its name. |
| UnbindActivate | Unbind a KeyCode with a specific UserInputType from
triggering Tool.Activation when bound with
ContextActionService:BindActivate(). |
| UnbindAllActions | Removes all functions bound. No actionNames will remain. All touch buttons will be removed. |
BindAction(actionName: string, functionToBind: Function, createTouchButton: boolean, inputTypes: Tuple): ()#
Bind an action to user input given an action handling function. Upon a
matching input being performed, the action handler function will be called
with the arguments listed below. Valid input enum items include those
within the following: KeyCode, UserInputType or
PlayerActions . Call this function when a player enters the
context in which an action can be performed. When the player leaves the
context, call UnbindAction()
with the same actionName.
The code sample below shows how a Sound can be
played while a key (H), game pad button,
or touch screen button is pressed.
local ContextActionService = game:GetService("ContextActionService")
-- A car horn sound
local honkSound = Instance.new("Sound", workspace)
honkSound.Looped = true
honkSound.SoundId = "rbxassetid://9120386436"
local function handleAction(actionName, inputState, inputObject)
if actionName == "HonkHorn" then
if inputState == Enum.UserInputState.Begin then
honkSound:Play()
else
honkSound:Pause()
end
end
end
-- When the player sits in the vehicle:
ContextActionService:BindAction("HonkHorn", handleAction, true, Enum.KeyCode.H, Enum.KeyCode.ButtonY)
-- When the player gets out:
ContextActionService:UnbindAction("HonkHorn")Action Handler Parameters#
The action handler functions are called with the following parameters:
| # | Type | Description |
|---|---|---|
| 1 | string |
The same string that was originally passed to Class.ContextActionService:BindAction()|BindAction().
This allows one function to handle multiple actions at once, if necessary. |
| 2 | Enum.UserInputState |
The state of the input. Enum.UserInputState|Cancel is sent
if some input was in progress and another action bound over that in-progress
input, or if the in-progress bound action was unbound through Class.ContextActionService:UnbindAction()|UnbindAction(). |
| 3 | InputObject |
An object that contains information about the input (varies based on
Enum.UserInputType). The Class.InputObject sometimes won't match the inputs the action
was bound to: when the Enum.UserInputState|Cancel state is sent, this object will be
Enum.KeyCode.Unknown and Enum.UserInputType.None. |
Action Bindings Stack#
Action bindings behave like a stack: if two actions are bound to the same
user input, the most recently bound action handler will be used. If an
action handler returns ContextActionResult.Pass, the next most
recently bound action handler will be called, and so on until a handler
sinks the input (by returning nil or ContextActionResult.Sink).
When UnbindAction is called,
the action handler is removed from the stack. This stack behavior can be
overridden using
BindActionAtPriority,
where an additional priority parameter after createTouchButton may
override the order in which actions are bound (higher before lower).
Touch Buttons#
In addition to input types, this function's third parameter controls
whether a button is created for
TouchEnabled devices. Upon the first
touch button's creation, a ScreenGui named "ContextActionGui" is
added to the PlayerGui. Inside the ScreenGui is a Frame
called "ContextButtonFrame" is added. It is in this frame in which
ImageButtons for bound actions are parented; you can
use GetButton() to retrieve such
buttons for customization. A maximum of 7 touch buttons can be created
through BindAction().
| Name | Type | Default | Description |
|---|---|---|---|
actionName | string | A string representing the action being performed (e.g. "HonkHorn" or "OpenDoor"). | |
functionToBind | Function | The action-handling function, called with the following parameters
when the bound inputs are triggered: string (actionName),
UserInputState and an InputObject. | |
createTouchButton | boolean | Whether a GUI button should be created for the action on touch input devices. | |
inputTypes | Tuple | Any number of KeyCode or UserInputType representing the
inputs to bind to the action. |
Returns
()
BindActionAtPriority(actionName: string, functionToBind: Function, createTouchButton: boolean, priorityLevel: int, inputTypes: Tuple): ()#
BindActionAtPriority behaves like
BindAction but also allows a
priority to be assigned to the bound action. If multiple actions are bound
to the same input, the higher priority function is called regardless of
the order in which the actions were bound. In other words, this function
overrides the normal "stack" behavior of BindAction.
| Name | Type | Default | Description |
|---|---|---|---|
actionName | string | A string representing the action being performed (e.g. "HonkHorn" or "OpenDoor"). | |
functionToBind | Function | The action-handling function, called with the following parameters
when the bound inputs are triggered: string (actionName),
UserInputState and an InputObject. | |
createTouchButton | boolean | Whether a GUI button should be created for the action on touch input devices. | |
priorityLevel | int | The priority level at which the action should be bound (higher considered before lower). | |
inputTypes | Tuple | Any number of Enum.KeyCode or Enum.UserInputType representing the inputs to bind to the action. |
Returns
()
BindActionToInputTypes(actionName: string, functionToBind: Function, createTouchButton: boolean, inputTypes: Tuple): ()#
DeprecatedDeprecated
Deprecated. This item has been superseded by ContextActionService:BindAction()
which should be used in all new work.
This function binds functionToBind to input events such as key presses,
mouse movement, or controller input. The specific input types the engine
listens for are listed as parameters of BindAction. Whenever a player uses
any of these input types, the Roblox Engine calls "functionToBind".
BindAction sets the priorityLevel via ContextActionPriority to
Default.Value, which is 2000. Use ContextActionService:GetButton()
to control the priority of bound events.
In addition to input types, BindAction has a createTouchButton parameter.
When this is set to true it creates an ImageButton on any device
with a touchscreen. A ScreenGui is also created to put the context
buttons into named ContextActionGui and is parented to PlayerGui.
The created ImageButton is parented to this ContextActionGui. GetButton
can be used to retrieve the button that was created.
If an input has more than one function bound to it, each function will be
placed on a stack. A stack obeys the principle of last in first out. So
the first object placed on the stack will be on the top. The next object
placed on the stack becomes the top and the previous object moves one
position down (like a stack of books). When the input is triggered, the
function at the top of the stack is called. If the function returns
ContextActionResult.Pass this will continue down the stack. To
remove a function from being called by all input that it was bound by use
ContextActionService:UnbindAction().
BindAction allows control over whether or not a bound action should be
processed by other actions on the stack using ContextActionResult.
If ContextActionResult.Pass is returned in the callback function,
every action below it in the stack (last function called gets executed
first) will get a chance to process it. Anything other than Pass will be
treated as ContextActionResult.Sink, including nil. It will also
sink if the callback is yielded.
| Name | Type | Default | Description |
|---|---|---|---|
actionName | string | ||
functionToBind | Function | ||
createTouchButton | boolean | ||
inputTypes | Tuple |
Returns
()
BindActivate(userInputTypeForActivation: UserInputType, keyCodesForActivation: Tuple): ()#
Bind a KeyCode that can be used with a UserInputType to
activate ClickDetector events, Tools, and
GuiButtons. When the given key/button is pressed, it
fires the Mouse.Button1Down event on the mouse sent to
Tool.Equipped. This in turn fires the Tool.Activated event
if Tool.ManualActivationOnly is not set to true. For gamepad
input, this function is called by the default control scripts in order to
bind the ButtonR2 KeyCode.
Note that the UserInputType specified must be Keyboard or
Gamepad1 through Gamepad8 in order to be valid.
| Name | Type | Default | Description |
|---|---|---|---|
userInputTypeForActivation | UserInputType | Must be Keyboard or Gamepad1 through Gamepad8. | |
keyCodesForActivation | Tuple | Any number of KeyCode values that trigger Tool
activation for the specified UserInputType. |
Returns
()
GetAllBoundActionInfo(): Dictionary#
GetAllBoundActioninfo returns a table which maps all actions' names (those
originally passed to BindAction)
to a table returned by
GetBoundActionInfo when
called with the action name itself. Using this function, you can inspect
all presently bound actions. This is useful when debugging their priority
levels or stack orders.
Returns
Dictionary— A dictionary mapping each bound action name to its info table.
GetBoundActionInfo(actionName: string): Dictionary#
GetBoundActionInfo returns a table with the following keys describing a
bound action given its name. To get the same information for all actions
at once, use
GetAllBoundActionInfo.
| Name | Type | Description |
|---|---|---|
stackOrder |
number | Describes the index of the action on the stack (increasing) |
priorityLevel* |
number | Describes the
|
createTouchButton |
bool | Describes whether a touch button should be created on
|
inputTypes |
table | The input types passed to
|
description† |
string | The description of action set by
|
title† |
string | The title of the action set by
|
image† |
string | The image of the action's touch button set by
|
* Priority level will still be included even if
BindActionAtPriority
wasn't used - by default it will be 2000.
† Indicates that this field will be nil if the associated method was not
called for the given action.
| Name | Type | Default | Description |
|---|---|---|---|
actionName | string | The name of the action originally passed to BindAction. |
Returns
Dictionary— A dictionary with keys describing the bound action, including stackOrder, priorityLevel, createTouchButton, inputTypes, description, title, and image.
GetButton(actionName: string): Instance#
Yields
GetButton returns the ImageButton created by
BindAction if its third
parameter was true and the device is
TouchEnabled. The only parameter to
this function must match exactly the name of the action originally sent to
BindAction.
If no such action was bound or if a button was not created, this function
returns nil.
| Name | Type | Default | Description |
|---|---|---|---|
actionName | string | The name of the action originally passed to BindAction. |
Returns
Instance— An ImageButton created by BindAction.
GetCurrentLocalToolIcon(): string#
GetCurrentLocalToolIcon will return the BackpackItem.TextureId of
a Tool currently equipped by the
Player, or nil if there is no such Tool or if the player lacks a
Character.
Returns
string— A content string from the Tool's TextureId, ornilif one could not be found.
SetDescription(actionName: string, description: string): ()#
SetDescription will set the description of an action bound by
BindAction. In a list of
available actions, this would be text that describes the given action.
Although the name may suggest that this method is related to the family of
functions that customize a touch button for actions that create them
(SetTitle,
SetImage and
SetPosition), this method does
not affect such a button. This method merely sets a text description of an
action, and nothing more.
| Name | Type | Default | Description |
|---|---|---|---|
actionName | string | The name of the action originally passed to BindAction. | |
description | string | A text description of the action, such as "Honk the car's horn" or "Open the inventory". |
Returns
()
SetImage(actionName: string, image: string): ()#
This method sets the image shown on a touch button created by
BindAction(). Specifically, it
sets the ImageLabel.Image property of the ImageLabel
within the ImageButton that would be returned by
GetButton. If no such bound
action exists (e.g. nothing is returned by GetButton), this function does
nothing and throws no error.
This function is part of a family of methods that customize the touch
button of an action. Others in this family include
SetPosition and
SetTitle.
| Name | Type | Default | Description |
|---|---|---|---|
actionName | string | The name of the action originally passed to BindAction. | |
image | string | The value to which the Image property should be set. |
Returns
()
SetPosition(actionName: string, position: UDim2): ()#
This method sets the position of a touch button created by
BindAction(). Specifically, it
sets the GuiObject.Position property of the ImageButton
that would be returned by
GetButton. If no such bound
action exists (e.g. nothing is returned by GetButton), this function does
nothing and throws no error.
This function is part of a family of methods that customize the touch
button of an action. Others in this family include
SetImage and
SetTitle.
| Name | Type | Default | Description |
|---|---|---|---|
actionName | string | The name of the action originally passed to BindAction. | |
position | UDim2 | The position within the ContextButtonFrame. |
Returns
()
SetTitle(actionName: string, title: string): ()#
SetTitle will set the text shown on a touch button created by
BindAction. Specifically, this
sets the TextLabel.Text property of a TextLabel within the
ImageButton that would be returned by
GetButton. If no such bound
action exists (e.g. nothing is returned by GetButton), this function does
nothing and throws no error.
This function is part of a family of methods that customize the touch
button of an action. Others in this family include
SetImage and
SetPosition.
| Name | Type | Default | Description |
|---|---|---|---|
actionName | string | The name of the action originally passed to BindAction. | |
title | string | The text to display on the button. |
Returns
()
UnbindAction(actionName: string): ()#
UnbindAction will unbind an action by name from user inputs so that the
action handler function will no longer be called. Call this function when
the context for some action is no longer applicable, such as closing a
user interface, exiting a car or unequipping a
Tool. See BindAction for
more information on how bound actions operate.
This function will not throw an error if there is no such action bound
with the given string. Using
GetAllBoundActionInfo
or the Developer Console's "Action Bindings" tab, you can find out what
actions are presently bound.
| Name | Type | Default | Description |
|---|---|---|---|
actionName | string | The name of the action to unbind, as originally passed to BindAction. |
Returns
()
UnbindActivate(userInputTypeForActivation: UserInputType, keyCodeForActivation: KeyCode = None): ()#
UnbindActivate unbinds an KeyCode used with an UserInputType
for activating a Tool (or a HopperBin) using
BindActivate. This function
essentially undoes the action performed by that function.
| Name | Type | Default | Description |
|---|---|---|---|
userInputTypeForActivation | UserInputType | The same UserInputType originally sent to BindActivate. | |
keyCodeForActivation | KeyCode | None | The same KeyCode originally sent to BindActivate. |
Returns
()
UnbindAllActions(): ()#
Removes all functions bound. No actionNames will remain. All touch buttons will be removed. If a button was manipulated manually there is no guarantee it will be cleaned up.
Returns
()
Events 2#
| LocalToolEquipped | Fires when the current player equips a Tool. |
| LocalToolUnequipped | Fires when the current player unequips a Tool. |
LocalToolEquipped(toolEquipped: Instance)#
Fires when a Tool is added as a child of the local player's
Character model, which occurs when the player
equips the tool. The toolEquipped parameter is the Tool instance
that was equipped.
This event fires only for Tool children added to the character, so
it does not fire for non-Tool children. The connection is re-established
each time the player's character respawns.
This event is useful for updating contextual action bindings when a tool
is equipped. For example, you can call
BindAction inside a handler
connected to this event to set up tool-specific input, then call
UnbindAction in the
corresponding ContextActionService.LocalToolUnequipped handler.
LocalToolUnequipped(toolUnequipped: Instance)#
Fires when a Tool is removed from the local player's
Character model, which occurs when the player
unequips the tool. The toolUnequipped parameter is the Tool
instance that was unequipped.
This event fires only for Tool children removed from the
character, so it does not fire for non-Tool children. The connection is
re-established each time the player's character respawns.
This event is useful for tearing down contextual action bindings when a
tool is unequipped. For example, you can call
UnbindAction inside a handler
connected to this event to remove tool-specific input that was bound in
the corresponding ContextActionService.LocalToolEquipped handler.
Inherited members#
Inherited from Instance 58
Properties (10)
Archivable, archivable, Capabilities, IsInSandbox, Name, Parent, PredictionMode, RobloxLocked, Sandboxed, UniqueId
Methods (39)
AddTag, children, ClearAllChildren, Clone, clone, Destroy, destroy, FindFirstAncestor, FindFirstAncestorOfClass, FindFirstAncestorWhichIsA, FindFirstChild, findFirstChild, FindFirstChildOfClass, FindFirstChildWhichIsA, FindFirstDescendant, GetActor, GetAttribute, GetAttributeChangedSignal, GetAttributes, GetChildren, getChildren, GetDebugId, GetDescendants, GetFullName, GetStyled, GetStyledPropertyChangedSignal, GetTags, HasTag, IsAncestorOf, IsDescendantOf, isDescendantOf, IsPropertyModified, QueryDescendants, Remove, remove, RemoveTag, ResetPropertyToDefault, SetAttribute, WaitForChild