Tạo đội cho phép bạn phân loại người chơi thành các nhóm để cạnh tranh nhằm hoàn thành một mục tiêu chung, chẳng hạn như ghi điểm nhiều nhất hoặc vượt qua vạch đích trước các thành viên đội kẻ thù khác. Đối với một trò chơi bắn súng góc nhìn thứ nhất, việc tạo đội đặc biệt quan trọng vì nó thiết lập những chiến lược gameplay phức tạp và phối hợp vượt ra ngoài khả năng của mỗi người chơi.
Sử dụng trải nghiệm laser tag mẫu làm tham chiếu, phần này của hướng dẫn sẽ dạy bạn cách phân loại người chơi thành các đội, bao gồm hướng dẫn lập trình về:
- Sử dụng chức năng mặc định của dịch vụ Teams để phân bổ người chơi vào đội xanh hoặc hồng.
- Giúp người chơi phân biệt giữa đồng đội và kẻ thù thông qua các chỉ báo đội trên màn hình và trong trải nghiệm.
- Cho phép gameplay khoan dung mà không phạt người chơi vì bắn nhầm đồng đội.
Sau khi bạn hoàn thành phần này, bạn sẽ tìm hiểu về các kịch bản cho phép người chơi spawn hoặc respawn vào một sảnh trung lập hoặc khu vực spawn đội, tùy chỉnh hình ảnh lực trường góc nhìn thứ nhất, và xử lý trạng thái client từ cả server và client.

Gán màu đội
Trải nghiệm laser tag mẫu sử dụng dịch vụ Teams như một cơ sở để tạo ra hai đội vì dịch vụ này cung cấp hành vi phân loại đội tích hợp sẵn, hoạt động tốt ngay lập tức. Ví dụ, không cần bất kỳ nỗ lực lập trình bổ sung nào, dịch vụ này xử lý các hành động như:
- Phân loại và cân bằng người chơi đều vào mỗi đội.
- Nhóm người chơi theo đội của họ trên bảng xếp hạng.
- Tô màu tên người chơi trong không gian 3D theo màu đội tương ứng của họ.
- Phân bổ người chơi đến các vị trí spawn riêng biệt mà chỉ đội của họ có thể truy cập.
Do tính năng mặc định này, mẫu sẽ bật dịch vụ Teams, sau đó sử dụng hai đối tượng Team riêng biệt với các giá trị thuộc tính Team.Color khác nhau để đại diện cho mỗi đội: mint cho đội tập hợp ở một bên bản đồ và carnation pink cho đội tập hợp ở phía đối diện của bản đồ. Những màu sắc cụ thể này rất hữu ích vì chúng bổ sung cho nhau, có nghĩa là chúng tương phản tốt, và cho phép người chơi dễ dàng quét xung quanh và định hướng trong môi trường và với nhau.




Điều quan trọng là lưu ý tên chính xác BrickColor cho thuộc tính Team.Color vì trải nghiệm này sử dụng tên này trong nhiều kịch bản trong trải nghiệm để theo dõi người chơi khi họ phân loại thành các đội, tăng điểm khi người chơi đánh ra kẻ thù trong một vòng, và cập nhật các yếu tố giao diện người dùng tùy chỉnh. Ví dụ, khi một vòng bắt đầu, ReplicatedStorage ⟩ HUDGuiSetup yêu cầu startSyncingTeamColor, và startSyncingTeamPoints mà cả hai đều tham chiếu đến Team.Color để thực hiện các hành động độc đáo cho mỗi đội.
startSyncingTeamColor tham chiếu đến Team.Color để nó có thể gán màu sắc và biểu tượng đúng cho chỉ báo đội của người chơi ở góc dưới bên trái màn hình của họ.


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
Hiển thị chỉ báo đội
Khi một người chơi được phân loại vào một đội, họ cần có khả năng nhanh chóng phân tích đội của mình, và phân biệt giữa đồng đội và các thành viên đội kẻ thù. Khả năng này rất quan trọng vì gameplay của một trải nghiệm bắn súng góc nhìn thứ nhất đòi hỏi người chơi phải đưa ra những quyết định chiến lược nhanh chóng trong khi họ ở trong các khu vực chiến đấu để không bị đánh ra và thua vòng.
Để chuẩn bị cho người chơi thành công, trải nghiệm laser tag mẫu cung cấp nhiều chỉ báo đội cả trên màn hình và trong không gian 3D:
- Chỉ báo Người chơi – Giao diện UI tùy chỉnh trên màn hình hiển thị màu sắc đội và biểu tượng của người chơi.
- Chỉ báo Đội – Giao diện UI tùy chỉnh trong trải nghiệm hiển thị màu sắc đội của người chơi.
- Chỉ báo Bảng xếp hạng – Giao diện UI mặc định của dịch vụ Teams hiển thị người chơi dưới màu sắc đội của họ.
- Ghi tâm tên – Giao diện UI mặc định của dịch vụ Teams hiển thị tên người chơi phía trên đầu họ với màu sắc đội của họ.




Bạn không cần thực hiện thêm bất kỳ công việc nào cho Chỉ báo Bảng xếp hạng hoặc Ghi tâm tên ngoài việc gán màu sắc đội từ phần trước của hướng dẫn, nhưng các chỉ báo đội UI tùy chỉnh yêu cầu nhiều nỗ lực lập trình hơn để hiển thị các chỉ báo và che khuất các chỉ báo kẻ thù khi chúng ở phía sau tường. Để có giải thích đầy đủ về các kịch bản điều khiển hành vi UI tùy chỉnh, cũng như cách thực hiện từng yếu tố UI, hãy xem Chỉ báo Người chơi và Chỉ báo Đội từ UI Curriculum.
Tắt chiến tranh giữa bạn bè
Trong khi một số trải nghiệm bắn súng góc nhìn thứ nhất phạt người chơi vì bắn đồng đội, trải nghiệm laser tag mẫu cho phép gameplay khoan dung hơn bằng cách không cho phép tấn công đồng đội. Quyết định thiết kế này cho phép mọi người chỉ tăng điểm cho đội của họ, không giảm đi do các tình huống tai nạn trong gameplay.
Để hiểu cách mẫu thực hiện chức năng này, hãy kiểm tra cách mà ServerScriptService ⟩ LaserBlastHandler ⟩ processTaggedPlayers ⟩ onPlayerTagged xử lý việc gây sát thương cho người chơi bị đánh dấu. Khi server phát hiện một va chạm giữa vụ nổ của một người chơi và một người chơi khác, nó gọi hàm onPlayerTagged để hiểu được người chơi nào đã bắn vụ nổ, người chơi nào bị bắn trúng, và số lượng sát thương mà nó nên giảm bớt khỏi sức khỏe của người chơi theo loại súng.
local function onPlayerTagged(playerBlasted: Player, playerTagged: Player, damageAmount: number)
Trước khi giảm sức khỏe, kịch bản đầu tiên xác minh xem người chơi bị đánh dấu có cùng đội với người chơi đã phát động vụ nổ không. Nếu họ trong cùng một đội, kịch bản sẽ bỏ qua hoàn toàn dữ liệu vụ nổ.
local character = playerTagged.Characterlocal isFriendly = playerBlasted.Team == playerTagged.Team-- Tắt chiến tranh giữa bạn bèif isFriendly thenreturnend
Tuy nhiên, nếu người chơi bị đánh dấu thuộc đội kẻ thù, người chơi sẽ chịu số lượng sát thương thích hợp tùy vào loại súng. Thêm vào đó, nếu người chơi nhận đủ sát thương để bị đánh ra, kịch bản sẽ thưởng một điểm cho đội của người chơi đã phát động vụ nổ. Để biết thêm thông tin về cách mẫu theo dõi điểm số, hãy xem Thêm vòng ở phần sau của hướng dẫn.
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
Nếu bạn thử nghiệm ngay bây giờ, tất cả người chơi sẽ ngẫu nhiên spawn tại một trong hai khu vực spawn ở hai đầu đối diện của sân chơi mà không cần quan tâm đến đội của họ, có nghĩa là mỗi đội sẽ spawn ngay cạnh nhau.
Để giải quyết vấn đề này, phần tiếp theo của hướng dẫn sẽ dạy bạn về logic tùy chỉnh đằng sau việc hạn chế spawn đội đến các vị trí spawn nhất định, xử lý trạng thái client khi người chơi rời khỏi khu vực spawn sau khi chọn súng của họ, và respawn người chơi trở lại khu vực spawn hoặc sảnh của họ khi sức khỏe của họ đạt mức không.