Creare squadre ti consente di ordinare i giocatori in gruppi che competono per completare un obiettivo comune, come segnare il maggior numero di punti o attraversare un traguardo prima degli altri membri della squadra nemica. Per uno sparatutto in prima persona, creare squadre è particolarmente importante perché stabilisce strategie di gioco complesse e coordinate che vanno oltre le capacità di qualsiasi singolo giocatore.
Utilizzando il gioco di laser tag di esempio come riferimento, questa sezione del tutorial ti insegna come ordinare i giocatori in squadre, inclusa la guida alla programmazione su:
- Utilizzare la funzionalità predefinita del servizio Teams per assegnare i giocatori alla squadra verde o rosa.
- Aiutare i giocatori a differenziare tra i loro alleati e i membri della squadra nemica attraverso indicatori di squadra sullo schermo e in gioco.
- Abilitare un gameplay permissivo che non penalizza i giocatori per aver colpito i propri compagni di squadra.
Dopo aver completato questa sezione, imparerai a conoscere gli script che consentono ai giocatori di apparire o riapparire in una lobby neutrale o in una zona di spawn di squadra, personalizzare i visual della forza di campo in prima persona e gestire lo stato del client sia dal server che dal client.

Assegna colori alle squadre
Il gioco di laser tag di esempio utilizza il servizio Teams come base per creare due squadre perché il servizio offre un comportamento di ordinamento delle squadre integrato che funziona ampiamente senza problemi. Ad esempio, senza alcuno sforzo di programmazione aggiuntivo, il servizio gestisce azioni come:
- Ordinare e bilanciare i giocatori uniformemente in ciascuna squadra.
- Raggruppare i giocatori sotto la loro squadra nella classifica.
- Colorare i nomi dei giocatori nello spazio 3D con il colore corrispondente alla loro squadra.
- Far apparire i giocatori in posizioni di spawn distinte a cui solo la loro squadra può accedere.
Grazie a questa funzionalità predefinita, il campione abilita il servizio Teams, quindi utilizza due distinti oggetti Team con diversi valori delle proprietà Team.Color per rappresentare ciascuna squadra: menta per la squadra che si riunisce su un lato della mappa e rosa carne per la squadra che si riunisce sull'altro lato della mappa. Questi colori specifici sono utili perché sono complementari, il che significa che si contrastano bene e consentono ai giocatori di scansionare facilmente i loro dintorni e orientarsi all'interno dell'edificio e rispetto ad altri giocatori.




È importante notare il nome esatto BrickColor per la proprietà Team.Color perché il gioco utilizza questo nome in molti script per tenere traccia dei giocatori mentre si ordinano in squadre, incrementare i punti man mano che i giocatori eliminano i giocatori nemici durante un round e aggiornare gli elementi UI personalizzati. Ad esempio, quando inizia un round, ReplicatedStorage ⟩ HUDGuiSetup richiede startSyncingTeamColor e startSyncingTeamPoints, che fanno entrambi riferimento a Team.Color per eseguire azioni uniche per ciascuna squadra.
startSyncingTeamColor fa riferimento a Team.Color in modo da poter assegnare il colore e l'icona corretti per l'indicatore di squadra del giocatore nell'angolo in basso a sinistra dello schermo.


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)
endVisualizza indicatori di squadra
Una volta che un giocatore è stato ordinato in una squadra, deve essere in grado di decifrare rapidamente a quale squadra appartiene e differenziare tra i suoi alleati e i membri della squadra nemica. Questa abilità è importante perché il gameplay di un gioco di sparatutto in prima persona richiede ai giocatori di prendere decisioni strategiche rapide mentre si trovano in zone di combattimento, in modo da non essere eliminati e perdere il round.
Per preparare i giocatori al successo, il gioco di laser tag di esempio fornisce più indicatori di squadra sia sullo schermo che nello spazio 3D:
- Indicatore Giocatore – UI personalizzata sullo schermo che mostra il colore e l'icona della squadra del giocatore.
- Indicatore Squadra – UI personalizzata in gioco che mostra il colore della squadra del giocatore.
- Indicatore Classifica – UI predefinita del servizio Teams che raggruppa i giocatori sotto il colore della loro squadra.
- Tinta Nome – UI predefinita del servizio Teams che tinge il nome del giocatore sopra la sua testa con il colore della sua squadra.




Non è necessario fare alcun lavoro aggiuntivo per l'Indicatore Classifica o la Tinta Nome al di fuori dell'assegnazione dei colori delle squadre dalla sezione precedente del tutorial, ma gli indicatori di squadra UI personalizzati richiedono uno sforzo di programmazione maggiore sia per visualizzare gli indicatori che per occludere gli indicatori nemici quando si trovano dietro le pareti. Per una spiegazione completa degli script che controllano il comportamento dell'UI personalizzata, così come come implementare ciascun elemento UI stesso, consulta Indicatore Giocatore e Indicatore Squadra dal Curriculum UI.
Disabilita il fuoco amico
Mentre alcuni giochi di sparatutto in prima persona penalizzano i giocatori che colpiscono i propri compagni di squadra, il gioco di laser tag di esempio consente un gameplay più permissivo disabilitando il fuoco amico. Questa decisione di design consente a tutti di aumentare solo il punteggio della propria squadra, senza sottrarre punti a causa di incidenti di gioco.
Per comprendere come il campione implementa questa funzionalità, esamina come ServerScriptService ⟩ LaserBlastHandler ⟩ processTaggedPlayers ⟩ onPlayerTagged gestisce il danno ai giocatori colpiti. Quando il server rileva una collisione tra il colpo di un giocatore e un altro giocatore, chiama la funzione onPlayerTagged per capire quale giocatore ha sparato, quale giocatore è stato colpito e quanto danno dovrebbe rimuovere dalla salute del giocatore in base al tipo di blaster.
local function onPlayerTagged(playerBlasted: Player, playerTagged: Player, damageAmount: number)Prima di diminuire la salute, lo script verifica prima se il giocatore colpito è nella stessa squadra del giocatore che ha iniziato il colpo. Se sono nella stessa squadra, lo script ignora completamente i dati del colpo.
local character = playerTagged.Character
local isFriendly = playerBlasted.Team == playerTagged.Team
-- Disabilita il fuoco amico
if isFriendly then
return
endTuttavia, se il giocatore colpito è nella squadra nemica, il giocatore subisce la quantità appropriata di danno in base al tipo di blaster. Inoltre, se il giocatore subisce abbastanza danno da essere eliminato, lo script premia un punto alla squadra del giocatore che ha iniziato il colpo. Per ulteriori informazioni su come il campione tiene traccia dei punti, consulta Aggiungi round più avanti nel tutorial.
local humanoid = character and character:FindFirstChild("Humanoid")
if humanoid and humanoid.Health > 0 then
local damage = math.min(damageAmount, humanoid.Health)
humanoid:TakeDamage(damage)
if humanoid.Health <= 0 then
Scoring.incrementScore(playerBlasted, 1)
end
end
end
return onPlayerTaggedSe testassi il gioco in questo momento, tutti i giocatori apparirebbero casualmente in una delle zone di spawn agli estremi opposti dell'arena, indipendentemente dalla squadra a cui appartengono, il che significa che ciascuna squadra apparirebbe proprio accanto all'altra.
Per affrontare questo problema, la sezione successiva del tutorial ti insegna la logica personalizzata dietro la restrizione della spawn delle squadre a determinate posizioni di spawn, gestendo lo stato del client mentre i giocatori lasciano l'area di spawn dopo aver selezionato il loro blaster e riapparendo i giocatori nella loro zona di spawn o nell'area della lobby quando la loro salute raggiunge zero.