Roblox Scripting für Anfänger: Luau-Programmierung lernen
Eine praxisnahe Einführung in Luau-Scripting in Roblox Studio — von deiner ersten Variable bis zu deinem ersten funktionierenden Spielskript, ganz ohne Vorkenntnisse im Programmieren.
Roblox Scripting ist der Weg, wie du aus einer statischen Szene ein spielbares Game machst. Jede Tür, die sich öffnet, jede Münze, die eingesammelt wird, jedes Leaderboard, das sich aktualisiert — all das läuft über Luau, die in Roblox Studio integrierte Programmiersprache. Wenn du noch nie eine Zeile Code geschrieben hast, bringt dich dieser Guide von Null zum Schreiben echter, funktionierender Spielskripte.
Luau basiert auf Lua, enthält aber moderne Features wie Type Checking und Performance-Optimierungen, die speziell für Roblox entwickelt wurden. Es ist eine der anfängerfreundlichsten Programmiersprachen überhaupt, und alles, was du zum Schreiben und Ausführen brauchst, ist bereits in Studio enthalten — keine zusätzlichen Code-Editoren oder Installationen nötig.
Deine Scripting-Umgebung einrichten
Öffne Roblox Studio und erstelle ein neues Baseplate-Projekt. Stelle sicher, dass du das Explorer-Panel auf der rechten Seite und das Output-Panel unten siehst — öffne sie über den View-Tab, falls sie fehlen. Im Explorer erstellst und organisierst du Skripte. Im Output liest du Print-Ausgaben und Fehlermeldungen — als Anfänger deine wichtigsten Debugging-Werkzeuge.
Um dein erstes Skript zu erstellen, klicke mit der rechten Maustaste auf ServerScriptService im Explorer, wähle Insert Object und dann Script. Ein neues Skript öffnet sich mit `print("Hello world!")`. Drücke Play und überprüfe das Output-Panel — du solltest die Nachricht dort sehen. Das ist dein erstes erfolgreiches Skript.
Variablen: Informationen speichern
Variablen sind benannte Behälter, die Daten aufnehmen. In Luau erstellst du eine mit dem Schlüsselwort `local`: `local playerName = "Steve"` erstellt eine Text-Variable, `local coins = 100` erstellt eine Zahl, und `local isAlive = true` erstellt einen Boolean. Verwende immer `local` — das begrenzt die Variable auf ihren Block und verhindert Konflikte. Benutze aussagekräftige Namen wie `playerHealth` statt `x`, damit dein Code lesbar bleibt.
Die wichtigsten Datentypen in Luau sind `string` für Text, `number` für Ganzzahlen und Dezimalzahlen, `boolean` für wahr/falsch, `nil` für das Fehlen eines Werts und `table` für Sammlungen. Du musst keine Typen deklarieren — Luau erkennt sie automatisch. Strings verkettest du mit `..` wie `"Hello, " .. playerName`, konvertierst zwischen Typen mit `tostring()` und `tonumber()` und verwendest Backtick-Strings mit geschweiften Klammern für Interpolation.
Funktionen: Wiederverwendbare Codeblöcke
Eine Funktion ist ein benannter Codeblock, der ausgeführt wird, wenn du ihn aufrufst. Die Struktur ist `local function giveCoins(player, amount)`, gefolgt vom Body und `end`. Die Wörter in Klammern sind Parameter — Eingabewerte, die die Funktion erhält. Rufe sie auf mit `giveCoins(somePlayer, 50)`. Funktionen können auch Werte zurückgeben: `local damage = calculateDamage(50, 20)` speichert das zurückgegebene Ergebnis.
Gewöhne dich früh daran, kleine Funktionen zu schreiben. Jedes Spielsystem — Kampf, Inventar, Shops, Leaderboards — ist in Funktionen organisiert. Wenn ein Codeblock eine bestimmte Aufgabe erledigt, packe ihn in eine Funktion und gib ihr einen klaren Namen.
If/Else: Entscheidungen treffen
Die `if`-Anweisung prüft eine Bedingung und führt Code nur aus, wenn sie wahr ist. Die Syntax lautet `if coins >= 100 then`, gefolgt von deinem Code, optional `elseif` für weitere Bedingungen, `else` als Fallback und `end` zum Abschließen. Vergleichsoperatoren sind `==` für Gleichheit, `~=` für Ungleichheit, `>`, `<`, `>=` und `<=`. Kombiniere Bedingungen mit `and`, `or` und `not` — zum Beispiel wird `if isAlive and coins > 0 then` nur ausgeführt, wenn beides zutrifft.
Ein häufiger Anfängerfehler ist die Verwendung von `=` statt `==` für Vergleiche. Einfaches `=` weist einen Wert zu. Doppeltes `==` vergleicht zwei Werte. Wenn sich dein Skript unerwartet verhält, überprüfe das zuerst.
Schleifen: Aktionen wiederholen
Die `for`-Schleife wird eine bestimmte Anzahl von Malen ausgeführt. Schreibe `for i = 1, 10 do`, gefolgt von Code und `end`, um zehnmal auszuführen. Füge einen Schrittwert hinzu — `for i = 10, 1, -1 do` zählt rückwärts. Die `while`-Schleife läuft, solange eine Bedingung wahr ist, braucht aber `task.wait()` im Inneren, um ein Einfrieren zu verhindern.
Die generische `for`-Schleife iteriert über Sammlungen. Verwende `for index, value in ipairs(myTable) do` für geordnete Listen oder `for key, value in pairs(myDictionary) do` für Key-Value-Dictionaries. So verarbeitest du Inventare, Spielerlisten und Leaderboard-Daten.
Tables: Daten organisieren
Tables sind die vielseitigste Datenstruktur in Luau — Arrays, Dictionaries oder beides. Erstelle ein Array mit `local fruits = {"Apple", "Banana", "Cherry"}` und greife auf Elemente zu mit `fruits[1]` (Luau beginnt bei 1, nicht bei 0). Erstelle ein Dictionary mit `local playerData = {coins = 100, level = 5}` und greife auf Werte zu mit `playerData.coins`. Nahezu jedes Spielsystem speichert Daten in Tables.
Events: Auf die Spielwelt reagieren
Events sind das Rückgrat des Roblox Scripting. Anstatt ständig zu prüfen, ob etwas passiert ist, verbindest du eine Funktion mit einem Event, und Roblox ruft sie automatisch auf, wenn es ausgelöst wird. Das häufigste Anfänger-Event ist `Touched` — verbinde es mit `part.Touched:Connect(function(hit) end)`, wobei `hit` das kollidierende Teil ist. Weitere wichtige Events sind `PlayerAdded` (wird ausgelöst, wenn ein Spieler beitritt), `PlayerRemoving` (wenn ein Spieler das Spiel verlässt), `CharacterAdded` (wenn ein Charakter spawnt) und `Changed` (wenn sich eine Eigenschaft ändert). Speichere Verbindungen in Variablen und rufe `connection:Disconnect()` auf, wenn sie nicht mehr benötigt werden, um Speicherlecks zu vermeiden.
Server Scripts vs. Local Scripts
Server Scripts laufen auf dem Roblox-Server und steuern die autoritative Spiellogik — Währung vergeben, Daten speichern, Runden verwalten. Platziere sie in ServerScriptService. Local Scripts laufen auf dem Gerät jedes Spielers für clientseitige Aufgaben — Kamera, Eingabe, UI. Platziere sie in StarterPlayerScripts, StarterCharacterScripts oder StarterGui.
Die goldene Regel: Vertraue niemals dem Client. Jede Logik, die das Gameplay beeinflusst, muss auf dem Server ablaufen. Der Client sendet Anfragen über RemoteEvents in ReplicatedStorage — feuere vom Client mit `remoteEvent:FireServer(data)`, lausche auf dem Server mit `remoteEvent.OnServerEvent:Connect(function(player, data) end)`. Der Server validiert und führt aus.
Dein erstes Spielskript: Ein Kill Brick
Füge ein Part in Workspace ein und färbe es rot. Klicke mit der rechten Maustaste darauf im Explorer, füge ein Script ein und ersetze den Standard-Code. Schreibe `local killPart = script.Parent`, um das Part zu referenzieren. Definiere `local function onTouched(hit)` und schreibe darin `local humanoid = hit.Parent:FindFirstChild("Humanoid")`, gefolgt von `if humanoid then humanoid.Health = 0 end`. Verbinde mit `killPart.Touched:Connect(onTouched)`.
Drücke Play und laufe in das rote Part. Dein Charakter stirbt und spawnt neu. Das ist ein vollständiges Spielskript in sieben Zeilen — jedes Roblox-Obby verwendet genau dieses Muster für Hindernisblöcke.
Dein zweites Skript: Ein Münzsammelsystem
Erstelle ein gelbes zylindrisches Part und füge ein Script ein. Schreibe `local coin = script.Parent` und `local debounce = false`. Prüfe in der `onTouched`-Funktion `if debounce then return end`, setze `debounce = true`, überprüfe ob ein Humanoid existiert, dann verstecke die Münze mit `coin.Transparency = 1` und `coin.CanCollide = false`. Nach `task.wait(5)` stelle sie wieder her und setze debounce zurück. Das Debounce-Muster taucht in fast jedem Touched-Skript auf — ohne es feuert das Event dutzende Male pro Sekunde, während sich Parts überlappen, was zu doppelten Einsammlungen führt. Lerne Debouncing früh.
Dein drittes Skript: Eine Tür, die sich öffnet
Erstelle ein hohes, schmales Part als Tür. Speichere `local door = script.Parent` und `local originalPosition = door.Position`. Bei Berührung bewege es nach oben mit `door.Position = originalPosition + Vector3.new(0, 10, 0)`, warte mit `task.wait(3)` und setze es zurück. Das führt `Vector3` ein — den Datentyp für 3D-Positionen, wobei y in Roblox nach oben zeigt. Für flüssigere Bewegung verwende TweenService: hole ihn mit `game:GetService("TweenService")`, erstelle eine TweenInfo für die Dauer und rufe `tweenService:Create(door, tweenInfo, {Position = targetPosition}):Play()` auf. Tweens animieren jede Eigenschaft über Zeit und lassen Interaktionen geschliffen wirken.
Wichtige Roblox-Services
Services, die du als Scripter ständig verwenden wirst:
- Players — Zugriff auf verbundene Spieler, Beitritte und Abgänge erkennen.
- ReplicatedStorage — gemeinsamer Container für Server- und Client-Skripte.
- TweenService — Eigenschaften sanft über Zeit animieren.
- UserInputService — Tastatur-, Maus- und Touch-Eingaben auf dem Client erkennen.
- Debris — Objekte nach einer Verzögerung automatisch zerstören mit Debris:AddItem.
- DataStoreService — persistente Spielerdaten zwischen Sitzungen speichern und laden.
Greife auf jeden Service zu mit `game:GetService("ServiceName")` und speichere die Referenz am Anfang deines Skripts. Schau dir den Guide zu Scripting-Werkzeugen an für weitere Ressourcen zur Arbeit mit der vollständigen Roblox-API.
Häufige Fehler und Fehlermeldungen
Ein LocalScript in ServerScriptService platzieren. LocalScripts laufen nur in Client-Containern — StarterPlayerScripts, StarterCharacterScripts oder unter einer GUI in StarterGui. Wenn dein Client-Code nichts tut, überprüfe zuerst seinen Standort.
Vergessen, auf nil zu prüfen. Wenn `FindFirstChild` `nil` zurückgibt und du auf eine Eigenschaft davon zugreifst, stürzt dein Skript mit „attempt to index nil“ ab. Wickle Abfragen immer in eine if-Prüfung, bevor du das Ergebnis verwendest.
wait() statt task.wait() verwenden. Das veraltete `wait()` ist ungenau und veraltet. Verwende `task.wait(seconds)` für Verzögerungen, `task.spawn()` für Threads und `task.delay()` für verzögerte Aufrufe.
Wenn Fehler im Output-Panel erscheinen, lies sie sorgfältig — sie enthalten den Skriptnamen, die Zeilennummer und eine Beschreibung. Der Fehler „expected 'end'“ bedeutet ein nicht geschlossener Block. Zähle deine `if/then/end`- und `function/end`-Paare — jedes öffnende Schlüsselwort braucht ein passendes `end`.
Spielerdaten speichern
DataStoreService speichert den Spielerfortschritt zwischen Sitzungen. Hole einen Store mit `game:GetService("DataStoreService"):GetDataStore("PlayerData")`. Lade beim Beitritt mit `pcall(function() return dataStore:GetAsync("Player_" .. player.UserId) end)` und speichere beim Verlassen mit `SetAsync`. Wickle DataStore-Aufrufe immer in `pcall`, um Netzwerkfehler abzufangen, die sonst dein Skript zum Absturz bringen würden. Speichere bei `PlayerRemoving` und ziehe automatisches Speichern per Timer als Backup in Betracht. DataStores erfordern ein veröffentlichtes Spiel — aktiviere den API-Zugriff in den Spieleinstellungen zum Testen in Studio. Datenverlust ist der schnellste Weg, Spieler dauerhaft zu verlieren.
Nächste Schritte
Fähigkeiten, die du nach dem Meistern der Grundlagen lernen solltest:
- ModuleScripts — gemeinsame Code-Bibliotheken, die Projekte organisiert halten.
- Objektorientierte Programmierung — Code um Objekte mit Methoden strukturieren.
- UI-Programmierung — interaktive Menüs und HUD-Elemente erstellen.
- Raycasting — Sichtlinien, Geschossbahnen und Bodenprüfungen erkennen.
- Performance-Optimierung — Skripte schreiben, die mit der Spieleranzahl skalieren.
Performance zählt von Tag eins. Wenn Skripte wachsen, summieren sich schlechte Gewohnheiten. Lies unseren Guide zur Spielperformance, um zu verstehen, wie Scripting-Entscheidungen Framerate, Speicher und Netzwerkverkehr beeinflussen.
Der beste Weg zu lernen ist, etwas zu bauen. Wähle ein kleines Projekt — einen Münzsammler, ein Obby mit Leaderboard, ein Türrätsel — und baue es von Grund auf. Wenn du nicht weiterkommst, lies das Output-Panel, durchsuche die Roblox-Dokumentation und iteriere. Roblox Scripting ist einer der lohnendsten Einstiegspunkte in die Programmierung, weil die Feedback-Schleife sofort ist: Code schreiben, Play drücken, Ergebnis sehen.
Häufig Gestellte Fragen
Welche Programmiersprache verwendet Roblox?
Roblox verwendet Luau, eine von Lua abgeleitete Programmiersprache. Luau wurde von Roblox entwickelt und enthält zusätzliche Features wie optionales Type Checking, verbesserte Performance und bessere Fehlermeldungen. Wenn du Verweise auf „Roblox Lua“ siehst, ist damit Luau gemeint. Alles Scripting in Roblox Studio wird in Luau geschrieben.
Wie lange dauert es, Roblox Scripting zu lernen?
Du kannst einfache Skripte wie Kill Bricks und Münzsammler schon am ersten Tag schreiben. Das Verständnis der Kernkonzepte wie Variablen, Funktionen, Events und if/else-Anweisungen dauert bei regelmäßiger Übung ein bis zwei Wochen. Das Erstellen kompletter Spielsysteme wie Datenspeicherung, Inventarverwaltung und rundenbasiertes Gameplay dauert in der Regel ein bis drei Monate. Regelmäßiges Üben zählt mehr als die Gesamtstunden.
Muss ich Lua können, bevor ich Roblox Scripting lerne?
Nein. Luau ist anfängerfreundlich genug, um deine erste Programmiersprache zu sein. Du brauchst keine Vorkenntnisse in Lua oder einer anderen Sprache. Roblox Studio enthält einen integrierten Code-Editor, Fehlerausgabe und Testwerkzeuge, mit denen du durch Ausprobieren lernst. Beginne mit den Grundlagen in diesem Guide und baue kleine Projekte, um jedes Konzept zu festigen.
Was ist der Unterschied zwischen einem Script und einem LocalScript in Roblox?
Ein Script läuft auf dem Server und steuert die autoritative Spiellogik, die für alle Spieler gilt, wie das Vergeben von Items, das Verwalten von Runden und das Speichern von Daten. Ein LocalScript läuft auf dem Gerät eines einzelnen Spielers und kümmert sich um clientseitige Aufgaben wie Kamerasteuerung, Benutzereingabe und UI-Updates. Sie kommunizieren über RemoteEvents und RemoteFunctions, die in ReplicatedStorage gespeichert werden.
Warum funktioniert mein Roblox-Skript nicht?
Überprüfe das Output-Panel in Studio auf rote Fehlermeldungen — sie verraten dir den Skriptnamen, die Zeilennummer und was schiefgelaufen ist. Die häufigsten Probleme sind: Das Skript befindet sich im falschen Container (LocalScripts laufen nicht in ServerScriptService), eine Variable ist nil, weil FindFirstChild das Objekt nicht gefunden hat, ein fehlendes end-Schlüsselwort, das die Syntax bricht, oder die Verwendung eines einfachen Gleichheitszeichens zum Vergleichen statt eines doppelten. Behebe Fehler einzeln, beginnend mit dem ersten in der Liste.