팀 만들기는 플레이어를 그룹으로 정렬하여 가장 많은 점수를 얻거나 적 팀원보다 먼저 결승선을 통과하는 등의 공통 목표를 달성하기 위해 경쟁하게 합니다. 1인칭 슈팅 게임에서는 팀을 만드는 것이 특히 중요합니다. 이는 개별 플레이어의 기술 세트를 넘어서는 복잡하고 조정된 게임 플레이 전략을 수립하기 때문입니다.
샘플 레이저 태그 게임을 참조하여, 이 튜토리얼의 이 섹션에서는 플레이어를 팀으로 정렬하는 방법과 다음과 같은 스크립트 지침을 제공합니다:
- Teams 서비스의 기본 기능을 사용하여 플레이어를 녹색 팀 또는 분홍색 팀에 할당합니다.
- 화면 및 게임 내 팀 지표를 통해 플레이어가 아군과 적 팀원을 구별할 수 있도록 돕습니다.
- 팀원을 공격해도 플레이어에게 패널티를 주지 않는 관대한 게임 플레이를 가능하게 합니다.
이 섹션을 완료한 후, 플레이어가 중립 로비 또는 팀 스폰 존에 스폰하거나 리스폰할 수 있도록 하는 스크립트, 1인칭 포스 필드 비주얼을 사용자 정의하는 방법, 서버와 클라이언트 모두에서 클라이언트 상태를 처리하는 방법에 대해 배우게 됩니다.

팀 색상 할당
샘플 레이저 태그 게임은 Teams 서비스를 기반으로 두 팀을 만들기 위해 사용합니다. 이 서비스는 기본적으로 작동하는 팀 정렬 동작을 제공하기 때문입니다. 예를 들어, 추가 스크립트 작업 없이도 이 서비스는 다음과 같은 작업을 처리합니다:
- 플레이어를 각 팀에 고르게 정렬하고 균형을 맞춥니다.
- 리더보드에서 플레이어를 팀 아래에 그룹화합니다.
- 3D 공간에서 플레이어 이름을 해당 팀 색상으로 색칠합니다.
- 플레이어를 팀만 접근할 수 있는 별도의 스폰 위치에 스폰합니다.
이 기본 기능 덕분에 샘플은 Teams 서비스를 활성화한 후, 서로 다른 Team.Color 속성 값을 가진 두 개의 Team 객체를 사용하여 각 팀을 나타냅니다: 민트는 맵의 한쪽에 모인 팀을, 카네이션 핑크는 맵의 반대쪽에 모인 팀을 나타냅니다. 이 특정 색상은 서로 보완적이어서 잘 대비되며, 플레이어가 주변을 쉽게 스캔하고 건물 내에서 다른 플레이어와 방향을 잡는 데 유용합니다.




Team.Color 속성의 정확한 BrickColor 이름을 주목하는 것이 중요합니다. 게임은 이 이름을 사용하여 플레이어가 팀으로 정렬될 때 추적하고, 플레이어가 라운드 중 적 플레이어를 태그할 때 점수를 증가시키며, 사용자 정의 UI 요소를 업데이트합니다. 예를 들어, 라운드가 시작되면 ReplicatedStorage ⟩ HUDGuiSetup은 startSyncingTeamColor와 startSyncingTeamPoints를 요구하며, 이 두 가지 모두 Team.Color를 참조하여 각 팀에 대한 고유한 작업을 수행합니다.
startSyncingTeamColor는 Team.Color를 참조하여 플레이어의 팀 지표를 화면 왼쪽 하단에 올바른 색상과 아이콘으로 할당할 수 있도록 합니다.


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팀 지표 표시
플레이어가 팀에 정렬되면, 자신이 어떤 팀에 속해 있는지 빠르게 파악하고 아군과 적 팀원을 구별할 수 있어야 합니다. 이 능력은 1인칭 슈팅 게임의 게임 플레이에서 중요합니다. 플레이어는 전투 지역에서 빠른 전략적 결정을 내려야 하므로 태그당하지 않고 라운드를 잃지 않도록 해야 합니다.
플레이어의 성공을 위해 샘플 레이저 태그 게임은 화면과 3D 공간 모두에 여러 팀 지표를 제공합니다:
- 플레이어 지표 – 플레이어의 팀 색상과 아이콘을 표시하는 사용자 정의 화면 UI.
- 팀 지표 – 플레이어의 팀 색상을 표시하는 사용자 정의 게임 내 UI.
- 리더보드 지표 – 플레이어를 팀 색상 아래에 그룹화하는 기본 Teams 서비스 화면 UI.
- 이름 색칠 – 플레이어의 이름을 팀 색상으로 색칠하는 기본 Teams 서비스 게임 내 UI.




리더보드 지표나 이름 색칠은 이전 섹션에서 팀 색상을 할당하는 것 외에 추가 작업이 필요하지 않지만, 사용자 정의 UI 팀 지표는 지표를 표시하고 적 지표가 벽 뒤에 있을 때 이를 가리기 위해 더 많은 프로그래밍 작업이 필요합니다. 사용자 정의 UI 동작을 제어하는 스크립트와 각 UI 요소를 구현하는 방법에 대한 전체 설명은 UI 커리큘럼의 플레이어 지표와 팀 지표를 참조하세요.
아군 공격 비활성화
일부 1인칭 슈팅 게임은 아군을 공격한 플레이어에게 패널티를 주지만, 샘플 레이저 태그 게임은 아군 공격을 비활성화하여 더 관대한 게임 플레이를 허용합니다. 이 디자인 결정은 모든 사람이 팀 점수를 증가시키기만 하고 게임 사고로 인해 점수를 줄이지 않도록 합니다.
샘플이 이 기능을 구현하는 방법을 이해하려면 ServerScriptService ⟩ LaserBlastHandler ⟩ processTaggedPlayers ⟩ onPlayerTagged가 태그된 플레이어에게 피해를 주는 방법을 살펴보세요. 서버가 플레이어의 발사체와 다른 플레이어 간의 충돌을 감지하면, onPlayerTagged 함수를 호출하여 어떤 플레이어가 발사체를 발사했는지, 어떤 플레이어가 발사체에 맞았는지, 그리고 발사기 유형에 따라 플레이어의 건강에서 얼마나 많은 피해를 제거해야 하는지를 이해합니다.
local function onPlayerTagged(playerBlasted: Player, playerTagged: Player, damageAmount: number)건강을 감소시키기 전에, 스크립트는 먼저 태그된 플레이어가 발사체를 발사한 플레이어와 같은 팀인지 확인합니다. 같은 팀이라면, 스크립트는 발사체 데이터를 완전히 무시합니다.
local character = playerTagged.Character
local isFriendly = playerBlasted.Team == playerTagged.Team
-- 아군 공격 비활성화
if isFriendly then
return
end그러나 태그된 플레이어가 적 팀에 속해 있다면, 플레이어는 발사기 유형에 따라 적절한 양의 피해를 입습니다. 또한, 플레이어가 태그당할 만큼 충분한 피해를 입으면, 스크립트는 발사체를 발사한 플레이어의 팀에 점수를 부여합니다. 샘플이 점수를 추적하는 방법에 대한 자세한 내용은 튜토리얼 후반부의 라운드 추가를 참조하세요.
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 onPlayerTagged지금 게임을 테스트하면 모든 플레이어가 팀에 관계없이 경기장의 반대편에 있는 스폰 존에서 무작위로 스폰되므로 각 팀이 서로 바로 옆에 스폰됩니다.
이 문제를 해결하기 위해, 다음 섹션의 튜토리얼에서는 특정 스폰 위치로 팀 스폰을 제한하는 사용자 정의 논리, 플레이어가 발사기를 선택한 후 스폰 영역을 떠날 때 클라이언트 상태를 처리하는 방법, 그리고 플레이어의 건강이 0에 도달했을 때 다시 스폰 존이나 로비 지역으로 리스폰하는 방법에 대해 배웁니다.