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 charactersServerScriptService: ordinary server scripts for game rulesServerStorage: server-only templates or assets that should not be sent to clients until neededReplicatedStorage: objects visible to server and clients, useful for remote events and shared definitions, never secretsStarterPlayer/StarterPlayerScripts: templates for per-player client scriptsStarterGui: templates for each player's interfacePlayers: 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:
- Use Explorer to insert a Folder under Workspace, named
Practice - Insert a Part inside Practice, named
Marker - Set Marker.Anchored to true, Size to
(6, 1, 6), and Position to(0, 3, -12) - Give it a distinctive Color, then select it in the viewport and locate the same item in Explorer
- 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