Tutorial · Scripting foundations

How to make a game in Roblox Studio, step by step

You can make a Roblox game with nothing but Roblox Studio, which is free, and a Roblox account. This guide builds a short coin course from the Baseplate template: platforms to jump, lava that resets you, coins on the player list and a finish pad that gives a Win, run by two server scripts. Then it publishes the game and releases it to players, following Roblox's current rules for who can play it.

Updated 15 October 202619 min readBeginnerLuau

In short

To make a game in Roblox Studio, open Studio, pick the Baseplate template, build your level from Parts (tick Anchored so they stay put), and add Scripts in ServerScriptService for the rules, such as a leaderstats folder for coins. Press Play (F5) to test it. Then choose File > Publish to save it to your account. It stays private until you release it (make it public) from the same menu and answer the age-restricted content question.

  • Keep game rules in server Scripts. A change a LocalScript makes is seen by that one player only, and anything on a player's device can be changed by a cheater.
  • Releasing needs an account in good standing that is at least 2 days old, and an age check. If you answer No to the age-restricted content question, Roblox labels the game Content May Vary and releases it to age-checked users 16 and over. Reaching all ages has extra requirements.
  • Studio runs on Windows and Mac. Roblox's setup page lists no phone or tablet version.
On this page
  1. What you build
  2. 1. Install Studio
  3. 2. Build the course
  4. 3. PlayerStats script
  5. 4. CourseService script
  6. Server rules
  7. 5. Playtest
  8. 6. Publish
  9. 7. Make it public
  10. With friends
  11. Next steps
  12. Common errors
  13. With RoCode
  14. Questions
  15. Sources

What you will build

IllustrationThe finished course in a running game: three coins on one run, then the Finish gives a Win and sends the player back to the start.

The game is a short course. Players start at the SpawnLocation, jump between platforms over a lava floor, pick up coins and touch a green Finish pad. The Finish gives a Win only to a player who picked up at least 3 coins since they last spawned or finished, and then sends them back to the start. Coins and Wins show on the player list, and every rule runs on the server.

The pieces of the coin course
PieceWhere it livesWhat it does
SpawnLocationDirectly in Workspace (it comes with the Baseplate template)Where players appear when they join and when they respawn. The Finish sends players back here.
Course FolderWorkspaceHolds the whole level, so the script finds everything in one place.
Lava Folder and its partsInside CourseEvery part in it resets the player who touches it.
Coins Folder and its partsInside CourseEach coin pays 1 Coin to the first player who touches it, hides, and comes back after 10 seconds.
Finish PartInside CourseGives a Win to a player who collected 3 coins on this run, then moves them back to the start.
PlayerStats ScriptServerScriptServiceGives every player a Coins and a Wins stat on the player list.
CourseService ScriptServerScriptServiceRuns the lava, the coins and the Finish. The only place Coins and Wins change.
Explorer when the course is finished. Add as many platforms, lava parts and coins as you like. Only the names Course, Lava, Coins and Finish are fixed.
Workspace
  Baseplate Part
  SpawnLocation SpawnLocation
  Course Folder new
    Platform Part new
    Lava Folder new
      Lava Part new
    Coins Folder new
      Coin Part new
    Finish Part new
ServerScriptService
  PlayerStats Script new
  CourseService Script new

You build everything in Workspace by hand in Step 2. The two scripts go in ServerScriptService. Roblox never sends the scripts in that container to players, so nobody can read or change them from their own device.

Step 1: Install Studio and open a Baseplate

  1. Download Roblox Studio from Roblox's Creator Hub and run the installer (RobloxStudio.exe on Windows, RobloxStudio.dmg on Mac). Studio is a free app for Windows and Mac.
  2. When it opens, sign in with your Roblox account. If you do not have one, create one at roblox.com first.
  3. In the Open a Template section, pick Baseplate. It starts with only two objects: a SpawnLocation, where characters appear and respawn, and the Baseplate, a floor with a 4 by 4 grid texture that lines up with studs, Roblox's unit of length.
  4. Open three windows you will use all the time. Explorer lists every object in your game, and Properties changes the object you select; both open from the Window menu or the Home tab. Output shows errors from your scripts, and opens from the Window menu or the Script tab.

Step 2: Build the course

  1. In the Explorer, hover over Workspace, click the + button (or press Ctrl+I, Cmd+I on a Mac) and insert a Folder. Rename it Course.
  2. Hover over Course, click +, and insert two more Folders inside it. Name them Lava and Coins.
  3. Build the lava floor. Click Part on the Home or Model tab to insert a block, then use the Scale tool to stretch it into one big, flat slab that will lie under the whole course, with plenty of room on every side. In Properties, set its Color to red and its Material to Neon, tick Anchored, and drag it into the Lava folder. Now a player who falls off anywhere lands in lava, not on the Baseplate.
  4. Build the platforms. Insert more parts the same way and use the Move and Scale tools to place them on top of the lava, each one standing a few studs clear of it, with gaps to jump between them. In Properties, make sure Anchored is ticked on each one, and drag them into Course.
  5. Build the coins. Hold the small arrow on the Part button and choose Cylinder. Make it small and yellow, tick Anchored, and untick CanCollide so players walk through it instead of bumping into it. Put it in the Coins folder, then press Ctrl+D (Cmd+D on a Mac) to duplicate it until you have at least 3, and spread them above the platforms along the course.
  6. Build the finish. Insert one more part on top of the lava at the far end, big enough to land on, colour it green, tick Anchored, name it exactly Finish, and drag it directly into Course, not into one of the folders.
  7. Move the SpawnLocation onto the lava at the start of the course, next to your first platform, so it sits on top of the slab. Keep it directly in Workspace, not inside Course: CourseService looks for it there to send players back to the start.

Names matter

CourseService finds the course by name: a folder called Course directly in Workspace, the folders Lava and Coins inside it, and a part called Finish inside it. Spell them exactly, with the same capital letters. The names of the lava parts and the coins do not matter: every part directly inside Lava is lava, and every part directly inside Coins is a coin.

Step 3: Add Coins and Wins to the player list

In the Explorer, hover over ServerScriptService, click +, insert a Script and name it PlayerStats. Replace everything in it with this:

Script in ServerScriptService named PlayerStats
-- Script in ServerScriptService named PlayerStats.
-- Gives every player a Coins and a Wins stat. A folder named leaderstats inside the
-- player makes Roblox show these values in the player list at the top right.

local Players = game:GetService("Players")

local function onPlayerAdded(player: Player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats" -- must be spelled exactly like this

	local coins = Instance.new("IntValue")
	coins.Name = "Coins"
	coins.Value = 0
	coins.Parent = leaderstats

	local wins = Instance.new("IntValue")
	wins.Name = "Wins"
	wins.Value = 0
	wins.Parent = leaderstats

	leaderstats.Parent = player
end

Players.PlayerAdded:Connect(onPlayerAdded)
for _, player in Players:GetPlayers() do -- anyone who joined before this line ran
	onPlayerAdded(player)
end

The folder must be named leaderstats, all lower case. Roblox reads every value inside it and shows it on the player list, with the value's name as the column heading.

Each player gets a Folder named leaderstats with two IntValue objects in it. An IntValue holds a whole number, which is all a coin count needs. The loop at the end sets up any player who joined before the PlayerAdded line ran, so nobody is missed.

The leaderboard guide builds the same folder in more detail, and later adds saving and a global top 10.

Step 4: Make the lava, coins and finish work

Insert a second Script into ServerScriptService, name it CourseService, and paste this in. It is the only place Coins and Wins change. The two settings at the top are the numbers you are meant to change.

Script in ServerScriptService named CourseService
-- Script in ServerScriptService named CourseService.
-- Runs the course on the server, so every player sees the same thing and nobody can
-- give themselves coins: lava parts reset players, coins pay 1 Coin and come back,
-- and the Finish pad gives a Win to players who collected enough coins on this run.

local Players = game:GetService("Players")

local COINS_TO_FINISH = 3 -- coins a player must collect on a run before Finish counts
local COIN_RESPAWN_SECONDS = 10

local course = workspace:WaitForChild("Course")
local lavaFolder = course:WaitForChild("Lava")
local coinFolder = course:WaitForChild("Coins")
local finish = course:WaitForChild("Finish") :: BasePart
local spawnLocation = workspace:FindFirstChildOfClass("SpawnLocation")
if not spawnLocation then
	warn("CourseService: no SpawnLocation directly in Workspace, so the Finish cannot send players back")
end

-- Coins collected on this run: since the player last spawned or reached the Finish
local runCoins: { [Player]: number } = {}

-- Finds the player whose character touched a part, or nil for anything else
local function playerFromHit(otherPart: BasePart): Player?
	local character = otherPart:FindFirstAncestorOfClass("Model")
	return if character then Players:GetPlayerFromCharacter(character) else nil
end

local function addStat(player: Player, statName: string, amount: number)
	local leaderstats = player:FindFirstChild("leaderstats")
	local stat = leaderstats and leaderstats:FindFirstChild(statName)
	if stat and stat:IsA("IntValue") then
		stat.Value += amount
	end
end

-- Lava: any part in the Lava folder resets the player who touches it
for _, lava in lavaFolder:GetChildren() do
	if lava:IsA("BasePart") then
		lava.Touched:Connect(function(otherPart: BasePart)
			local character = otherPart:FindFirstAncestorOfClass("Model")
			local humanoid = character and character:FindFirstChildOfClass("Humanoid")
			if humanoid and humanoid.Health > 0 then
				humanoid.Health = 0
			end
		end)
	end
end

-- Coins: the first player to touch a coin gets it, then it hides until it respawns
for _, coin in coinFolder:GetChildren() do
	if coin:IsA("BasePart") then
		local shownTransparency = coin.Transparency
		local taken = false
		coin.Touched:Connect(function(otherPart: BasePart)
			local player = playerFromHit(otherPart)
			if not player or taken then
				return -- not a player, or this coin was already taken
			end
			taken = true
			coin.Transparency = 1
			addStat(player, "Coins", 1)
			runCoins[player] = (runCoins[player] or 0) + 1
			task.delay(COIN_RESPAWN_SECONDS, function()
				coin.Transparency = shownTransparency
				taken = false
			end)
		end)
	end
end

-- Finish: a Win for players who did the course, then back to the start
finish.Touched:Connect(function(otherPart: BasePart)
	local player = playerFromHit(otherPart)
	if not player or (runCoins[player] or 0) < COINS_TO_FINISH then
		return
	end
	runCoins[player] = 0 -- set first, so touching the pad again does not count twice
	addStat(player, "Wins", 1)
	local character = player.Character
	if character and spawnLocation then
		character:PivotTo(spawnLocation.CFrame + Vector3.new(0, 4, 0))
		player:SetAttribute("MovementCheckSkip", true) -- for a speed check script, if you add one
	end
end)

-- A new character (after a reset or a fall) starts a new run
local function onPlayerAdded(player: Player)
	runCoins[player] = 0
	player.CharacterAdded:Connect(function()
		runCoins[player] = 0
	end)
end

Players.PlayerAdded:Connect(onPlayerAdded)
for _, player in Players:GetPlayers() do -- anyone who joined while this script waited for Course
	onPlayerAdded(player)
end

Players.PlayerRemoving:Connect(function(player: Player)
	runCoins[player] = nil
end)

CourseService looks through the Lava and Coins folders once, when the game starts. Build every lava part and coin in Studio before you press Play: a part that another script adds during play is not wired up.

What each part of CourseService does
Part of the scriptCodeWhat it does
SettingsCOINS_TO_FINISH, COIN_RESPAWN_SECONDSHow many coins a player must collect on one run before the Finish counts (3), and how long a taken coin stays hidden (10 seconds).
Finding the courseWaitForChild, FindFirstChildOfClass("SpawnLocation")Waits for Course, Lava, Coins and Finish by name, and finds the SpawnLocation directly in Workspace that the Finish sends players back to. If there is none, it prints a warning in Output.
Who touched itplayerFromHitThe part that touches can be a foot, a hand or the handle of a hat. FindFirstAncestorOfClass("Model") walks up to the character model, and GetPlayerFromCharacter turns it into a player, or nil for anything that is not a player's character.
Lavahumanoid.Health = 0Resets any character that touches a part in the Lava folder.
Coinstaken, Transparency = 1, task.delayThe first player to touch a coin gets 1 Coin. The coin turns invisible and ignores touches until it comes back after COIN_RESPAWN_SECONDS. Because the server hides it, it disappears for every player.
This runrunCoinsCounts the coins each player collected since they last spawned or reached the Finish. The Coins number on the player list keeps growing; this count starts again at 0 on every respawn and every Win.
FinishrunCoins[player] < COINS_TO_FINISHIgnores a player with fewer than 3 coins on this run. Otherwise it sets their count back to 0 first, so standing on the pad cannot pay twice, adds 1 Win, and moves the character 4 studs above the SpawnLocation.
New runCharacterAdded, GetPlayers()Every new character starts a new run. The loop covers players who joined while the script was still waiting for Course.
Clean-upPlayerRemovingForgets a player who leaves.

The lava sets Health to 0, as Roblox's own lava tutorial does. A new character has a ForceField for 10 seconds after spawning at a SpawnLocation, by default, and Humanoid:TakeDamage does nothing while one protects it. Setting Health directly ignores ForceFields, so the lava works even right after a respawn.

The Finish moves the character with character:PivotTo(...), which Roblox's reference calls the primary way to move a model from a script. Setting the position of the character's root part instead moves that one part away from the rest of the body.

The MovementCheckSkip line does nothing on its own. It is there for the server speed check in the sprint guide: if you add that check later, the Finish teleport is not flagged as speeding.

Why the rules run on the server

Every rule on this course lives in CourseService, a server Script, on purpose. If a LocalScript added the coin, the new Coins value would exist only on that player's device: the server and the other players would never see it. And anything on a player's device can be changed. Roblox's security guide says an exploiter "has complete control over their local state and network traffic", so the server has to make every decision that matters.

What a cheater can try on this course
A cheater tries toResultWhy
Change their Coins or Wins on their own deviceOnly they see itThe real values live on the server, and only CourseService changes them.
Teleport straight onto the FinishNo WinThe Finish needs 3 coins collected on this run. Roblox's defensive design page uses this exact obby case, an exploiter teleporting to the end to claim rewards, and recommends checkpoints that the server checks before it rewards.
Touch coins or the Finish from far awayPossibleRoblox's security guide says exploiters can trigger Touched events at any range or frequency. Each coin still pays once, to whoever touches it first, and then hides for 10 seconds for everyone.
Fly or teleport to each coin, then to the FinishPossibleEach player's device controls its own character, and Roblox lists teleporting and flying among the things a client can do with it.
Ignore the lavaPossibleThe same device decides whether its character's touches fire at all. For a first game, that is acceptable.

So the coin rule stops the simplest cheat, a jump straight to the end, and not much more. That is normal for a first game. The next layers are a server check that a character is actually near a coin or the Finish before it pays, the way Roblox's security guide checks a player's distance from a shop; checkpoints that must be reached in order, as in the obby checkpoints guide; and a movement check like the one in the sprint guide. What replicates and what does not explains the client and server split in more detail.

Step 5: Playtest it

  1. Make sure Test is selected in the test mode dropdown, then press Play (F5). Your name appears on the player list with Coins 0 and Wins 0.
  2. Walk into a coin. Coins goes to 1 and the coin disappears. Wait 10 seconds and it comes back. Walk into it again: Coins goes up to 2.
  3. Touch the lava. Your character is knocked out and appears at the SpawnLocation again after 5 seconds, Roblox's default respawn time. Coins on the player list stays the same, but your count for this run starts again at 0.
  4. Touch the Finish with fewer than 3 coins on this run: nothing happens. Collect 3 coins, then touch it: Wins goes to 1 and you drop back onto the SpawnLocation.
  5. Press Stop (Shift+F5). Choose Server & Clients in the dropdown, set 2 clients and press Play (or F7). Take a coin in one client window and look at the other: the coin is gone there too, because the server hid it for everyone.

Keep the Output window open the whole time. These two scripts print nothing when they work, so any warning or red error from PlayerStats or CourseService is a real problem. See Common errors.

Step 6: Publish your game

  1. Open the File menu and choose Publish. The Game details window opens.
  2. Type a Name, pick a Genre (the Subgenre is optional) and write a short Description of what players do. You can also upload an icon and a thumbnail here.
  3. Click Save. Roblox publishes the game to the cloud and connects it to your account, so you can open it from any computer.
  4. The game is now published but private. Only you, people with Edit access and group members with the right roles can play it.
  5. Want feedback before you release it? Choose File > Invite early testers and pick up to 10 similar-aged friends. If you have not completed an age check yet, Roblox asks you to do one first. Testers see a watermark that tells them the game is a preview.

From now on, saving to Roblox from the File menu keeps a version of your place in the cloud. File > Publish is what changes the version players get. Now and then, play the published copy from Roblox, outside Studio, to check it matches what you tested.

Step 7: Release it (make your game public)

Releasing is how you make your game public, so people other than you and your collaborators can play it. Before you start, check the requirements: your account must be in good standing and at least 2 days old, and you need an age check, done through facial age estimation or a government ID.

  1. Open the File menu and choose Publish again. The Publish window opens.
  2. Click Continue. (The Invite button next to it invites early testers instead.)
  3. Answer the first question of Roblox's Maturity & Compliance Questionnaire: does your game contain age-restricted content? Answer for what your game actually contains. If you answer Yes, you complete the whole questionnaire.
  4. Click Publish.
Who can play after release
What you doLabelWho can play
Answer NoContent May VaryAge-checked users 16 and over. You can fill in the whole questionnaire later on Creator Hub to reach a wider audience.
Answer Yes, then complete the questionnaireBased on your answersAge-checked users 16 and over, or age-verified users 18 and over, depending on what the game contains.
Meet the all-ages requirementsMinimal, Mild or Moderate (9+), from the whole questionnaireAll ages. On top of the steps above, you verify your account (facial age estimation if you are under 18, a government ID if you are 18 or over), turn on 2-step verification, either keep a Roblox Plus or Premium subscription for 2 consecutive months or pay a one-time refundable fee, and the game passes Roblox's evaluation for all-ages release.

To let only your friends in, open the Creator Dashboard, select the game, go to Publish settings > Manage Audience, click Manage access, turn on Friends on the Public tab and click Save Changes. With Friends on, only your friends and the people on the Playtest tab can play.

The same requirements apply to every release action: the first release, releasing a new version of a game that is already out, releasing to another game with Publish As, and changing who can play.

Make it with friends

Studio's collaboration tools let you and a friend edit the same place at the same time. For a game you own:

  1. With the game open in Studio, click Collaborate on the right side of the mezzanine, the bar whose left side holds the Play button.
  2. Search for your friend, select them, choose Edit in the permissions dropdown and click Save. For a game you own, only Roblox friends can get Edit access.
  3. Your friend opens the game from the Creator Dashboard, and you both work in the same place at once.

To collaborate with other creators, you first complete an age check, by ID or facial age estimation. After that, by default, Studio lets you collaborate only with creators in compatible age groups. You can use Team Create on your own without an age check. During a collaborative session, Studio saves the place to the cloud every four minutes.

Make it a real game

The course is a complete loop: play, collect, finish, win. Each of these guides adds one system on top of it.

  • New to scripts? How to script in Roblox Studio covers variables, functions, events and loops, the pieces CourseService is made of.
  • Save Coins and Wins between sessions with Step 3 of the leaderboard guide. Its saving script replaces a Coins and Wins script like PlayerStats, so delete PlayerStats when you add it. The DataStore tutorial explains saving in depth.
  • Checkpoints in order, with a Stage stat and respawning at the last checkpoint: the obby checkpoints guide. Its script makes its own leaderstats folder, so copy the Coins and Wins lines from PlayerStats into that folder and delete PlayerStats. Two scripts that each make leaderstats give every player two folders, and Coins and Wins can stop changing.
  • Spend the Coins in a shop GUI. It uses the Coins value in leaderstats, so skip its Leaderstats script: PlayerStats already makes Coins.
  • A title screen with a Play button: the main menu guide.
  • Rounds with an intermission, random maps and a timer: the round system guide, which adds to the same Wins value. Skip its leaderstats script, because PlayerStats already makes Wins.
  • An intro cutscene with camera shots, captions and a Skip button: the cutscene guide.
  • A door to a secret area that opens with E, with an optional key lock: the door guide.
  • Teleporter pads between parts of the map, or a teleport menu: the teleporter guide.
  • A speed check on the server: the sprint guide's movement check, which reads the MovementCheckSkip attribute the Finish sets.

Common errors and fixes

Open the Output window (Window menu or Script tab) before you press Play. Most problems on this course either print a warning or an error there, or come from a name that does not match.

Infinite yield possible on 'Workspace:WaitForChild("Course")'

CourseService has waited 5 seconds for a folder named Course directly in Workspace and has not found it. Check the spelling and the capital C. The same warning naming Lava, Coins or Finish means that object is missing from Course or is named differently. Until it appears, nothing after that line runs, so the lava, the coins and the Finish all do nothing.

Coins and Wins do not appear on the player list

Check that the folder name in PlayerStats is leaderstats, all lower case, and that PlayerStats is a Script, not a LocalScript, directly inside ServerScriptService. If both are right, look for a red error from PlayerStats in Output.

A red error from CourseService as soon as I press Play

Check CanTouch in Properties on every lava part, every coin and the Finish. If it is off on any of them when you press Play, Roblox throws an error when CourseService connects Touched to that part, and the script stops there: nothing after that point works, so later coins, the Finish or the run resets may never be wired up. Tick CanTouch on all of them and press Play again.

Touching a coin does nothing

The coin must be a part directly inside the Coins folder, not inside another folder or a model there, because CourseService only looks at the folder's direct children. It must also be there before you press Play, with CanTouch ticked (see the item above).

I touch the Finish and nothing happens

You need 3 coins collected on this run, since you last spawned or reached the Finish. Touching lava resets that count, and so does a Win, even though the Coins number on the player list stays. Also check that the part is named exactly Finish and sits directly inside Course.

The Finish gives a Win but does not move me back

CourseService looks for the SpawnLocation directly in Workspace, and prints a warning in Output when it finds none there. If you dragged the SpawnLocation into Course or one of its folders, drag it back onto Workspace in the Explorer and press Play again.

The lava does not reset me

The lava part must be directly inside the Lava folder before you press Play, with CanTouch ticked. A lava part you put somewhere else in Course is just a red platform.

My platforms or coins fall when I press Play

They are not anchored. Select them, tick Anchored in Properties, and press Play again.

Build it with RoCode

If you would rather describe the game than build every piece by hand, RoCode can build it in the place you have open. RoCode is an independent AI agent for Roblox Studio, not made by Roblox: you describe the feature in its web chat, and its Studio plugin creates the parts and the scripts in your Explorer, so you are not copying code out of a chat window.

You type

Make a coin course: a Course folder with Lava and Coins folders and a Finish part, a Coins and Wins leaderstat, lava that resets players, coins worth 1 that come back after 10 seconds, and a finish that gives a Win only after 3 coins on this run.

RoCode does
  • Can search your place for existing leaderstats or DataStore code first, so it can extend what you have rather than add a second leaderboard
  • Creates the folder and parts in Workspace and the Scripts in ServerScriptService
  • Compile-checks each script it wrote inside Studio with Check Script. That is a compile check, not a type check or a playtest
  • Sets an undo point before and after each batch of changes, so Ctrl+Z steps back one batch at a time

With plugin 3.9 or newer RoCode can run a short playtest and read the errors, but it does not move a character through the course, so you play it yourself. Building a whole game with RoCode works one system per prompt like this. How RoCode connects to Studio.

Questions

Can I make a Roblox game for free?

Yes. Studio is free, and building and publishing need only a Roblox account. Releasing to players also needs an account in good standing that is at least 2 days old, and an age check. Some extras cost Robux, such as the refundable fee that is one of the ways to reach all ages.

Can I make a Roblox game on a phone, iPad or Chromebook?

Roblox's setup page lists Studio for Windows and Mac only, so you need one of those computers to build a game.

How do I make my Roblox game public?

Release it. In Studio choose File > Publish, click Continue, answer the age-restricted content question, then click Publish. You need an account in good standing that is at least 2 days old, and an age check. If you answer No, Roblox releases the game to age-checked users 16 and over. Reaching all ages has extra requirements, listed in Step 7.

Why can't my friends play my game?

New games are private: only you, people with Edit access and group members with the right roles can join. Release it with File > Publish, which needs an age check and the age-restricted content question, or invite up to 10 similar-aged friends as early testers with File > Invite early testers.

Why does it say my game is only for 16+?

Usually because you answered No to the age-restricted content question when you released it. Roblox then gives the game a Content May Vary label and releases it to age-checked users 16 and over. A Yes answer with the whole questionnaire also gives 16+, or 18+, depending on what the game contains. Reaching all ages needs account verification, 2-step verification, a Roblox Plus or Premium subscription for 2 consecutive months or a one-time refundable fee, an evaluation of the game and the whole questionnaire.

How do I make a game with friends?

Click Collaborate in Studio and give a friend Edit access. To collaborate with other creators you first complete an age check, and after it Studio lets you collaborate only with creators in compatible age groups by default. Then you can both work in the same place at the same time.

Do I need to know how to script?

Not for this guide: you paste two scripts, and the tables explain what each part does. To change them with confidence, start with scripting for beginners.

Sources and further reading

How the code was checked: every script on this page passes Luau's strict type checker against Roblox's API definitions (luau-lsp, 15 October 2026). A type check catches misspelt APIs and wrong types, not game logic, so playtest in Studio before you publish.

Try RoCode on your own place.

Free every day, no card required. Install the plugin, describe the feature, and review what lands in Studio.