In-game Tools are interactive tools that players can equip in sessions, such as weapons, magic wands, flashlights, keys, and more. You can design tools and include them in a player's inventory or place them around the world as pickups.
Create an in-game tool
The Tool object is the basis of any tool in Roblox, so you'll need to create one. It's easier to preview how a tool looks by designing it in the Workspace, and later you can make it an inventory item or an earned/purchased item.
With the new Tool selected, access the Properties window and customize how the tool will appear in the player's inventory:
- TextureId — Specifies the image asset ID for the tool in a player's inventory.
- ToolTip — The on-hover tooltip name for the tool in a player's inventory.

Decide whether the tool will be a physical tool in the 3D environment (most common) or a non‑physical tool that simply occupies a player's inventory and responds to their input.
Physical tool
After creating the Tool instance for a physical tool, you'll need to add parts/meshes to compose its appearance in the 3D world. You'll also need to include a handle which player characters grip.
Add parts/meshes
In-game tools can consist of one or more Parts and/or MeshParts. If you construct the tool of multiple pieces, remember to connect them all together using WeldConstraints or other mechanical constraints so that the tool stays intact as a unit while the player carries it around.

Set the handle
To enable players to carry tools around, one part of the tool needs to be named Handle. This is where the tool will attach to the character model's RightHand part (R15) or Right Arm part (R6).
If the tool is composed of just one MeshPart, simply name that part Handle. Otherwise, you can include a separate part named Handle as a direct child of the parent Tool and then attach it to another part with a WeldConstraint or mechanical constraint.
The following example shows a tool with three instances: the Handle mesh, a RopeConstraint, and a lantern mesh which hangs from the rope.

Adjust the grip position/orientation
The tool's Grip property is a CFrame which specifies how the tool is positioned and oriented relative to the character holding it.

Since the ideal grip position/orientation is different for every tool, you'll need to experiment with the values until your tool's grip looks correct. The following example shows possible incorrect and correct Grip settings for the hanging lantern:


Non-physical tool
A non-physical Tool simply occupies a player's inventory and responds to their input. For example, a roleplaying game might feature a series of magical spells that players can "cast" through their inventory.

Non-physical tools don't require any 3D composition and do not utilize a Handle part, so you should disable the tool's RequiresHandle property:

Add tools to a game
Once you finish creating your in-game tool, you'll need to place it in the correct area of the Explorer hierarchy. Where you place the tool in the hierarchy depends on its intended usage.
Player inventory
If you want all players to start out with a tool in their inventory, put it inside the StarterPack container. When any player spawns, the system copies the tool to their Backpack. From there, the player can equip the tool by clicking its inventory icon or by pressing the associated hotkey such as 1 or 2.

Note that tools are copied to the player's inventory (Backpack) in the order they were added to StarterPack. For a more controlled ordering, you can add a LocalScript to StarterPack which temporarily moves the tools to ReplicatedStorage then re‑parents them to Backpack in the order specified in the order table.
Reorder Inventorylocal ReplicatedStorage = game:GetService("ReplicatedStorage")local order = {"WaterSpell", "FireSpell", "AirSpell", "EarthSpell"}local backpack = script.Parentfor _, item in backpack:GetChildren() doif item:IsA("Tool") thenitem.Parent = ReplicatedStorageendend-- Re-parent tools to backpack in the specified orderfor i = 1, #order dolocal tool = ReplicatedStorage:FindFirstChild(order[i])if tool thentool.Parent = backpackendend
Collectible tool
If you want to allow players to collect physical tools as they explore the 3D world, place the tools in the Workspace just like normal 3D objects. Collected tools will be automatically equipped and added to the player's inventory (you do not need to add extra collision detection for characters to grab the tool).
As noted in the add parts/meshes section, tool parts should not typically be Anchored, since player characters will get stuck in place when they pick up or equip an anchored tool. However, if you want to anchor a collectible tool to a specific place in the 3D world, such as floating slightly above the ground, you can add the following Script to the tool to unanchor its parts upon collection.
Unanchor Tool on Equip/Collect
local tool = script.Parent
tool.Equipped:Connect(function()
for _, part in tool:GetDescendants() do
if part:IsA("BasePart") and part.Anchored then
part.Anchored = false
end
end
end)
Earned/purchased tool
If you want to set tools as awards for when players accomplish tasks, or offer tools for sale in an in‑game store, put those tools inside ReplicatedStorage. From there, you can Clone() a tool to the player's Backpack at the proper time.

Clone Tool to Player's Inventorylocal Players = game:GetService("Players")local ReplicatedStorage = game:GetService("ReplicatedStorage")local player = Players.LocalPlayerlocal backpack = player:WaitForChild("Backpack")-- Create a clone of the toollocal tool = ReplicatedStorage:FindFirstChild("WaterSpell")if tool thenlocal clone = tool:Clone()clone.Parent = backpack -- Adds clone to the player's backpackend
Implement tool effects
After adding tools to your game, you can implement scripts to enable players to use their tools and perform the desired actions. The following tool‑specific events indicate the state of the tool and the player's input with it.
- Equipped() — Fires when the player selects the tool from their backpack.
- Unequipped() — Fires when the player switches tools or drops the tool.
- Activated() — Fires when the player starts activating the tool (clicks, taps, or presses the back‑right trigger on a gamepad).
- Deactivated() — Fires when the player stops the activation input (releases the button or touch).
Tool Events Template
local tool = script.Parent
local function onEquip()
print(tool.Name, "tool equipped")
end
local function onUnequip()
print(tool.Name, "tool unequipped")
end
local function onActivate()
print(tool.Name, "tool activated")
end
local function onDeactivate()
print(tool.Name, "tool deactivated")
end
tool.Equipped:Connect(onEquip)
tool.Unequipped:Connect(onUnequip)
tool.Activated:Connect(onActivate)
tool.Deactivated:Connect(onDeactivate)
Tool events only fire in client‑side LocalScripts because only the player's device knows when input happens. As a result, most tools require both a LocalScript and a server‑side Script where each handles certain aspects of the tool's behavior and a RemoteEvent passes information from the client to the server (see remote events and callbacks for more information).
As follows are example tools and their behaviors managed by either a LocalScript or a Script:
| Tool | LocalScript | Script |
|---|---|---|
| Creator's Wand | Detects where the player activates the tool (Activated()). | Creates a new part at the location within the 3D world where the player touched or clicked. |
| Invisibility Cloak | Detects when the player equips the tool (Equipped()) or unequips the tool (Unequipped()). | Makes the player invisible to all other players while the cloak is equipped and restores the player to full visibility when the cloak is unequipped. |
| Mega‑Bow | Detects how long the player activates the tool (time between Activated() and Deactivated()). | Shoots a magical arrow with greater or lesser power, depending on the detected activation time. |
