Criar equipes permite que você organize jogadores em grupos que competem para completar um objetivo comum, como marcar mais pontos ou atravessar uma linha de chegada antes de outros membros da equipe inimiga. Para um jogo de tiro em primeira pessoa, criar equipes é particularmente importante porque estabelece estratégias de gameplay complexas e coordenadas além das habilidades de qualquer jogador individual.
Usando a experiência de tag de laser de exemplo como referência, esta seção do tutorial ensina como organizar jogadores em equipes, incluindo orientações de script sobre:
- Usar a funcionalidade padrão do serviço Teams para atribuir jogadores à equipe verde ou rosa.
- Ajudar jogadores a diferenciar entre seus aliados e membros da equipe inimiga através de indicadores de equipe na tela e na experiência.
- Permitir um gameplay tolerante que não penaliza os jogadores por atingir seus companheiros de equipe.
Depois de concluir esta seção, você aprenderá sobre os scripts que permitem que os jogadores apareçam ou reapareçam em um lobby neutro ou zona de spawn da equipe, personalizem visuais de campo de força em primeira pessoa e gerenciem o estado do cliente tanto do servidor quanto do cliente.

Atribuir cores às equipes
A experiência de tag de laser de exemplo usa o serviço Teams como base para criar duas equipes porque o serviço oferece um comportamento de organização de equipes integrado que funciona em grande parte de forma simples. Por exemplo, sem nenhum esforço adicional de script, o serviço lida com ações como:
- Organizar e equilibrar jogadores de forma uniforme em cada equipe.
- Agrupar jogadores sob sua equipe no placar.
- Tingir os nomes dos jogadores no espaço 3D com a cor correspondente da equipe.
- Fazer os jogadores aparecerem em locais distintos de spawn que apenas sua equipe pode acessar.
Por causa dessa funcionalidade padrão, o exemplo ativa o serviço Teams, e então usa dois distintos objetos Team com diferentes valores de propriedades Team.Color para representar cada equipe: menta para a equipe que se reúne de um lado do mapa, e rosa carnation para a equipe que se reúne do lado oposto do mapa. Essas cores específicas são úteis porque são complementares, significando que contrastam bem entre si, e permitem que os jogadores escaneiem facilmente ao seu redor e se orientem dentro do prédio e em relação a outros jogadores.




É importante notar o nome exato de BrickColor para a propriedade Team.Color porque a experiência usa esse nome em muitos scripts da experiência para acompanhar os jogadores à medida que eles se organizam em equipes, incrementar pontos à medida que os jogadores eliminam jogadores inimigos durante uma rodada e atualizar elementos da UI personalizados. Por exemplo, quando uma rodada começa, ReplicatedStorage ⟩ HUDGuiSetup requer startSyncingTeamColor, e startSyncingTeamPoints que referenciam Team.Color para realizar ações únicas para cada equipe.
startSyncingTeamColor referencia Team.Color para que possa atribuir a cor e ícone corretos para o indicador de equipe do jogador no canto inferior esquerdo da tela.


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
Exibir indicadores de equipe
Assim que um jogador é organizado em uma equipe, ele precisa ser capaz de decifrar rapidamente de qual equipe pertence e diferenciar entre seus aliados e os membros da equipe inimiga. Essa capacidade é importante porque a jogabilidade de uma experiência de tiro em primeira pessoa exige que os jogadores tomem decisões estratégicas rápidas enquanto estão em zonas de combate, para que não sejam eliminados e percam a rodada.
Para preparar os jogadores para o sucesso, a experiência de tag de laser de exemplo fornece múltiplos indicadores de equipe tanto na tela quanto no espaço 3D:
- Indicador de Jogador – UI personalizada na tela que exibe a cor e ícone da equipe do jogador.
- Indicador de Equipe – UI personalizada na experiência que exibe a cor da equipe do jogador.
- Indicador de Placar – UI padrão do serviço Teams que agrupa jogadores sob a cor de sua equipe.
- Tingimento de Nome – UI padrão do serviço Teams que tinge o nome do jogador acima de sua cabeça com a cor da sua equipe.




Você não precisa fazer nenhum trabalho adicional para o Indicador de Placar ou Tingimento de Nome além de atribuir cores de equipe da seção anterior do tutorial, mas os indicadores de equipe personalizados requerem mais esforço de programação para tanto exibir os indicadores quanto ocluir indicadores inimigos quando estão atrás de paredes. Para uma explicação completa dos scripts que controlam o comportamento da UI personalizada, bem como como implementar cada elemento da UI, consulte Indicador de Jogador e Indicador de Equipe do Currículo de UI.
Desabilitar fogo amigo
Enquanto algumas experiências de tiro em primeira pessoa penalizam jogadores que atingem seus próprios companheiros de equipe, a experiência de tag de laser de exemplo permite uma jogabilidade mais tolerante desabilitando o fogo amigo. Essa decisão de design permite que todos apenas aumentem sua pontuação da equipe, sem subtrair devido a acidentes de jogabilidade.
Para entender como o exemplo implementa essa funcionalidade, examine como ServerScriptService ⟩ LaserBlastHandler ⟩ processTaggedPlayers ⟩ onPlayerTagged lida com o dano a jogadores marcados. Quando o servidor detecta uma colisão entre a explosão de um jogador e outro jogador, ele chama a função onPlayerTagged para entender qual jogador disparou a explosão, qual jogador foi atingido pela explosão e quanto dano deve ser removido da saúde do jogador de acordo com o tipo de atirador.
local function onPlayerTagged(playerBlasted: Player, playerTagged: Player, damageAmount: number)
Antes de diminuir a saúde, o script primeiro verifica se o jogador marcado está na mesma equipe que o jogador que iniciou a explosão. Se eles estiverem na mesma equipe, o script ignora completamente os dados da explosão.
local character = playerTagged.Characterlocal isFriendly = playerBlasted.Team == playerTagged.Team-- Desabilitar fogo amigoif isFriendly thenreturnend
No entanto, se o jogador marcado estiver na equipe inimiga, o jogador recebe a quantidade apropriada de dano de acordo com o tipo de atirador. Além disso, se o jogador receber dano suficiente para ser marcado fora, o script recompensa um ponto para a equipe do jogador que iniciou a explosão. Para mais informações sobre como o exemplo rastreia pontos, consulte Adicionar rodadas mais adiante no 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
Se você testasse a experiência agora, todos os jogadores apareceria aleatoriamente em qualquer zona de spawn nas extremidades opostas da arena, independentemente da equipe a que pertencem, significando que cada equipe apareceria muito próxima uma da outra.
Para resolver esse problema, a próxima seção do tutorial ensina sobre a lógica personalizada por trás da restrição de spawn de equipe a certas localizações de spawn, lidando com o estado do cliente à medida que os jogadores deixam a área de spawn após escolher seu atirador e reaparecendo jogadores de volta à sua zona de spawn ou área de lobby quando sua saúde chega a zero.