新增圓子 讓您結構遊戲以一個明確的開始和結束點來構造遊戲,讓玩家可以測量他們的進度,並有一個定期的機會獲得平等的遊戲場地。這是特別重要的團隊基礎遊戲玩法,因為它提供玩家可以根據在那個回合中誰在他們的隊伍中切換遊戲風格。
使用 示例雷射標籤體驗 作為參考,這個教學的第一部分教學您如何使用並自訂 Roblox 的內置功能來結構每個回合,包括指令碼指南:
- 開始回合的時候,重設個人和團隊的點數,然後重生玩家到他們的團隊重生區。
- 自訂每個玩家的螢幕頂部設定目標的變數。
- 追蹤玩家點數貢獻給他們的團隊得分。
- 在玩家的團隊獲勝或輸掉回合時,會觸發特定的 UI 屏幕。
- 在端口斷開玩家並在中立大廳中重新生成玩家。
完成此部分後,您將學會如何實現讓玩家滿意的衝擊行為。
開始循環
服務器指令服務 > 遊戲播放 > 回合 處理回合的逻辑,並且從 0>
評分
function Scoring.resetScores()
for _, player in Players:GetPlayers() do
player.leaderstats.Points.Value = 0
end
for _, team in Teams:GetTeams() do
team:SetAttribute(GuiAttribute.teamPoints, 0)
end
end
現在大家都在零點上開始時,
對於目前在大廳的玩家,startRoundLoopAsync() 將所有玩家當前在體驗中的玩家都傳送到 spawnPlayersInMap 功能在 ServerScriptService 內 > 1>Gameplay1> > 4>Rounds4> > 7>spawnPlayersInMap</
對於任何新玩家加入體驗後, startRoundLoopAsync() 會聽取 Players.PlayerAdded:Connect 事件,然後再次呼叫 spawnPlayersInMap 函數,以最小的玩家數量添加他們到隊
輪子
-- 在地圖上生成所有玩家
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- 在玩家加入時在地圖上生成新玩家
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)
設定目標
現在每個玩家都在競技場與他們的隊友,因此體驗需要提供指示,以便在回合中取得成功。 示例雷射標籤體驗會解決這個需求,提供清楚的提示在每個玩家的屏幕上,以便團隊取得勝利。
雖然您可以在UI課程中了解更多關於如何設置並顯示目標 UI零件的方法,但此部分專注於如何在回合開始時實現目標目標,並且從團隊需要完成回合的點數開始。
雖然在執行時的目標提示會告訴玩家他們需要得到三分才能獲勝,但如果您在 StarterGui > HUDGui 中檢查提示,您可以看到它包含一個可配置的 " %d" 為點數值。
「%d」是您可以隨時增加或減少的預設字串,以符合您自己的遊戲要求,並且更新 %d 變數在 TEAM_SCORE_LIMIT > TEAM_SCORE_LIMIT 。例如,如果您將此數值設為
團隊_分數_限制
local TEAM_SCORE_LIMIT = 200 -- 更新了線條,請務必還返回return TEAM_SCORE_LIMIT
此簡單的變更在執行時工作,因為回合開始時, ReplicatedStorage > HUDGuiSetup > SetObjective > 1> TEAM_SCORE_LIMIT1> 模組腳本,因此它可以交換預設字串在 UI 目標的 4> Class.TextLabel4> 對物件上。
團隊_分數_限制
local TEAM_SCORE_LIMIT = require(ReplicatedStorage.TEAM_SCORE_LIMIT)
local function setObjective(gui: ScreenGui)
local bodyTextLabel = gui.Objective.ObjectiveDisplay.Body.BodyTextLabel
bodyTextLabel.Text = bodyTextLabel.Text:format(TEAM_SCORE_LIMIT)
end
軌道點數
現在玩家有了回合的目標,體驗需要跟蹤每個團隊的點數直到他們達到目標。雖然 Teams 服務的預設行為會自動在每個玩家下方團化並總結每個玩家的貢獻,但存放和監控點數在不同位置是
為了確保這不會發生,並且每個對團隊目標的貢獻都能保持, ReplicatedStorage > HUDGuiSetup > StartSyncingTeamPoints 當它找到 TeamACounter 和 TeamBCount器 時,它會獲得他們的 teamColor 屬性,這與團隊生成區域相關:TeamACounter 顯示綠隊的點,而 TeamBCount 追蹤粉隊的點。
開始同步團隊點數
local function startSyncingTeamPoints(gui: ScreenGui)
for _, teamPointCounter in gui.Objective.TeamPointCounter:GetChildren() do
if not teamPointCounter:IsA("GuiObject") then
continue
end
local iconTeamColor = teamPointCounter:GetAttribute(GuiAttribute.teamColor)
模組腳本 then calls its getTeamFromTeamColor 函數 to validate that the TeamACount's mint 屬性 and the TeamBCount's teamColor 屬性 both match the corresponding 2>Class.Team.Color2>
開始同步團隊點數
local function getTeamFromTeamColor(teamColor: Color3): Team?
for _, team in Teams:GetTeams() do
if team.TeamColor == teamColor then
return team
end
end
return nil
end
當這發生時,startSyncingTeamPoints 將兩個團隊的「TextLabel」對象設置為相應的teamPoints值,並且繼續更新,直到玩家在另一個隊伍上標記另一名玩家出來為相應的2> teamPoints2>值。
開始同步團隊點數
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
team:GetAttributeChangedSignal(GuiAttribute.teamPoints):Connect(function()
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
這一節目前專注於如何在玩家的屏幕上追蹤點數,但很重要要檢查處理追蹤點數的邏輯,以便知道服務器是否達到目標目標並獲勝回合。如果您重新檢視 ServerScriptService > 遊戲玩法 > 評
評分
local teamScoreChangedBindable = Instance.new("BindableEvent")local Scoring = {teamScoreChanged = teamScoreChangedBindable.Event,}
然後呼叫 incrementScore 函數,這會執行以下操作:
- 在 Class.Teams 服務中,抓取玩家的團隊和目前的團隊點數值,然後加一個。
- 擷取玩家的個人分數在排行榜上,並且添加一個。
- 觸發玩家的團隊和他們的分數,以及之前提到的可綁定的事件。
此過程可以有效地保持客戶和伺服器之間的兩個玩家的個人分數和團隊分數。
評分
function Scoring.incrementScore(player: Player, amount: number)
local team = player.Team
assert(team, `Player {player.Name} must be on a team to score a point, but has no team`)
local teamPoints = team:GetAttribute(GuiAttribute.teamPoints)
teamPoints += amount
team:SetAttribute(GuiAttribute.teamPoints, teamPoints)
local leaderstat = player.leaderstats.Points
leaderstat.Value += amount
teamScoreChangedBindable:Fire(team, teamPoints)
end
顯示結果
隨著玩家標籤對彼此並為他們的團隊得分, ServerScriptService > 遊戲玩法 > 回合 檢查是否確認隊伍得分達到回合目標。如果他們的隊伍得分低於 <
但是,一旦團隊的分數達到 TEAM_SCORE_LIMIT 變量,指令碼會發生一個名為 roundWinnerRemote 的事件實例,其中玩家的名字和他們的團隊。
輪子
-- 檢查每次分數結束後是否有回合local team: Teamlocal score: number = 0while score < TEAM_SCORE_LIMIT doteam, score = Scoring.teamScoreChanged:Wait()end-- 顯示勝利的團隊for _, player in Players:GetPlayers() do-- 在回合結束時發送玩家在哪個隊伍上-- 因為玩家的隊伍即將被移除,所以客戶-- 無法檢查自己的團隊roundWinnerRemote:FireClient(player, team, player.Team)end
每個客戶端上的 ReplicatedStorage > RoundResultsGuiSetup 腳本聽到這個 roundWinnerRemote 事件實例,以便它可以:
- 顯示一個獨特的 StarterGui > RoundResultsGui 用戶界面屏幕,宣佈回合的結果和玩家是否在勝利團隊伍上。
- 播放勝利或擊敗音頻。
舉例來說,如果玩家在得分勝利點的隊伍上,他們在回合結果的形式為 UI 顯示勝利文字,並且播放一個快樂的聲音,那麼在回合結束時會有多個形式的回饋。 與此相反,如果玩家不在得分勝利點上,他們在回合結束時會有一個 UI 顯示敗北文字,並且播放一個帶有惡意的聲音
RoundResultsGui設定
local function onRoundWinner(winner: Team, localTeam: Team?)
local victoryDefeatText = "Round ended!"
if localTeam then
-- 如果我們的隊伍贏了,我們會顯示勝利!否則顯示敗北...
local isVictory = winner == localTeam
if isVictory then
victorySound:Play()
victoryDefeatText = VICTORY_TEXT
else
defeatSound:Play()
victoryDefeatText = DEFEAT_TEXT
end
end
重設團隊
同時檢查 ServerScriptService > 遊戲體驗 > 回合 ,以確認團隊達到回合目標,並為每個玩家設置適當的 UI 顯示,這也是啟動適當 UI 顯示的重要 UI 元素。這啟動了過程的正式結束,並重設兩個團隊。
使用相同的論理在 設定生成位置 、 輪次 然後設置 中立 的生成位置的 1> 4>Class.SpawnLocation.Neutral|Neutral4> 屬性為 7> 真7> 玩家可以在那裡生成,無論他們是否
輪子
-- 將所有人送到大廳playerAddedConnection:Disconnect()neutralSpawn.Neutral = truespawnPlayersInLobby(Players:GetPlayers())
在等待十秒後為中場休息, Rounds 服務器脚本然後重設每個人的分數並將他們重新排列成新的團隊。樣本重複這個循環回合過程直到沒有任何玩家在服務伺服器中。
現在玩家可以在地圖上與自己的團隊一起重生,並且玩完整的回合,下一個部分教您關於每個噴射器的行為背後的指令碼。