Kurz gesagt
Um in Roblox Studio zu scripten, fahr im Explorer mit der Maus über ServerScriptService, klick auf + und füge ein Script ein. Studio öffnet es im Script Editor. Tipp Luau, zum Beispiel print("Hello"), drück auf Play (F5) und lies das Ergebnis im Fenster Output (Menü Window oder Tab Script). Ein Script läuft auf dem Server und ändert Dinge für alle; ein LocalScript in StarterPlayerScripts läuft auf dem Gerät eines einzelnen Spielers.
- Lern zuerst vier Ideen: Variablen (
local coins = 3), Funktionen (local function name() ... end), if-Abfragen und Events (part.Touched:Connect(...)). Die vier Skripte in diesem Guide bestehen daraus, plus Schleifen und Tabellen. - Nutze
task.wait(), nichtwait(). Die Referenz von Roblox markiert das globalewait()als veraltet und durchtask.wait()ersetzt. - Schalte in den Anzeigeoptionen des Output-Fensters Show Context ein, damit jede Zeile sagt, ob sie vom Server oder von einem Client kommt.
Auf dieser Seite
Bevor du anfängst: Studio, eine Baseplate und das Output-Fenster
Du brauchst Roblox Studio und ein Roblox-Konto, sonst nichts: keinen Code-Editor und kein Plugin. Jedes Skript in diesem Guide wird im eigenen Script Editor von Studio getippt.
- Installier Roblox Studio, die kostenlose App von Roblox für Windows und Mac, und melde dich mit deinem Roblox-Konto an.
- Öffne Studio. Die Startseite listet Vorlagen: Wähl Baseplate. Du bekommst einen Boden mit einer 4x4-Rastertextur und eine SpawnLocation, die Stelle, an der dein Avatar beim Spielen erscheint.
- Sind die Fenster Explorer und Properties nicht zu sehen, öffne sie über das Menü Window oder den Tab Home. Der Explorer listet jedes Objekt in deinem Spiel; Properties zeigt die Einstellungen dessen, was du auswählst.
- Öffne Output über das Menü Window oder den Tab Script. Hier erscheinen die Nachrichten und Fehler deiner Skripte.
- Schalte in den Anzeigeoptionen des Output-Fensters Show Context ein, das jede Nachricht als Client oder Server kennzeichnet, und Show Source, das Skript und Zeilennummer zeigt, von denen sie kommt.
| Skript | Typ | Wohin es kommt | Was es dir beibringt |
|---|---|---|---|
FirstScript | Script | ServerScriptService | Variablen, eine Funktion, eine if-Abfrage, Schleifen und eine Tabelle |
ColourChanger | Script | In einen Part in Workspace | Eigenschaften ändern, script.Parent und eine Schleife, die wartet |
TouchPad | Script | In einen Part namens Pad | Events, den Spieler finden, der einen Part berührt hat, und ein Debounce |
MyFirstLocalScript | LocalScript | StarterPlayerScripts, in StarterPlayer | Code, der auf dem Gerät eines Spielers läuft, Tastendrücke und was auf diesem Gerät bleibt |
Workspace
Baseplate Part
SpawnLocation SpawnLocation
Part Part new
ColourChanger Script new
Pad Part new
TouchPad Script new
ServerScriptService
FirstScript Script new
StarterPlayer
StarterPlayerScripts
MyFirstLocalScript LocalScript new
Schritt 1: Dein erstes Skript schreiben
- Fahr im Explorer mit der Maus über ServerScriptService, klick auf + und wähl Script (Kurzbefehl Strg+I, auf dem Mac ⌘I). Studio erstellt das Skript und öffnet es im Script Editor.
- Klick mit der rechten Maustaste auf das neue Skript, wähl Rename und nenn es
FirstScript. Der Name ändert nicht, was das Skript macht, aber er sagt dir, welches Skript was ausgegeben hat. - Neue Skripte beginnen mit einer Zeile,
print("Hello world!"). Lösch sie und füge den Code unten ein. - Drück auf Play (F5), mit Test im Dropdown links daneben. Studio startet einen Playtest und setzt deinen Avatar auf die SpawnLocation.
- Lies die Zeilen im Output und drück dann auf Stop (Shift+F5). Stop setzt außerdem jedes Objekt in den Zustand vor dem Drücken auf Play zurück, also geht alles, was du beim Spielen bewegt oder umgefärbt hast, wieder zurück.
-- Script in ServerScriptService namens FirstScript.
-- Dein erstes Luau: Variablen, eine Funktion, eine if-Abfrage, eine Schleife und eine Tabelle.
-- Drück auf Play (F5) und lies die Ergebnisse im Output-Fenster.
-- Eine Variable ist ein Name, der einen Wert hält
local gameName = "Coin Run"
local coinsToWin = 3
-- Eine Funktion ist ein benannter Codeblock, den du so oft ausführen kannst, wie du willst.
-- name und goal sind ihre Parameter; return gibt einen Wert an den Aufrufer zurück.
local function describe(name: string, goal: number): string
return `{name}: collect {goal} coins to win`
end
print(describe(gameName, coinsToWin)) --> Coin Run: collect 3 coins to win
-- Eine if-Abfrage führt Code nur aus, wenn ihre Bedingung wahr ist
if coinsToWin > 5 then
print("That is a long game")
elseif coinsToWin > 1 then
print("That is a short game")
else
print("One coin and you win")
end
-- Eine for-Schleife wiederholt Code eine bestimmte Anzahl von Malen
for count = 1, coinsToWin do
print("Coin number", count)
end
-- Eine Tabelle hält eine Liste von Werten; diese Schleife besucht jeden der Reihe nach
local colours = { "Red", "Green", "Blue" }
for position, colour in colours do
print(position, colour) --> 1 Red, dann 2 Green, dann 3 Blue
end
Alles nach -- in einer Zeile ist ein Kommentar: Luau überspringt es, also kannst du dir Notizen hinterlassen. Die Kommentare mit --> zeigen, was diese Zeile ausgibt.
Der Output sollte diese acht Zeilen zeigen, gemischt mit Nachrichten von Studio selbst. Bekommt print mehr als einen Wert, setzt es ein Leerzeichen dazwischen. Mit Show Context und Show Source ist jede Zeile außerdem mit Server und FirstScript samt Zeilennummer gekennzeichnet.
Coin Run: collect 3 coins to win
That is a short game
Coin number 1
Coin number 2
Coin number 3
1 Red
2 Green
3 Blue
Ordne jede Zeile dem Code zu, der sie ausgegeben hat. Später machst du dasselbe mit Fehlermeldungen, also lohnt sich die Gewohnheit jetzt schon.
FirstScript nutzt nur reines Luau ohne Roblox-Objekte, also läuft es auch im kostenlosen Luau-Playground in deinem Browser. Ändere dort einen Wert und führ es noch einmal aus, um zu sehen, was sich ändert.
| Code | Idee | Was es bedeutet |
|---|---|---|
local gameName = "Coin Run" | Variable | Ein Name, der einen Wert hält. local heißt, nur dieses Skript oder der Block, in dem es steht, kann sie nutzen. Text in Anführungszeichen ist ein String; 3 ist eine Zahl. Namen unterscheiden Groß- und Kleinschreibung, also sind coinsToWin und CoinsToWin zwei verschiedene Variablen. |
local function describe(name: string, goal: number): string | Funktion | Ein benannter Codeblock, den du so oft ausführen kannst, wie du willst. name und goal sind ihre Parameter: Werte, die bei jedem Aufruf übergeben werden. : string und : number sind optionale Typangaben. Luau nutzt sie, um dich im Script Editor vor Fehlern zu warnen; der Code läuft ohne sie genauso. |
return | Rückgabewert | Gibt einen Wert an den Code zurück, der die Funktion aufgerufen hat. print(describe(gameName, coinsToWin)) gibt aus, was describe zurückgibt. |
`{name}: collect {goal} coins to win` | String-Interpolation | Text in Backticks kann Werte enthalten: Luau ersetzt {name} und {goal} durch ihre aktuellen Werte. |
if, elseif, else, end | if-Abfrage | Luau prüft die Bedingungen von oben nach unten und führt nur die erste aus, die wahr ist. coinsToWin ist 3, nicht mehr als 5, aber mehr als 1, also wird nur „That is a short game“ ausgegeben. |
for count = 1, coinsToWin do | Zählschleife | Führt den Code darin einmal für jede Zahl von 1 bis coinsToWin aus, mit count auf 1, dann 2, dann 3. |
{ "Red", "Green", "Blue" } und for position, colour in colours do | Tabelle und Schleife | Eine Tabelle als Liste, die Luau ein Array nennt. Positionen beginnen bei 1, nicht bei 0. Die Schleife besucht jedes Element und gibt dir seine Position und seinen Wert. |
Jeder Block, der mit function, if, for oder while beginnt, endet mit end. Ein einziges fehlendes end verhindert, dass das ganze Skript läuft; Fehler lesen zeigt die Meldung, die du dann bekommst.
Schritt 2: Einen Part per Skript ändern
Skripte werden nützlich, wenn sie Dinge in der Welt ändern. Die Einstellungen, die du im Properties-Fenster siehst, zum Beispiel Color, Transparency oder Anchored eines Parts, sind Eigenschaften, und ein Skript kann sie ebenfalls setzen.
- Klick im Tab Home auf Part. Studio fügt dem Workspace einen Block hinzu. Sein Name ist egal.
- Fahr im Explorer mit der Maus über den neuen Part, klick auf + und füge ein Script ein. Nenn es
ColourChangerund ersetz seinen Inhalt durch den Code unten. - Drück auf Play. Der Part wird rot, dann blau, dann grün, einmal pro Sekunde, und fängt wieder von vorn an.
-- Script in einem Part in Workspace, namens ColourChanger.
-- Skripte ändern dieselben Eigenschaften, die du im Properties-Fenster siehst.
-- Dieses gibt seinem Part jede Sekunde eine neue Farbe, für jeden Spieler.
local part = script.Parent :: BasePart -- der Part, in dem dieses Skript steckt
local colours = {
Color3.fromRGB(255, 85, 85), -- rot
Color3.fromRGB(85, 170, 255), -- blau
Color3.fromRGB(85, 255, 127), -- grün
}
part.Anchored = true -- ein verankerter Part bleibt, wo du ihn hingestellt hast
local index = 1
while true do
part.Color = colours[index]
index = index % #colours + 1 -- 1, 2, 3, dann zurück zu 1
task.wait(1) -- eine Sekunde Pause (das alte wait() ist veraltet)
end
script.Parentist das Objekt, in dem das Skript steckt, hier der Part. Zieh das Skript in einen anderen Part, und es ändert stattdessen diesen.:: BasePartist ein Type Cast. Er sagt dem Script Editor, dass der Parent ein Part ist, damit er die Eigenschaften prüfen kann, die du daran nutzt. Luau nutzt Typen nur für Warnungen und Vorschläge, also ändert der Cast nicht, was die Zeile macht.part.Colorundpart.Anchoredsind dieselben Eigenschaften, die du im Properties-Fenster siehst, mit denselben Namen. Roblox nutzt amerikanische Schreibweise, also heißt die EigenschaftColor, obwohl dieses Skript ColourChanger heißt.Anchored = truehält den Part still: Laut der Referenz von Roblox bewegt sich ein verankerter Part nie durch Schwerkraft, Kollisionen oder andere Physik.colours[index]liest ein Element aus der Liste.#coloursist die Länge der Liste, 3, und%gibt den Rest nach dem Teilen, also zähltindex % #colours + 11, 2, 3, 1, 2, 3.while true dowiederholt für immer, deshalb ist dastask.wait(1)darin wichtig. Laut der Dokumentation von Roblox gehört in eine Endlosschleife immer eine Verzögerung wietask.wait(): Ohne sie friert das Spiel ein und Studio stürzt ab.
ColourChanger ist ein Script, also läuft es auf dem Server, und jeder Spieler im Spiel sieht dieselbe Farbe zur selben Zeit. Schritt 4 zeigt die andere Art von Skript.
Schritt 3: Mit einem Event auf einen Spieler reagieren
Der meiste Spielcode wartet darauf, dass etwas passiert: Ein Spieler tritt bei, ein Part wird berührt, ein Button wird geklickt. Roblox nennt das Events. Um Code auszuführen, wenn eines ausgelöst wird, verbindest du eine Funktion damit.
- Füge einen weiteren Part ein und nenn ihn genau
Pad, mit großem P. Lass ihn direkt im Workspace, nicht in einem Ordner oder Modell, weil das LocalScript in Schritt 4 ihn dort sucht. - Mach eine flache Platte daraus, auf die du laufen kannst, zum Beispiel indem du im Properties-Fenster
Sizeauf6, 1, 6setzt. Schieb sie auf den Boden in die Nähe der SpawnLocation und hak Anchored an, damit sie bleibt, wo sie ist. - Fahr mit der Maus über Pad, klick auf +, füge ein Script ein, nenn es
TouchPadund füge den Code unten ein. - Drück auf Play und lauf auf die Platte. Sie wird für 2 Sekunden gelb, und der Output nennt deinen Namen.
-- Script in einem Part in Workspace namens Pad, Skript namens TouchPad.
-- Events: Wenn ein Spieler auf das Pad tritt, leuchtet es gelb und der Output sagt, wer es war.
-- Ein Debounce verhindert, dass es mehrmals pro Sekunde läuft, während er darauf steht.
local Players = game:GetService("Players")
local pad = script.Parent :: BasePart
local COOLDOWN_SECONDS = 2
local normalColour = pad.Color
local busy = false
local function onTouched(otherPart: BasePart)
if busy then
return -- kühlt noch von der letzten Berührung ab
end
-- Die Figur ist das Model, das den Körperteil (oder Hut) hält, der das Pad berührt hat
local character = otherPart:FindFirstAncestorOfClass("Model")
local player = character and Players:GetPlayerFromCharacter(character)
if not player then
return -- ein loser Part oder ein NPC hat es berührt, kein Spieler
end
busy = true
print(`{player.Name} stepped on the pad`)
pad.Color = Color3.fromRGB(255, 220, 0)
task.wait(COOLDOWN_SECONDS)
pad.Color = normalColour
busy = false
end
pad.Touched:Connect(onTouched)
| Code | Was er macht |
|---|---|
pad.Touched:Connect(onTouched) | Verbindet die Funktion mit dem Event Touched des Pads, sodass Roblox onTouched jedes Mal ausführt, wenn etwas das Pad berührt, und den berührenden Part übergibt. |
otherPart | Der Part, der das Pad berührt hat: ein Fuß, ein Bein, der Griff eines Huts oder ein Tool, das der Spieler hält. Es ist nie der Spieler selbst, also finden die nächsten zwei Zeilen heraus, wem er gehört. |
otherPart:FindFirstAncestorOfClass("Model") | Klettert von diesem Part nach oben zum ersten Vorfahren, dessen Klasse genau Model ist, also zur Figur. Weil der Klassenname genau passen muss, überspringt er einen Hut (Klasse Accessory) und ein gehaltenes Tool (Klasse Tool). |
Players:GetPlayerFromCharacter(character) | Gibt den Player zurück, dessen Figur dieses Model ist, oder nil, wenn es niemandes Figur ist, zum Beispiel ein NPC. Das character and davor überspringt den Aufruf, wenn kein Model gefunden wurde, sodass player nil bleibt. |
if not player then return end | Hört hier bei allem auf, was kein Spieler ist. return verlässt die Funktion vorzeitig. |
Warum das Pad ein Debounce braucht
Die Debounce-Seite von Roblox warnt, dass Touched mehrmals kurz hintereinander feuert, wenn Parts sich berühren, und eine laufende Figur hat mehrere Körperteile. Ohne Prüfung könnte ein einziger Schritt auf das Pad viele Zeilen ausgeben und das gelbe Leuchten immer wieder neu starten.
Die Variable busy ist das Debounce. Die erste Berührung setzt sie auf true, und jede Berührung in den nächsten 2 Sekunden erreicht if busy then return end und hört auf. Nach task.wait(COOLDOWN_SECONDS) wechselt das Pad zurück, und busy wird wieder false. COOLDOWN_SECONDS ist in Großbuchstaben geschrieben, weil es eine Einstellung ist, die sich während des Spiels nicht ändert, die Schreibweise, die Roblox für Konstanten vorschlägt.
Dieses Pad hat ein Debounce für alle, also wird ein zweiter Spieler, der innerhalb dieser 2 Sekunden darauf tritt, ignoriert. Für ein Pad, das leuchtet, ist das in Ordnung. Ein Pad, das Belohnungen gibt, sollte stattdessen einen Cooldown pro Spieler haben, wie das Münz-Pad im Leaderboard-Guide (auf Englisch).
Schritt 4: Dein erstes LocalScript, und warum es anders ist
Ein laufendes Spiel besteht aus einem Server plus einem Client für jeden Spieler. Alles bisher war ein Script, das auf dem Server läuft, also erreichen seine Änderungen jeden Spieler. Ein LocalScript läuft stattdessen auf dem Gerät eines Spielers. Tastendrücke, die Kamera und Menüs auf dem Bildschirm werden dort behandelt, weil nur dieses Gerät davon weiß.
- Klapp im Explorer StarterPlayer auf, fahr mit der Maus über StarterPlayerScripts, klick auf + und füge ein LocalScript ein. Nenn es
MyFirstLocalScriptund füge den Code unten ein. - Drück auf Play. Der Output zeigt
Hello,und deinen Namen, gekennzeichnet mit Client. - Klick in die Spielansicht und drück E. Das Pad wird durchsichtig. Drück noch einmal E, um es zurückzuholen.
- Klick, während der Playtest noch läuft, in den Test-Steuerelementen von Studio auf den Umschalter Client/Server, um zur Kopie des Servers zu wechseln. Dort ist das Pad massiv: Der Server hat von der Änderung nie erfahren.
-- LocalScript in StarterPlayer > StarterPlayerScripts namens MyFirstLocalScript.
-- Ein LocalScript läuft auf dem eigenen Gerät eines Spielers. Drück E: Das Pad wird nur auf deinem
-- Bildschirm durchsichtig, weil eine Änderung an einem Part von hier weder den Server noch sonst jemanden erreicht.
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local player = Players.LocalPlayer
print(`Hello, {player.Name}`) -- erscheint im Output, als Client gekennzeichnet
UserInputService.InputBegan:Connect(function(input: InputObject, gameProcessed: boolean)
if gameProcessed then
return -- die Taste wurde für etwas anderes genutzt, zum Beispiel Tippen im Chat
end
if input.KeyCode == Enum.KeyCode.E then
local pad = workspace:FindFirstChild("Pad")
if pad and pad:IsA("BasePart") then
pad.Transparency = if pad.Transparency == 0 then 0.6 else 0
end
end
end)
Players.LocalPlayerist der Spieler, auf dessen Gerät das Skript läuft. Roblox definiert es nur für LocalScripts und die ModuleScripts, die sie laden, also kann Server-Code es nicht nutzen.UserInputService.InputBeganfeuert, wenn der Spieler einen Tastendruck, einen Klick oder eine Berührung beginnt.gameProcessedisttrue, wenn die Engine diese Eingabe schon genutzt hat, zum Beispiel einen Klick auf einen Button oder eine Taste im Chat, also ignoriert das Skript sie.workspace:FindFirstChild("Pad")gibt das Kind namens Pad zurück odernil, wenn es keins gibt.pad:IsA("BasePart")prüft, ob es wirklich ein Part ist, bevor das Skript seineTransparencyändert.if pad.Transparency == 0 then 0.6 else 0ist ein if-Ausdruck: Er wählt einen von zwei Werten. Eine Transparency von 0 ist voll sichtbar, 1 ist unsichtbar.- Ein Sprint-Skript mit Shift (auf Englisch) ist ein gutes zweites LocalScript: Es hört auf eine Taste und ändert die WalkSpeed deiner Figur.
| Typ | Läuft auf | Seine Änderungen erreichen | Nutze es für | Kommt meist in |
|---|---|---|---|---|
| Script | Dem Server | Jeden Spieler | Spielregeln: Coins, Schaden, Türen, Runden, Speichern | ServerScriptService, oder beim Lernen in einen Part |
| LocalScript | Dem Gerät eines Spielers | Nur dieses Gerät, abgesehen von der Bewegung seiner eigenen Figur | Eingaben, die Kamera, Bildschirmmenüs, Effekte für einen Spieler | StarterPlayerScripts oder StarterGui |
| ModuleScript | Der Seite, die require() darauf aufruft | Dasselbe wie das Skript, das es geladen hat | Code, den mehrere Skripte teilen | ReplicatedStorage für beide Seiten, ServerScriptService nur für den Server |
Was ein Cheater ändern kann
Geh davon aus, dass ein Cheater alles auf seinem eigenen Gerät kontrolliert. Er kann eigene LocalScripts ausführen und deine ändern, also kann er das Pad oder alles andere auf seinem eigenen Bildschirm durchsichtig machen. Hier ist das harmlos: Das Ausblenden ist nur Optik und bleibt auf seinem Gerät. Genau deshalb wird alles, was zählt, von einem Script auf dem Server entschieden.
Auch ein Server-Script ist nicht automatisch sicher. TouchPad läuft auf dem Server, aber das Gerät jedes Spielers steuert die Physik seiner eigenen Figur, und die Sicherheitsdokumentation von Roblox nennt es unter den Dingen, die ein Client mit seinen Parts tun kann, zu manipulieren, wann Touched feuert, oder es ganz zu verhindern. Für ein Pad, das leuchtet, ist das egal. Für ein Pad, das etwas auszahlt, prüf zusätzlich etwas, das der Server selbst verfolgt, wie die Regel im Obby-Guide (auf Englisch), dass Checkpoints nur der Reihe nach zählen.
Schritt 5: Alle vier Skripte zusammen testen
- Leer den Output mit Strg+K (⌘K auf dem Mac) und drück auf Play (F5). Der Output zeigt die acht Zeilen von FirstScript mit Server gekennzeichnet und deine Hello-Zeile mit Client. Der Part ColourChanger wechselt jede Sekunde die Farbe.
- Lauf auf das Pad. Es wird für 2 Sekunden gelb, und der Output zeigt einmal deinen Namen und „stepped on the pad“. Lauf weiter darauf herum: Eine neue Zeile erscheint höchstens alle 2 Sekunden, nicht jedes Mal, wenn Touched feuert.
- Drück E. Das Pad wird auf eine Transparency von 0.6 durchsichtig. Drück noch einmal E, und es ist massiv.
- Drück auf Stop. Wähl im Test-Dropdown Server & Clients, stell 2 Clients ein und drück auf Play (oder F7). Studio öffnet ein Server-Fenster und zwei Client-Fenster. Drück in einem Client E: Das Pad wird dort durchsichtig, während der andere Client und der Server es weiter massiv zeigen. Drück auf End Session, wenn du fertig bist.
- Mach absichtlich etwas kaputt. Benenn Pad in
Pad2um und spiel. Drauflaufen macht es weiterhin gelb, weil TouchPad seinen Part überscript.Parentfindet, nicht über den Namen. E macht jetzt nichts, und es gibt keinen Fehler:FindFirstChild("Pad")hatnilzurückgegeben, und die Prüfungif pad and ...hat den Rest still übersprungen. Füge in der Zeile nachFindFirstChildeinprint(pad)ein, spiel und drück E: Der Output zeigtnil. So ein print ist der schnellste Weg herauszufinden, warum ein Skript nichts tut. Drück auf Stop, lösch die print-Zeile und benenn den Part wieder in Pad um.
Wo Skripte hingehören
Wo ein Skript liegt, entscheidet, ob es überhaupt läuft, und Studio warnt dich nicht, wenn es nie laufen wird. Für die Skripte, die du als Nächstes schreibst:
| Container | Gehört hierher | Warum |
|---|---|---|
| ServerScriptService | Skripte mit den meisten Regeln deines Spiels: Belohnungen, Runden, Speichern | Sie laufen auf dem Server, und nichts in ServerScriptService wird an Spieler geschickt. |
| In einem Part in Workspace | Ein Script, das zu genau diesem Part gehört, wie ColourChanger und TouchPad | In Ordnung, solange du lernst: Der Part ist script.Parent. Für echte Projekte rät Roblox, die Parts stattdessen zu taggen (siehe unten). |
| StarterPlayerScripts, in StarterPlayer | Die meisten LocalScripts: Eingaben, die Kamera, Effekte für einen Spieler | Jeder Spieler bekommt beim Beitreten seine eigene Kopie. |
| StarterGui | LocalScripts in einer ScreenGui, die ein Bildschirmmenü steuern | Jeder Spieler bekommt seine eigene Kopie der Oberfläche. |
| ReplicatedStorage | ModuleScripts, die Server- und Client-Code laden | Beide Seiten können es sehen. Ein LocalScript, oder ein Script mit Standardeinstellungen, läuft hier nie. |
Die Seite zu Skript-Orten von Roblox empfiehlt, Skripte gar nicht direkt in Parts in Workspace zu legen: Tagge die Parts stattdessen und arbeite mit ihnen aus einem einzigen ModuleScript über CollectionService. Ein Skript in einem Part ist trotzdem der einfachste Einstieg und für ein oder zwei Objekte beim Lernen in Ordnung. Der Tür-Guide zeigt das Muster mit Tags, mit einem Skript für jede Tür, und der Client-und-Server-Guide hat die vollständige Tabelle, welche Container welche Skripte ausführen (beide auf Englisch).
Wenn etwas schiefgeht: den Output lesen
Fehler erscheinen im Output in Rot. Jeder beginnt damit, wo er passiert ist, mit dem vollen Namen des Skripts und der Zeilennummer, und sagt dann, was schiefging. Klick auf den Fehler, und Studio öffnet das Skript an dieser Zeile. Hättest du zum Beispiel die Prüfung if not player aus TouchPad gelöscht und ein loser Part wäre auf dem Pad gelandet, würde der Output zeigen:
Workspace.Pad.TouchPad:22: attempt to index nil with 'Name'
Fehler in der Schreibweise des Codes, zum Beispiel ein fehlendes end, zeigen sich schon vor dem Drücken auf Play: Der Script Editor unterstreicht sie rot, und das Fenster Script Analysis (der Button Analysis im Tab Script) listet sie. Ein Skript mit so einem Fehler läuft gar nicht, nicht einmal die Zeilen darüber.
| Meldung | Was sie bedeutet | Lösung |
|---|---|---|
Colour is not a valid member of Part "Workspace.Part" | An diesem Objekt gibt es nichts mit genau diesem Namen. Hier heißt die Eigenschaft Color. | Übernimm Schreibweise und Großbuchstaben aus dem Properties-Fenster oder dem Explorer. Mehr zu diesem Fehler. |
attempt to index nil with 'Name' | Der Code hat etwas, hier .Name, aus einem Wert gelesen, der nil war. Im Beispiel oben war player nil, weil ein loser Part das Pad berührt hat. | Finde heraus, warum der Wert nil ist, und prüf ihn mit if, bevor du ihn nutzt. Mehr zu diesem Fehler. |
Expected 'end' (to close 'then' at line 2), got <eof> | Das if in Zeile 2 hat kein passendes end. Bei einer Funktion sagt die Meldung to close 'function', und <eof> heißt Ende der Datei. | Füge das fehlende end hinzu und schau dir die Zeile in den Klammern an, nicht die letzte Zeile. Manchmal endet die Meldung mit „did you forget to close ... at line N?“. Dieser Teil ist eine Vermutung von Luau anhand deiner Einrückung und kann auf den falschen Block zeigen, also prüf zuerst die Zeile in den Klammern. Mehr zu Syntaxfehlern. |
Wenn ein Skript nichts tut und der Output auch nichts zeigt, liegt es meist irgendwo, wo es nie läuft, oder wartet auf ein Event, das nie feuert. Der Guide zu Skriptfehlern hat eine Checkliste für stille Skripte und geht tiefer darauf ein, wie man den Output liest (auf Englisch).
Was ältere Scripting-Tutorials anders machen
Wenn du auch mit Videos und Forenbeiträgen lernst, triffst du auf ältere Muster. Das sind die wichtigen, jeweils mit dem Grund, warum sie ein Problem sind.
| Das Tutorial | Das Problem | Dieser Guide |
|---|---|---|
Pausiert mit wait(1) | Die Referenz von Roblox markiert das globale wait() als veraltet und sagt, task.wait() habe es ersetzt. | task.wait(1) |
Findet die Figur mit otherPart.Parent, wie die Lava-Lektion von Roblox selbst | Berührt ein Hut oder ein gehaltenes Tool den Part, ist otherPart.Parent das Accessory oder das Tool, nicht die Figur, also wird kein Humanoid gefunden und diese Berührung verpasst. | FindFirstAncestorOfClass("Model"), dann GetPlayerFromCharacter |
Nutzt Touched ohne Debounce | Touched feuert bei einem Schritt mehrmals kurz hintereinander, also läuft der Code immer wieder. | Ein busy-Flag und ein Cooldown |
| Legt ein LocalScript in einen Part in Workspace | Dort läuft ein LocalScript nie. Es läuft nur an Orten, die einem Spieler gehören. | LocalScripts in StarterPlayerScripts (warum) |
Schreibt part.Touched:connect(...) oder table.getn(list) | Laut dem Namensguide von Roblox sind APIs in camelCase größtenteils veraltet, und die Referenz listet nur Connect. table.getn ist zugunsten von #list veraltet. | :Connect(...) und #list |
| Ändert Coins oder macht Schaden in einem LocalScript | Die Änderung bleibt auf dem Gerät dieses Spielers, also sieht sie sonst niemand, und der Server zählt sie nie. | Spielregeln in Scripts auf dem Server |
Übung: drei Änderungen zum Ausprobieren
Code zu ändern bringt mehr, als ihn zu lesen. Probier diese in deinem eigenen Spiel aus, eine nach der anderen, und drück nach jeder auf Play.
- Lass das Pad einen Punkt geben. Füge das Leaderstats-Skript aus Schritt 1 des Leaderboard-Guides (auf Englisch) hinzu. Such dann in TouchPad nach
busy = trueden Ordnerleaderstatsdes Spielers und erhöh seinen WertCoinsum 1. Tipp:player:FindFirstChild("leaderstats"), dannleaderstats:FindFirstChild("Coins"), danncoins.Value += 1. Das Münz-Pad im Leaderboard-Guide ist eine fertige Version, mit einem Cooldown pro Spieler. - Lass auch den Farbwechsler verblassen. Lass ColourChanger zusätzlich jede Sekunde die
Transparencydes Parts ändern. Tipp: Füge eine zweite Tabelle mit Zahlen zwischen 0 und 1 hinzu, zum Beispiel{ 0, 0.3, 0.6 }, und setzpart.Transparencyin der Zeile nachpart.Colordaraus, mit demselbenindex. - Gib die Farbe des Pads aus. Lass MyFirstLocalScript beim Drücken von E die
Colordes Pads ausgeben. Tipp:print(pad.Color)im Blockif pad and pad:IsA("BasePart"). Drück E, während das Pad gelb ist: Der Client sieht die Farbe, die der Server gesetzt hat, weil Änderungen auf dem Server jeden Client erreichen.
Was du als Nächstes lernst
Du hast jetzt die Bausteine benutzt, aus denen die meisten Spielskripte bestehen. Eine gute Reihenfolge für das, was als Nächstes kommt (die Guides sind auf Englisch, bis auf den ersten Spiel-Guide):
- LocalScript vs Script vs ModuleScript: wo jeder Skripttyp läuft und was er ändern kann, tiefer als Schritt 4.
- RemoteEvents: wie ein LocalScript den Server bittet, etwas zu tun, und wie der Server die Anfrage prüft.
- Eine Bestenliste: deine ersten Werte, auf dem Server erstellt und geändert.
- Dein erstes Spiel: ein kurzer Münz-Parcours mit Lava, Coins und einem Ziel-Pad, gesteuert von zwei Server-Skripten, dann veröffentlicht.
- Dann such dir ein System aus: eine Shop-GUI, ein Rundensystem, Obby-Checkpoints, einen Ladebildschirm oder eine Animation auf Tastendruck. Wenn etwas kaputtgeht, hilft dir der Guide zu Skriptfehlern, die Meldung zu lesen.
Die eigenen Tutorials Coding fundamentals (auf Englisch) von Roblox sind eine gute Ergänzung: sechs Reihen, die von Variablen und Funktionen über Bedingungen, Schleifen sowie Arrays und Dictionaries bis zum Organisieren von Code mit ModuleScripts gehen, mit kleinen Projekten zum Bauen in Studio.
Häufige Fehler und Lösungen
Die meisten Probleme mit ersten Skripten sind ein Name, der nicht passt, ein Skript an der falschen Stelle oder eine Schleife ohne Warten. Lass beim Testen den Output offen.
Studio friert ein oder reagiert nicht, wenn ich auf Play drücke
Eine Schleife while true do hat kein Warten darin, also kommt nichts anderes mehr dran. Laut der Dokumentation von Roblox friert eine Endlosschleife ohne Verzögerung wie task.wait() das Spiel ein und lässt Studio abstürzen. Setz ein task.wait() in jede Schleife, die für immer läuft, wie ColourChanger es tut.
Nichts passiert, wenn ich auf das Pad trete
Prüf, dass TouchPad ein Script ist, kein LocalScript, direkt im Part Pad liegt, nicht deaktiviert ist und dass die Eigenschaft CanTouch des Pads angehakt ist. Mach dann print("touched", otherPart.Name) zur ersten Zeile in onTouched. Wird es nie ausgegeben, feuert das Event nicht; wird es ausgegeben, liegt das Problem weiter unten.
E zu drücken macht nichts
MyFirstLocalScript muss ein LocalScript in StarterPlayerScripts sein: Ein LocalScript in Workspace oder ServerScriptService läuft nie. Der Part muss genau Pad heißen und direkt im Workspace liegen. Klick zuerst in die Spielansicht und achte darauf, dass du nicht im Chat tippst, denn das Skript ignoriert Tasten, die das Spiel schon genutzt hat.
Der Part ändert sich auf meinem Bildschirm, aber nicht für andere Spieler
Die Änderung kam aus einem LocalScript, also ist sie auf deinem Gerät geblieben. Mach sie stattdessen in einem Server-Script, oder lass das LocalScript den Server mit einem RemoteEvent fragen.
ColourChanger funktioniert in einem Part, aber nicht in ServerScriptService
Es nutzt script.Parent als seinen Part. In ServerScriptService ist der Parent ServerScriptService, das weder Anchored noch Color hat, also zeigt der Output einen Fehler „not a valid member“. Lass es im Part, oder gib dem Part einen Namen und such ihn darüber, zum Beispiel local part = workspace:WaitForChild("ColourPart") :: BasePart.
Der Output zeigt gar nichts
Prüf, ob das Output-Fenster offen ist (Menü Window oder Tab Script) und kein Filter gesetzt ist: Der Output lässt sich nach Nachrichtentyp, nach Client oder Server und nach Text filtern. Ist er offen und trotzdem leer, ist das Skript wahrscheinlich nie gelaufen. Siehe die Checkliste für Skripte, die nichts tun (auf Englisch).
Mit RoCode weiterkommen
Wenn du bei einem Skript in deinem eigenen Spiel feststeckst, kann RoCode es mit dir lesen. RoCode ist ein unabhängiger KI-Agent für Roblox Studio und stammt nicht von Roblox: Du schreibst in einem Webchat, und sein Studio-Plugin erstellt und bearbeitet die Skripte in deinem Explorer.
Während du lernst, ist der Ask-Modus der nützliche: Du schreibst die Skripte weiterhin selbst, und RoCode liest, was schon da ist, und beantwortet deine Fragen dazu. Prompts kannst du auf Deutsch schreiben.
Erklär mir Zeile für Zeile, was das Skript TouchPad im Part Pad macht, und sag mir, warum es ein Debounce nutzt.
- Nutzt im Ask-Modus nur lesende Tools wie Search Scripts und Read Script und ändert nichts im Spiel
- Muss etwas repariert werden, sagt es, was es wo ändern würde, und schlägt vor, zu Build zu wechseln
- Wechsle zu Build, und es bearbeitet die Skripte direkt und prüft jedes mit Check Script auf Kompilierfehler. Das ist eine Kompilierprüfung, keine Typprüfung und kein Playtest
- Liest den Output von Studio mit seinem Tool Check Output, einschließlich der Server- und Client-Zeilen deines letzten Playtests, auch nachdem du auf Stop gedrückt hast
Im Build-Modus mit Plugin 3.9 oder neuer kann RoCode einen kurzen Playtest machen und die Fehler lesen, und mit Plugin 3.9.11 oder neuer eine Testfigur steuern, um zu prüfen, ob das Spiel funktioniert, aber es macht während des Spiels keine Screenshots, also läufst du trotzdem selbst auf das Pad. Wie sich RoCode mit Studio verbindet.
Häufige Fragen
Wo schreibe ich Skripte in Roblox Studio?
Fahr im Explorer mit der Maus über einen Container wie ServerScriptService, klick auf + und wähl Script. Studio öffnet es im Script Editor, wo du Luau tippst. Server-Skripte kommen meist in ServerScriptService; LocalScripts in StarterPlayerScripts oder StarterGui.
Wie führe ich ein Skript in Roblox Studio aus?
Drück auf Play (F5). Studio startet einen Playtest, und jedes aktivierte Script in ServerScriptService oder Workspace läuft, sobald das Spiel startet; LocalScripts in StarterPlayerScripts laufen, sobald du dem Playtest beitrittst. Run (im Dropdown neben Play wählen oder F8 drücken) startet das Spiel ohne deinen Avatar, also nimm für diesen Guide Play. Drück auf Stop (Shift+F5), um den Test zu beenden. Um ein vorhandenes Skript zu öffnen, doppelklick es im Explorer.
Welche Programmiersprache nutzt Roblox?
Luau. Roblox beschreibt es als schnelle, kleine, sichere, schrittweise typisierte Skriptsprache, abgeleitet von Lua 5.1, also helfen die meisten Lua-Tutorials weiterhin. Luau ergänzt Funktionen wie String-Interpolation mit Backticks und optionale Typangaben, und Roblox ergänzt eigene Bibliotheken und Objekte wie task.wait.
Was ist der Unterschied zwischen einem Script und einem LocalScript?
Ein Script läuft auf dem Server, und seine Änderungen erreichen jeden Spieler. Ein LocalScript läuft auf dem Gerät eines Spielers, für Dinge wie Eingaben, die Kamera und Bildschirmmenüs, und seine Änderungen an Parts, Werten und der Oberfläche bleiben auf diesem Gerät. Der Client-und-Server-Guide (auf Englisch) deckt beide ab, plus ModuleScripts.
Kann ich auf dem Handy oder iPad in Roblox Studio scripten?
Die Setup-Seite von Roblox beschreibt Studio als kostenlose App für Windows und Mac und nennt keine Version für Handy oder Tablet, also brauchst du einen Computer, um Skripte zu schreiben.
Warum macht mein Skript nichts und zeigt keinen Fehler?
Meist liegt es an einem Ort, wo diese Art von Skript nicht läuft (ein LocalScript in Workspace oder ein Script in StarterPlayerScripts), es ist deaktiviert, oder das Event, auf das es wartet, feuert nie. Der Guide zu Skriptfehlern hat eine Checkliste (auf Englisch).
Wie lange dauert es, Roblox-Scripting zu lernen?
Eine ehrliche Zahl kann dir niemand nennen: Es hängt davon ab, wie viel du baust. Am meisten hilft es, oft kleine Skripte in deinem eigenen Spiel zu schreiben. Ändere die vier Skripte hier, probier die Übungen aus, folge dann dem Guide Roblox Spiel erstellen und füge ein System nach dem anderen hinzu.
Quellen und weiterführende Links
- Roblox Creator Docs: Luau (auf Englisch). was Luau ist und woher es kommt
- Roblox Creator Docs: Roblox Studio setup (auf Englisch). Windows und Mac, und die Systemanforderungen
- Roblox Creator Docs: Output (auf Englisch). Output öffnen, Filter, Show Context und Show Source
- Roblox Creator Docs: Studio testing modes (auf Englisch). Play, Run, Stop, der Umschalter Client/Server und Server & Clients
- Roblox Creator Docs: Script Editor (auf Englisch). wo neue Skripte geöffnet werden, und Script Analysis
- Roblox Creator Docs: Script types and locations (auf Englisch). wo jeder Skripttyp läuft, und Parts taggen statt Skripte hineinzulegen
- Roblox Creator Docs: Script (auf Englisch). wann ein Script zu laufen beginnt
- Roblox Creator Docs: Control structures (auf Englisch). if-Abfragen, Schleifen und warum eine Endlosschleife ein Warten braucht
- Roblox Creator Docs: Events (auf Englisch). Connect, und was Touched an deine Funktion übergibt
- Roblox Creator Docs: Debounce patterns (auf Englisch). warum Touched bei einer Berührung mehrmals feuert
- Roblox Creator Docs: wait (auf Englisch). das globale wait() und task.wait()
- Roblox Creator Docs: Network ownership, movement validation and physics exploits (auf Englisch). was ein Client mit seiner eigenen Figur tun kann
- Roblox Creator Docs: Coding fundamentals (auf Englisch). die eigene Anfängerreihe von Roblox
So wurde der Code geprüft: Jedes Skript auf dieser Seite besteht die strikte Typprüfung von Luau mit den Roblox API-Definitionen (luau-lsp, 26. Oktober 2026). Eine Typprüfung findet falsch geschriebene APIs und falsche Typen, aber keine Fehler in der Spiellogik. Teste also in Studio, bevor du veröffentlichst.