Roblox Context Action Service Tutorial – Complete Guide

Welcome to this comprehensive tutorial on the Roblox Context Action Service. This underutilized but potent tool can make your Roblox games more engaging and responsive, adding whole new levels of interactivity.

So, What is the Roblox Context Action Service?

In essence, the Context Action Service is a feature provided by the Roblox platform that allows developers to bind actions to various inputs. It can support multiple devices, including mobile touch inputs, computer keyboard inputs, or even gaming console buttons.

What is it used for?

Rather than having static actions limited to keystrokes, this service lets you bind a range of in-game actions to many inputs. From opening a game menu with a swipe to battling enemies using game controller triggers, the possibilities are endless.

Why Should You Learn it?

Learning to work with the Context Action Service will enable your game to provide more seamless, intuitive controls to your players. It allows you to simplify your control mechanics, making your game more appealing to a diverse audience of gamers, irrespective of their experience level or preferred device.

Ready to dive in? Let’s start coding!

CTA Small Image

Basic Implementation of Context Action Service

Let’s start by exploring the basic use case of the Context Action Service. Our aim will be to create a simple action that gets triggered by a button press.

The first step is to bind an action to an input via the BindAction method:

local contextActionService = game:GetService("ContextActionService")

local function ourActionFunction(actionName, inputState, inputObject)
    if inputState == Enum.UserInputState.Begin then
        print("Our Action Started!")

contextActionService:BindAction("OurAction", ourActionFunction, false, Enum.KeyCode.E)

In the above example, we’ve defined an action named “OurAction” that gets executed when the ‘E’ key is pressed. The function ourActionFunction, checks if the button press has started and prints a message when it does.

Handling Multiple Inputs

Another powerful feature of Context Action Service is its ability to handle multiple inputs for a single action. Consider the previous example but this time expanded to cover more devices:

contextActionService:BindAction("OurAction", ourActionFunction, false, Enum.KeyCode.ButtonA, Enum.KeyCode.E, Enum.UserInputType.Touch)

In this case, the action “OurAction” can be triggered by pressing ‘E’ on the keyboard, ‘ButtonA’ on a game controller, or touching the screen on a mobile device.

Unbinding an Action

Sometimes, you might want to unbind an action. This is done by using UnbindAction function. Here is how to do it:


This will unbind the action named “OurAction”, making it no longer respond to any bound inputs.

Understanding Input States

In our function to handle the action, we use different inputState values to determine the state of the input. Let’s unpack that:

local function ourActionFunction(actionName, inputState, inputObject)
    if inputState == Enum.UserInputState.Begin then
        print("Action has Begun")
    elseif inputState == Enum.UserInputState.End then
        print("Action has Ended")

Here, if a button press begins, “Action has Begun” is printed, and when the button press ends, “Action has Ended” is printed. There are different values for inputState you can check, such as Change, Cancel, etc. Try experimenting with these to get a feel for how they work.

Working with Input Objects

In addition to input state, we may also interact with input objects to determine more granular input characteristics. For example, let’s say we want to determine how much a touch has moved:

local function ourActionFunction(actionName, inputState, inputObject)
    if inputState == Enum.UserInputState.Change then
        local delta = inputObject.Delta
        print("Touch moved by", delta)

This modification to our function will print how much a touch input has moved from its original position when the input state changes.

Customizing Action Priorities

There might be times when you would want one action to have priority over another. Context Action Service allows you to do that:

-- Higher priority action
contextActionService:BindAction("HighPriorityAction", ourActionFunction, false, Enum.ContextActionPriority.High.Value, Enum.KeyCode.E)

-- Normal priority action
contextActionService:BindAction("NormalPriorityAction", ourActionFunction, false, Enum.ContextActionPriority.Default.Value, Enum.KeyCode.E)

The input ‘E’ is bound to both actions, but the “HighPriorityAction” will get priority over the “NormalPriorityAction” due to the set priorities.

Removing and Restoring User Controls

While working with the Context Action Service, you might need to disable the default user controls temporarily. Here’s how to achieve this:

contextActionService:BindActionAtPriority("OurAction", ourActionFunction, false,Enum.ContextActionPriority.High.Value, Enum.KeyCode.W)

-- To restore user controls

This code binds the ‘W’ key, which is usually used for forward movement, to “OurAction”. It then uses the StartBoundAction function to begin the action and disable the default action associated with the ‘W’ key. Once we unbind “OurAction” and call the StopBoundAction function, normal controls are restored.

Cleaning Up: Unbinding All Actions

If you want to unbind all actions, you can do so with the following command:


This function can be helpful when resetting a game, switching scenes, or during other game events where you need a clean slate.

As you can see, the Roblox Context Action Service equips you with the tools to create a rich and responsive game environment. By leveraging this service, you can craft an intuitive and engaging player experience that stands out from the crowd. Happy coding!

Using ContextActionService with GUI

Now that we’ve explored the more conventional use-cases, let’s look at how the Context Action Service can be used with the Graphical User Interface(GUI) in Roblox. Here, we’ll create a simple button on the screen and use the Context Action Service to handle the button press:

-- Create a GUI button
local guiButton ="TextButton")
guiButton.Parent = game.Players.LocalPlayer:WaitForChild("PlayerGui").ScreenGui
guiButton.Position =, 50, 0, 50)

-- Define the action to be performed
local function guiButtonAction(actionName, inputState, inputObject)
    if inputState == Enum.UserInputState.Begin then
        print("Button Pressed!")

-- Bind the action to the button
contextActionService:BindAction("ButtonAction", guiButtonAction, true, guiButton)

This code places a button directly on the GUI which, when pressed, will trigger an action and print “Button Pressed!”.

Action Filtering

There’s also the option to ignore or override default actions. Here, the true argument in the BindAction function is set to handle that:

contextActionService:BindAction("OurAction", ourActionFunction, true, Enum.KeyCode.Space)

By passing true as the third argument, the game’s default action for that input (e.g., jumping when the Spacebar is pressed) is overridden. If set to false, the normal action wouldn’t be affected.

Binding Mouse Inputs

Mouse inputs aren’t left out. They can be bound in a similar fashion as Keyboard or Gamepad inputs. Here’s how:

contextActionService:BindAction("MouseAction", ourActionFunction, false, Enum.UserInputType.MouseButton1)

This binds the left mouse button to “MouseAction”. When clicked, it triggers our binded function.

Binding a Combination of Keys

For adding more complexity to your actions and controls, you can bind a combination of keystrokes to execute an action:

contextActionService:BindAction("ComplexAction", ourActionFunction, false, Enum.KeyCode.LeftControl, Enum.KeyCode.E)

In this case, both the Left Control and ‘E’ keys need to be pressed together to execute the action “ComplexAction”.

Working with Proximity Prompts

Lastly, Roblox offers a neat feature called proximity prompts, which are GUI elements that appear when a player is close enough to an in-world object. With Context Action Service, you can bind interactions with these prompts:

local proximityPromptService = game:GetService("ProximityPromptService")

-- Create a Proximity Prompt
local proxPrompt ="ProximityPrompt")
proxPrompt.Parent = game.Workspace.SomeObject  -- Replace "SomeObject" with the object you want the prompt on

-- Function to handle the prompt
local function handleProximityAction(actionName, inputState, inputObject)
    if inputState == Enum.UserInputState.Begin then
        print("Proximity Prompt Activated!")

-- Bind the prompt to a ContextAction
proximityPromptService:BindAction("ProximityAction", handleProximityAction, false, proxPrompt)

In this example, the ‘E’ key is bound to a proximity prompt on “SomeObject”. When the player hits ‘E’ while close to the object, “Proximity Prompt Activated!” gets printed to the console.

As we can see, the Context Action Service brings a wealth of features allowing for boundless creative advancements in your Roblox game. It’s all about harnessing them effectively.

Where to go next?

Now that you’ve understood and played around with the Context Action Service, your adventure into the world of Roblox development is just getting started. But where to go next?

We at Zenva believe in continuous and advanced learning. To further enhance your Roblox development skills, consider checking out our comprehensive Roblox Game Development Mini-Degree. This collection of courses covers a broad range of topics, from the basics of creating games using Roblox Studio and Lua, to crafting detailed game elements like obstacle courses, combat games, and even FPS games. You’ll learn valuable skills such as implementing multiplayer functionality and leaderboards, which are highly sought after in the industry.

For an even broader perspective on what you can create with Roblox, visit our Roblox courses collection. With Zenva, you can journey from beginner to professional in game development, programming, and AI, with over 250 supported courses available at your fingertips. Happy exploring!


By now, you should have a solid understanding of the Roblox Context Action Service and its potential to elevate your game development journey. With innovative controls and multi-platform adaptability, you can craft an immersive gaming experience for all players.

Don’t stop learning; your dream game is just a few lines of code away! Enhance your Roblox game development skills with our Roblox Game Development Mini-Degree. Remember, each new skill takes you one step closer to becoming the developer you aspire to be. Keep coding, keep learning, and most importantly, have fun creating!

Did you come across any errors in this tutorial? Please let us know by completing this form and we’ll look into it!

Python Blog Image

FINAL DAYS: Unlock coding courses in Unity, Godot, Unreal, Python and more.