創建隊伍

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

創建隊伍 讓你能夠將玩家排序到競爭組織中,以完成共同目標,例如獲得最多積分或在其他敵隊成員之前越過終點線。對於第一人稱射擊遊戲來說,創建隊伍特別重要,因為它建立了複雜的協調遊玩策略,超越任何個別玩家的技能範疇。

範例雷射標籤體驗 作为参考,本教程的这一部分教您如何将玩家分成队伍,包括有关脚本的指导:

  • 使用 Teams 服務的預設功能將玩家分配到綠隊或粉隊。
  • 幫助玩家區分他們的盟友和敵隊成員,通過螢幕和體驗內的隊伍指示器。
  • 實現原諒性的遊戲玩法,不會因為擊中隊友而懲罰玩家。

完成本部分後,您將了解允許玩家重生或重新生成到中立大廳或隊伍生成區域的腳本,定制第一人稱力場視覺效果,並從伺服器和客戶端處理客戶端狀態。

分配隊伍顏色

範例雷射標籤體驗使用 Teams 服務作為創建兩支隊伍的基礎,因為該服務提供了內建的隊伍排序行為,基本上可以即刻使用。例如,無需額外的腳本工作,該服務即可處理以下操作:

  • 將玩家均勻排序和平衡到每支隊伍。
  • 在排行榜上將玩家按其隊伍分組。
  • 在三維空間中將玩家名稱著色為其對應的隊伍顏色。
  • 將玩家生成到只有其隊伍可以訪問的獨特生成位置。

因為這個預設功能,範例啟用了 Teams 服務,然後使用兩個不同的 Team 對象,其中不同的 Team.Color 屬性值來表示每支隊伍:薄荷綠代表在地圖一側集合的隊伍,康乃馨粉代表在地圖對側集合的隊伍。這些特定的顏色是有用的,因為它們是互補的,意味著它們彼此對比良好,並使玩家能夠輕鬆掃描周圍環境並在建築物和其他玩家之間導航。

請注意 Team.Color 屬性的確切 BrickColor 名稱,因為該體驗在許多腳本中使用此名稱來跟踪玩家在排序成隊伍時的狀態,增量計分當玩家在回合中標記出敵隊玩家,並更新自定義UI元素。例如,當回合開始時,ReplicatedStorageHUDGuiSetup 需要 startSyncingTeamColorstartSyncingTeamPoints,這兩者都參考 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

顯示隊伍指示器

一旦玩家被排序到隊伍中,他們需要能夠快速識別自己所屬的隊伍,並區分盟友和敵隊成員。這種能力很重要,因為第一人稱射擊遊戲的遊玩需要玩家在戰鬥區域中快速做出生死攸關的決策,以避免被標記出局並失去回合。

為了讓玩家成功,範例雷射標籤體驗提供了多個隊伍指示器,無論是在螢幕上還是在三維空間中:

  • 玩家指示器 - 顯示玩家隊伍顏色和圖標的自定義螢幕UI。
  • 隊伍指示器 - 顯示玩家隊伍顏色的自定義體驗內UI。
  • 排行榜指示器 - 預設隊伍服務的螢幕UI,將玩家在其隊伍顏色下分組。
  • 名稱著色 - 預設隊伍服務的體驗內UI,將玩家頭頂的名稱著色為其隊伍顏色。
螢幕指示器
玩家指示器
排行榜指示器
體驗內指示器
隊伍指示器
名稱著色

您不需要為排行榜指示器或名稱著色進行任何額外的工作,只需從本教程的前一部分分配隊伍顏色,但自定義UI隊伍指示器需要更多的編程工作,既要顯示指示器,也要在它們在牆後時遮擋敵隊指示器。要全面了解控制自定義UI行為的腳本,以及如何實現每個UI元素,請參見 UI 課程中的 玩家指示器隊伍指示器

禁用友軍傷害

雖然某些第一人稱射擊體驗會懲罰擊中自己隊友的玩家,但範例雷射標籤體驗通過禁用友軍傷害來允許更寬容的遊戲玩法。這一設計決策允許每個人只增加其隊伍分數,而不是因為遊戲事故而減少分數。

要了解範例如何實現此功能,檢查 ServerScriptServiceLaserBlastHandlerprocessTaggedPlayersonPlayerTagged 如何處理對被標記玩家造成的傷害。當伺服器檢測到玩家的爆炸物與另一名玩家之間的碰撞時,會調用 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

如果您此刻測試該體驗,所有玩家將隨機在競技場的兩個生成區之一生成,而無論他們屬於哪個隊伍,這意味著每支隊伍將在對方旁邊生成。

為了解決此問題,本教程的下一部分將教您如何自定義邏輯以限制隊伍的生成到特定生成位置,處理玩家在選擇爆炸器後離開生成區的客戶端狀態,並在玩家的健康值降到零時將他們重新生成回生成區或大廳區域。

©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。