Verification: Static review complete; Studio/device tests unverifiedLast verified: 2026-10-03Prerequisites: Set up Roblox Studio on Mac

Read the Studio data model

Outcome and prerequisites

Open your saved Baseplate from Mac setup. By the end, you can locate an object in Explorer, explain a property and a parent, and run a server script from the correct container.

A scene is an object tree

Explorer is the hierarchy of instances in your place. An Instance is an engine object with a class, a name, properties and often events or methods. A Part is an instance representing a physical object. A Folder organizes other instances. A Model groups related scene objects, while a Script executes code.

Name is not type. Renaming a Part to SpawnLocation does not turn it into a SpawnLocation. Likewise, a Folder named Coins does not grant it a built-in scoring behavior. Your code decides what those conventions mean.

Treat the tree as both a scene graph and a runtime dependency map. The location of a script affects where it executes. A hidden server object should not be placed in a replicated container simply because it is convenient to reach.

Learn these containers first

  • Workspace: the live 3D world, including parts and characters
  • ServerScriptService: ordinary server scripts for game rules
  • ServerStorage: server-only templates or assets that should not be sent to clients until needed
  • ReplicatedStorage: objects visible to server and clients, useful for remote events and shared definitions, never secrets
  • StarterPlayer/StarterPlayerScripts: templates for per-player client scripts
  • StarterGui: templates for each player's interface
  • Players: runtime Player objects representing connected users

You will see PlayerGui and PlayerScripts while testing. Those runtime containers are not interchangeable with their Starter templates. Edit the templates when you want all future players to receive a change. Client scripts explores this in practice.

Build a small hierarchy

In edit mode:

  1. Use Explorer to insert a Folder under Workspace, named Practice
  2. Insert a Part inside Practice, named Marker
  3. Set Marker.Anchored to true, Size to (6, 1, 6), and Position to (0, 3, -12)
  4. Give it a distinctive Color, then select it in the viewport and locate the same item in Explorer
  5. Move it by changing Position. Resize it using Size. Notice that Position and Size are different vector-valued properties

Anchored prevents physics from moving the part. CanCollide determines whether it blocks physical movement. CanTouch affects touch events. A visible part can be noncolliding, which is useful for collectibles. A transparent part can still collide, which is confusing unless deliberate.

Your first server script

Insert a Script under ServerScriptService. Name it FirstScript. Replace its default contents with the complete example below. Keep its ordinary default server execution configuration; do not change it to a client script.

-- Place: ServerScriptService.FirstScript (Script)
local Players = game:GetService("Players")
local function greet(player: Player)
    print("Server welcomed", player.Name)
end
Players.PlayerAdded:Connect(greet)
for _, player in Players:GetPlayers() do
    greet(player)
end

Download: first-script.luau

Start a Test and look in Output. You should see a server greeting containing the test player's name. This code connects to future arrivals and also handles players already present when the script starts. That is a recurring pattern in engine lifecycle code.

game:GetService("Players") retrieves the service by its engine identity. The colon means the receiver is passed to the method. Dot access in Players.PlayerAdded selects a member. Connect registers a callback; it does not wait for the next player before continuing.

Verify and clean up

Confirm that the greeting originates on the server. Stop. The runtime Player object disappears, but FirstScript remains because you created it in edit mode. Save your place. Remove FirstScript and the Practice folder before beginning the actual obby; they are disposable experiments, not dependencies.

Troubleshooting

No output: use Test rather than only looking at edit mode; check the script type, Enabled property and Output filters. Unknown member: confirm the class of the selected object rather than only its name. A part falls away: check Anchored in edit mode. The script cannot find an object: inspect spelling, capitalization and the full parent path.

Exercise

Create two parts with the same Name in different folders. Explain why an unqualified name is ambiguous. Then choose names and paths that make the intent clear. In the next lesson, you will use those paths explicitly in code.

Sources and navigation

Verified 2026-10-03: Explorer, data model, script types and locations, Players API.

Previous: Mac setup · Next: Luau for coders · Related: Client/server boundary, Glossary

Progress and help notes

Nothing is sent automatically. Copying happens only when you press the button.

Sources