Tutorial · Scripting-Grundlagen

Roblox Scripting für Anfänger: so programmierst du in Roblox Studio

Scripten, also programmieren, in Roblox Studio heißt, Luau zu schreiben, die Roblox-Version der Sprache Lua, und zwar in Skripten, die du deinem Spiel hinzufügst. Dieser Guide beginnt mit einer leeren Baseplate: Du öffnest das Output-Fenster, schreibst ein erstes Skript, änderst einen Part per Code, reagierst darauf, dass ein Spieler auf eine Platte tritt, und probierst ein LocalScript aus. Unterwegs lernst du Variablen, Funktionen, if-Abfragen, Schleifen und Events.

Aktualisiert am 26. Oktober 202621 Min. Lesezeit

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(), nicht wait(). Die Referenz von Roblox markiert das globale wait() als veraltet und durch task.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
  1. Bevor du anfängst
  2. 1. Erstes Skript
  3. 2. Part ändern
  4. 3. Events
  5. 4. Erstes LocalScript
  6. 5. Testen
  7. Wo Skripte hingehören
  8. Fehler lesen
  9. Ältere Tutorials
  10. Übung
  11. Wie weiter
  12. Häufige Fehler
  13. Mit RoCode
  14. Häufige Fragen
  15. Quellen und weiterführende Links

Bevor du anfängst: Studio, eine Baseplate und das Output-Fenster

IllustrationDie vier Skripte in einem Playtest: Der Part ColourChanger wechselt jede Sekunde die Farbe, Treten auf das Pad macht es für jeden Spieler 2 Sekunden gelb und schreibt deinen Namen in den Output, und E macht das Pad nur auf diesem Bildschirm durchsichtig.

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.

  1. Installier Roblox Studio, die kostenlose App von Roblox für Windows und Mac, und melde dich mit deinem Roblox-Konto an.
  2. Ö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.
  3. 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.
  4. Öffne Output über das Menü Window oder den Tab Script. Hier erscheinen die Nachrichten und Fehler deiner Skripte.
  5. 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.
Die vier Skripte, die du schreibst
SkriptTypWohin es kommtWas es dir beibringt
FirstScriptScriptServerScriptServiceVariablen, eine Funktion, eine if-Abfrage, Schleifen und eine Tabelle
ColourChangerScriptIn einen Part in WorkspaceEigenschaften ändern, script.Parent und eine Schleife, die wartet
TouchPadScriptIn einen Part namens PadEvents, den Spieler finden, der einen Part berührt hat, und ein Debounce
MyFirstLocalScriptLocalScriptStarterPlayerScripts, in StarterPlayerCode, der auf dem Gerät eines Spielers läuft, Tastendrücke und was auf diesem Gerät bleibt
Der Explorer am Ende (nur die Objekte, die dieser Guide nutzt)
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

  1. 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.
  2. 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.
  3. Neue Skripte beginnen mit einer Zeile, print("Hello world!"). Lösch sie und füge den Code unten ein.
  4. Drück auf Play (F5), mit Test im Dropdown links daneben. Studio startet einen Playtest und setzt deinen Avatar auf die SpawnLocation.
  5. 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
-- 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.

Output (erwartet)
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.

Was jeder Teil von FirstScript macht
CodeIdeeWas es bedeutet
local gameName = "Coin Run"VariableEin 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): stringFunktionEin 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.
returnRückgabewertGibt 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-InterpolationText in Backticks kann Werte enthalten: Luau ersetzt {name} und {goal} durch ihre aktuellen Werte.
if, elseif, else, endif-AbfrageLuau 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 doZählschleifeFü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 doTabelle und SchleifeEine 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.

  1. Klick im Tab Home auf Part. Studio fügt dem Workspace einen Block hinzu. Sein Name ist egal.
  2. Fahr im Explorer mit der Maus über den neuen Part, klick auf + und füge ein Script ein. Nenn es ColourChanger und ersetz seinen Inhalt durch den Code unten.
  3. 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
-- 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.Parent ist das Objekt, in dem das Skript steckt, hier der Part. Zieh das Skript in einen anderen Part, und es ändert stattdessen diesen.
  • :: BasePart ist 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.Color und part.Anchored sind dieselben Eigenschaften, die du im Properties-Fenster siehst, mit denselben Namen. Roblox nutzt amerikanische Schreibweise, also heißt die Eigenschaft Color, obwohl dieses Skript ColourChanger heißt.
  • Anchored = true hä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. #colours ist die Länge der Liste, 3, und % gibt den Rest nach dem Teilen, also zählt index % #colours + 1 1, 2, 3, 1, 2, 3.
  • while true do wiederholt für immer, deshalb ist das task.wait(1) darin wichtig. Laut der Dokumentation von Roblox gehört in eine Endlosschleife immer eine Verzögerung wie task.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.

  1. 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.
  2. Mach eine flache Platte daraus, auf die du laufen kannst, zum Beispiel indem du im Properties-Fenster Size auf 6, 1, 6 setzt. Schieb sie auf den Boden in die Nähe der SpawnLocation und hak Anchored an, damit sie bleibt, wo sie ist.
  3. Fahr mit der Maus über Pad, klick auf +, füge ein Script ein, nenn es TouchPad und füge den Code unten ein.
  4. Drück auf Play und lauf auf die Platte. Sie wird für 2 Sekunden gelb, und der Output nennt deinen Namen.
Script in dem Part Pad in Workspace namens TouchPad
-- 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)
Wie TouchPad von einer Berührung zu einem Spieler kommt
CodeWas 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.
otherPartDer 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 endHö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ß.

  1. Klapp im Explorer StarterPlayer auf, fahr mit der Maus über StarterPlayerScripts, klick auf + und füge ein LocalScript ein. Nenn es MyFirstLocalScript und füge den Code unten ein.
  2. Drück auf Play. Der Output zeigt Hello, und deinen Namen, gekennzeichnet mit Client.
  3. Klick in die Spielansicht und drück E. Das Pad wird durchsichtig. Drück noch einmal E, um es zurückzuholen.
  4. 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 StarterPlayerScripts namens MyFirstLocalScript
-- 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.LocalPlayer ist 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.InputBegan feuert, wenn der Spieler einen Tastendruck, einen Klick oder eine Berührung beginnt. gameProcessed ist true, 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 oder nil, wenn es keins gibt. pad:IsA("BasePart") prüft, ob es wirklich ein Part ist, bevor das Skript seine Transparency ändert.
  • if pad.Transparency == 0 then 0.6 else 0 ist 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.
Script, LocalScript und ModuleScript
TypLäuft aufSeine Änderungen erreichenNutze es fürKommt meist in
ScriptDem ServerJeden SpielerSpielregeln: Coins, Schaden, Türen, Runden, SpeichernServerScriptService, oder beim Lernen in einen Part
LocalScriptDem Gerät eines SpielersNur dieses Gerät, abgesehen von der Bewegung seiner eigenen FigurEingaben, die Kamera, Bildschirmmenüs, Effekte für einen SpielerStarterPlayerScripts oder StarterGui
ModuleScriptDer Seite, die require() darauf aufruftDasselbe wie das Skript, das es geladen hatCode, den mehrere Skripte teilenReplicatedStorage 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

  1. 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.
  2. 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.
  3. Drück E. Das Pad wird auf eine Transparency von 0.6 durchsichtig. Drück noch einmal E, und es ist massiv.
  4. 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.
  5. Mach absichtlich etwas kaputt. Benenn Pad in Pad2 um und spiel. Drauflaufen macht es weiterhin gelb, weil TouchPad seinen Part über script.Parent findet, nicht über den Namen. E macht jetzt nichts, und es gibt keinen Fehler: FindFirstChild("Pad") hat nil zurückgegeben, und die Prüfung if pad and ... hat den Rest still übersprungen. Füge in der Zeile nach FindFirstChild ein print(pad) ein, spiel und drück E: Der Output zeigt nil. 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:

Wohin jede Art von Skript kommt
ContainerGehört hierherWarum
ServerScriptServiceSkripte mit den meisten Regeln deines Spiels: Belohnungen, Runden, SpeichernSie laufen auf dem Server, und nichts in ServerScriptService wird an Spieler geschickt.
In einem Part in WorkspaceEin Script, das zu genau diesem Part gehört, wie ColourChanger und TouchPadIn 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 StarterPlayerDie meisten LocalScripts: Eingaben, die Kamera, Effekte für einen SpielerJeder Spieler bekommt beim Beitreten seine eigene Kopie.
StarterGuiLocalScripts in einer ScreenGui, die ein Bildschirmmenü steuernJeder Spieler bekommt seine eigene Kopie der Oberfläche.
ReplicatedStorageModuleScripts, die Server- und Client-Code ladenBeide 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:

Output (Beispiel)
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.

Drei Fehler, die du erkennen solltest
MeldungWas sie bedeutetLö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.

Muster in älteren Tutorials, und was dieser Guide stattdessen macht
Das TutorialDas ProblemDieser 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 selbstBerü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 DebounceTouched 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 WorkspaceDort 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 LocalScriptDie Ä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 = true den Ordner leaderstats des Spielers und erhöh seinen Wert Coins um 1. Tipp: player:FindFirstChild("leaderstats"), dann leaderstats:FindFirstChild("Coins"), dann coins.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 Transparency des Parts ändern. Tipp: Füge eine zweite Tabelle mit Zahlen zwischen 0 und 1 hinzu, zum Beispiel { 0, 0.3, 0.6 }, und setz part.Transparency in der Zeile nach part.Color daraus, mit demselben index.
  • Gib die Farbe des Pads aus. Lass MyFirstLocalScript beim Drücken von E die Color des Pads ausgeben. Tipp: print(pad.Color) im Block if 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):

  1. LocalScript vs Script vs ModuleScript: wo jeder Skripttyp läuft und was er ändern kann, tiefer als Schritt 4.
  2. RemoteEvents: wie ein LocalScript den Server bittet, etwas zu tun, und wie der Server die Anfrage prüft.
  3. Eine Bestenliste: deine ersten Werte, auf dem Server erstellt und geändert.
  4. Dein erstes Spiel: ein kurzer Münz-Parcours mit Lava, Coins und einem Ziel-Pad, gesteuert von zwei Server-Skripten, dann veröffentlicht.
  5. 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.

Du schreibst

Erklär mir Zeile für Zeile, was das Skript TouchPad im Part Pad macht, und sag mir, warum es ein Debounce nutzt.

RoCode macht
  • 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

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.

Probier RoCode in deinem eigenen Spiel aus.

Jeden Tag kostenlose Credits, ohne Karte. Installiere das Plugin, beschreibe das Feature und prüfe, was in Studio ankommt.