添加回合

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

添加回合 允许您结构游戏玩法以便于清晰地开始和结束,便于玩家评估他们的进度并有平等的机会在不同回合中玩平等的机会。 这特别重要于团队游戏中,因为它提供玩家在该回合中的团队中切换他们的游戏风格的机会。

使用示例激光标记体验作为参考,本教程的这个部分教你如何使用和自定义 Roblox 的内置功能来结构每个回合,包括脚本指南:

  • 通过重置个人和团队点击开始一个回合,然后生成玩家到他们的团队生成区域。
  • 自定义设置在每个玩家屏幕的顶部的目标变量。
  • 追踪玩家对他们的团队得分的贡献。
  • 根据玩家的团队是否赢得或失去回合,触发独特的 UI 屏幕。
  • 通过解开玩家的连接并在中立大厅中生成来结束一轮。

完成此部分后,您将学会如何实现对玩家都准确又令人满意的冲击波行为。

开始循环

服务器脚本服务 > 游戏玩法 > 回合 手处理回合的大部分逻辑,并且从调用 0>startRoundLoopAsync()

评分

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>游戏玩法1> > 4>Rounds4> > 7>spawnPlayersInMap7> 到排序并平

对于任何新玩家加入体验后,大厅组被分配为团队后,startRoundLoopAsync() 列出 Players.PlayerAdded:Connect 事件,然后调用 spawnPlayersInMap 函教程将他们添加到团队中最小的


-- 在地图上生成所有玩家
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- 在他们加入时在地图上生成新玩家
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)

设置目标

现在每个玩家都在竞技场与他们的队友,体验需要提供指示,在回合内获胜是什么意思的说明。 样本激光标记体验通过提供清晰的提示在每个玩家的屏幕上提供一个目标提示来满足此要求。

虽然您可以了解更多关于在 UI 教程中配置和显示 目标界面 组件的方法,但本部分的目的是侧重于如何在回合开始时实现目标目标,并且从如何设置每个团队需要完成回合开始始于的积分开始。

尽管在运行时目标提示告诉玩家需要获得三分才能获胜,但如果您在 StarterGui > HUDGui 中查看该提示,您可以看到它其实包含一个可配置的“%d”配置值为点数。

“ %d ”是一个你可以随时增加或减少的替补字符串,以满足你自己的游戏要求,通过更新 TEAM_SCORE_LIMIT ”变量在 ReplicatedStorage > 1> TEAM_SCORE_LIMIT1> 。例如,如果你将此数值设置为过高的 4>

团队得分限制

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 存储所有点数在

当它找到 TeamACountTeamBCount 时,它获得其 teamColor 属性,与团队生成区域相关:TeamACCount 显示绿队的点,TeamBCCount 追踪粉队的点。

开始同步团队积分

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)

模块脚本然后调用其 getTeamFromTeamColor 函数来验证团队帐户的 mint 属性和团队帐户的 teamColor 属性,这两个属性都与相应的 1> Class.Team.Color1> 属性底

开始同步团队积分

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 将 both team counters' TextLabel 对象设置为相应的 teamPoints 值,并且继续更新它们,每当玩家在标记另一名团队家出局时。

开始同步团队积分

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 函数,该函数执行以下操作:

  • Team 对象上的 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

显示结果

当玩家标记互为其他队友并为其团队伍得分时, 服务器脚本服务 > 游戏玩法 > 回合 检查是否检查到队伍得分达到回合目标。 如果他们的队伍得分低于 1> TEAM_SCORE

但是,一旦团队的得分达到 TEAM_SCORE_LIMIT 变量,脚本将触发一个 roundWinnerRemote 事件实例,其中玩家的名称和他们的团队。


-- 检查每个得分后是否完成回合
local team: Team
local score: number = 0
while score < TEAM_SCORE_LIMIT do
team, 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 屏幕,显示败场文本,以及一个播放恶劣声音的音频。

胜利反馈
击败反馈
回合结果设置

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

重置团队

同时,当 服务器脚本服务 > 游戏玩法 > 回合 验证一个团队达成回合目标,并为每个玩家触发适当的 UI 显示,它还将所有玩家从竞技场传送到大厅,因为它启动了端正式结束回合的过程,并重置两个队伍。这启动了过程的正式结束回合和重置两个队伍。

使用相同的逻辑在 配置生成位置回合 然后设置 中立 生成地点置的 1> Class.SpawnLocation.Neutral|Neutral1> 属性到 4>真4> 玩家可以在那里生成无论他们的团队状态。这意味着大厅成


-- 将所有人发送到大厅
playerAddedConnection:Disconnect()
neutralSpawn.Neutral = true
spawnPlayersInLobby(Players:GetPlayers())

在等待十秒钟的中场休息后, 回合脚本 服务器脚本然后重置每个人的分数并将他们分配到新的团队。样本再次重复这个循环过程直到服务器中没有任何玩家。

现在玩家可以在地图上与自己的团队一起生成,并且完整游戏一回合,下一节教你关于每个冲击波的脚本背后的脚本。