Teams erstellen ermöglicht es dir, Spieler in Gruppen zu sortieren, die in einem Wettbewerb um ein gemeinsames Ziel antreten, wie zum Beispiel die meisten Punkte zu erzielen oder eine Ziellinie vor den Mitgliedern des feindlichen Teams zu überqueren. Bei einem Ego-Shooter ist die Erstellung von Teams besonders wichtig, da sie komplexe, koordinierte Gameplay-Strategien ermöglicht, die über das Können eines einzelnen Spielers hinausgehen.
Anhand der Beispiel-Laser-Tag-Erfahrung wird in diesem Abschnitt des Tutorials erklärt, wie du Spieler in Teams sortierst, einschließlich Skriptanleitungen zu:
- Verwendung der standardmäßigen Funktionalität des Teams-Services, um Spieler dem grünen oder pinken Team zuzuordnen.
- Hilfe für Spieler, zwischen ihren Verbündeten und den Mitgliedern des feindlichen Teams durch Bildschirm- und In-Erfahrung-Teamanzeigen zu unterscheiden.
- Ermöglichung von verzeihendem Gameplay, das Spieler nicht bestraft, wenn sie ihre Teamkollegen ausschalten.
Nachdem du diesen Abschnitt abgeschlossen hast, wirst du über die Skripte lernen, die es Spielern ermöglichen, zu einem neutralen Lobby- oder Team-Spawnbereich zu spawnen oder wiederzubeleben, die visuelle Darstellung des persönlichen Kraftfelds anzupassen und den Zustand des Clients sowohl vom Server als auch vom Client aus zu verwalten.

Teamfarben zuweisen
Die Beispiel-Laser-Tag-Erfahrung nutzt den Teams-Service als Grundlage für die Erstellung von zwei Teams, weil der Service eine integrierte Team-Sortierfunktionalität bietet, die im Wesentlichen sofort funktioniert. Zum Beispiel verarbeitet der Service ohne zusätzliche Skripting-Bemühungen Aktionen wie:
- Spieler gleichmäßig in jedes Team sortieren und ausbalancieren.
- Spieler unter ihrem Team auf der Rangliste gruppieren.
- Spielernamen im 3D-Raum in die entsprechende Teamfarbe einfärben.
- Spieler an unterschiedlichen Spawn-Standorten, auf die nur ihr Team zugreifen kann, erscheinen lassen.
Aufgrund dieser Standardfunktionalität aktiviert die Beispielerfahrung den Teams-Service, der dann zwei verschiedene Team-Objekte mit unterschiedlichen Werten für die Team.Color-Eigenschaft verwendet, um jedes Team darzustellen: mint für das Team, das sich auf einer Seite der Karte versammelt, und carnation pink für das Team, das sich auf der gegenüberliegenden Seite der Karte versammelt. Diese spezifischen Farben sind nützlich, weil sie komplementär sind, was bedeutet, dass sie sich gut voneinander abheben, und sie es den Spielern ermöglichen, ihre Umgebung leicht zu scannen und sich im Gebäude sowie zu anderen Spielern zu orientieren.




Es ist wichtig, den genauen BrickColor-Namen für die Team.Color-Eigenschaft zu beachten, da die Erfahrung diesen Namen in vielen Skripten verwendet, um den Überblick über Spieler zu behalten, während sie in Teams sortiert werden, Punkte zu erhöhen, wenn Spieler feindliche Spieler in einer Runde ausschalten, und benutzerdefinierte UI-Elemente zu aktualisieren. Zum Beispiel, wenn eine Runde beginnt, erfordert ReplicatedStorage ⟩ HUDGuiSetup startSyncingTeamColor und startSyncingTeamPoints, die beide auf Team.Color verweisen, um einzigartige Aktionen für jedes Team auszuführen.
startSyncingTeamColor verweist auf Team.Color, damit er die korrekte Farbe und das Symbol für die Teamanzeige des Spielers in der linken unteren Ecke ihres Bildschirms zuordnen kann.


local function setPlayerTeamIcon(gui: ScreenGui)
for _, teamColorIcon in gui.PlayerDisplay.TeamIcons:GetChildren() do
local iconTeamColor = teamColorIcon:GetAttribute(GuiAttribute.teamColor)
teamColorIcon.Visible = localPlayer.TeamColor == iconTeamColor
end
end
local function startSyncingTeamColor(gui: ScreenGui)
setPlayerTeamIcon(gui)
localPlayer:GetPropertyChangedSignal("Team"):Connect(function()
setPlayerTeamIcon(gui)
end)
end
Teamanzeigen anzeigen
Sobald ein Spieler in ein Team einsortiert ist, muss er in der Lage sein, schnell zu erkennen, zu welchem Team er gehört, und zwischen seinen Verbündeten und den Mitgliedern des feindlichen Teams zu unterscheiden. Diese Fähigkeit ist wichtig, da das Gameplay eines Ego-Shooter-Erlebnisses von den Spielern verlangt, schnelle strategische Entscheidungen im Kampfgebiet zu treffen, um nicht ausgeschaltet zu werden und die Runde zu verlieren.
Um die Spieler auf Erfolgskurs zu bringen, bietet die Beispiel-Laser-Tag-Erfahrung mehrere Teamanzeigen sowohl auf dem Bildschirm als auch im 3D-Raum:
- Spieleranzeige – Benutzerdefinierte Bildschirm-UI, die die Teamfarbe und das Symbol des Spielers anzeigt.
- Teamanzeige – Benutzerdefinierte In-Erfahrung-UI, die die Teamfarbe des Spielers anzeigt.
- Ranglistenanzeige – Standard-Teams-Service-Bildschirm-UI, die Spieler unter ihrer Teamfarbe gruppiert.
- Name-Tönung – Standard-Teams-Service-In-Erfahrung-UI, die den Namen des Spielers über ihrem Kopf in die Teamfarbe einfärbt.




Du musst keine weiteren Arbeiten für die Ranglistenanzeige oder die Name-Tönung leisten, außer die Teamfarben aus dem vorherigen Abschnitt des Tutorials zuzuordnen, aber die benutzerdefinierten UI-Teamanzeigen erfordern mehr Programmieraufwand, um die Anzeigen sowohl darzustellen als auch feindliche Anzeigen zu verdecken, wenn sie sich hinter Wänden befinden. Für eine vollständige Erklärung der Skripte, die das Verhalten der benutzerdefinierten UI steuern, sowie zur Implementierung jedes UI-Elements selbst, siehe Spieleranzeige und Teamanzeige aus dem UI-Lehrplan.
Freundliches Feuern deaktivieren
Während einige Ego-Shooter-Erlebnisse Spieler bestrafen, die ihre eigenen Teamkollegen angreifen, erlaubt die Beispiel-Laser-Tag-Erfahrung ein verzeihenderes Gameplay, indem sie freundliches Feuern deaktiviert. Diese Designentscheidung ermöglicht es jedem, nur seinen Team-Score zu erhöhen, anstatt ihn aufgrund von Spielfehlern zu verringern.
Um zu verstehen, wie das Beispiel diese Funktionalität implementiert, schaue dir an, wie ServerScriptService ⟩ LaserBlastHandler ⟩ processTaggedPlayers ⟩ onPlayerTagged den Schaden an den markierten Spielern behandelt. Wenn der Server eine Kollision zwischen dem Schuss eines Spielers und einem anderen Spieler erkennt, wird die Funktion onPlayerTagged aufgerufen, um zu verstehen, welcher Spieler den Schuss abgegeben hat, welcher Spieler getroffen wurde und wie viel Schaden von der Gesundheit des Spielers entsprechend dem Blastertyp abgezogen werden soll.
local function onPlayerTagged(playerBlasted: Player, playerTagged: Player, damageAmount: number)
Bevor die Gesundheit verringert wird, überprüft das Skript zunächst, ob der markierte Spieler im selben Team wie der Spieler ist, der den Schuss abgegeben hat. Wenn sie im selben Team sind, ignoriert das Skript die Daten des Schusses vollständig.
local character = playerTagged.Characterlocal isFriendly = playerBlasted.Team == playerTagged.Team-- Freundliches Feuern nicht zulassenif isFriendly thenreturnend
Wenn jedoch der markierte Spieler im feindlichen Team ist, erleidet der Spieler den entsprechenden Schaden gemäß dem Blastertyp. Darüber hinaus, wenn der Spieler genug Schaden nimmt, um ausgeschaltet zu werden, belohnt das Skript das Team des Spielers, der den Schuss abgegeben hat, mit einem Punkt. Für mehr Informationen darüber, wie das Beispiel Punkte verfolgt, siehe Runden hinzufügen später im Tutorial.
local humanoid = character and character:FindFirstChild("Humanoid")if humanoid and humanoid.Health > 0 thenlocal damage = math.min(damageAmount, humanoid.Health)humanoid:TakeDamage(damage)if humanoid.Health <= 0 thenScoring.incrementScore(playerBlasted, 1)endendendreturn onPlayerTagged
Wenn du die Erfahrung jetzt testen würdest, würden alle Spieler zufällig in einer der Spawn-Zonen an den gegenüberliegenden Enden der Arena erscheinen, unabhängig davon, welchem Team sie angehören, was bedeutet, dass sich beide Teams direkt nebeneinander spawnen würden.
Um dieses Problem anzugehen, lehrt dich der folgende Abschnitt des Tutorials die benutzerdefinierte Logik zur Einschränkung des Team-Spawns auf bestimmte Spawn-Standorte, zur Handhabung des Client-Zustands, wenn Spieler das Spawn-Gebiet verlassen, nachdem sie ihren Blaster ausgewählt haben, und zur Wiederbelebung von Spielern an ihren Spawn-Zonen oder im Lobby-Bereich, wenn ihre Gesundheit null erreicht.