創建隊伍

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

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

範例激光標籤遊戲 為參考,本教程的這一部分教你如何將玩家分成隊伍,包括腳本指導:

  • 使用 Teams 服務的默認功能將玩家分配到綠隊或粉隊。
  • 幫助玩家通過螢幕和遊戲內隊伍指示器區分盟友和敵隊成員。
  • 啟用寬容的遊戲玩法,不會因為攻擊隊友而懲罰玩家。

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

指派隊伍顏色

範例激光標籤遊戲使用 Teams 服務作為創建兩個隊伍的基礎,因為該服務提供了內建的隊伍排序行為,廣泛地即插即用。例如,無需額外的腳本工作,該服務處理以下操作:

  • 將玩家均勻地排序和平衡到每個隊伍中。
  • 在排行榜上將玩家按其隊伍分組。
  • 在 3D 空間中將玩家名稱著色為其對應的隊伍顏色。
  • 將玩家生成到只有他們的隊伍可以訪問的不同生成位置。

由於這一默認功能,範例啟用了 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

顯示隊伍指示器

一旦玩家被分配到隊伍,他們需要能夠快速辨別自己屬於哪個隊伍,並區分盟友和敵隊成員。這一能力很重要,因為第一人稱射擊遊戲的玩法要求玩家在戰鬥區域內快速做出戰略決策,以免被標記出局並失去回合。

為了讓玩家成功,範例激光標籤遊戲提供了多個螢幕和 3D 空間中的隊伍指示器:

  • 玩家指示器 – 自定義螢幕 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 是我們在美國及其他國家地區的部分註冊與未註冊商標。