创建团队

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

创建团队 允许您将玩家分成组来完成一个共同的目标,例如获得最多分数或穿过终点线。对于第一人称射击游戏,创建团队是特别重要的,因为它将复杂、协调的游戏战略设置在任何个个人玩家的技能集之外。

使用示例激光标记体验作为参考,本教程的这个部分教你如何将玩家分组,包括脚本指南:

  • 使用 Teams 服务的默认功能来分配玩家到绿色或粉色团队。
  • 帮助玩家通过屏幕和体验团队成员指示区分他们的盟友和敌人队员。
  • 启用不会惩罚玩家因爆炸队友而导致的游戏玩法。

完成此部分后,您将了解允许玩家在中立大厅或团队生成区域重生或重生的脚本、自定义第一人称视觉力场视图和处理客户端状态,从服务器和客户端处处理客户状态。

分配团队颜色

样本激光标签体验使用 Teams 服务作为创建两个团队的基础,因为服务提供内置团队排序行为,可以在箱子外的任何时候工作。例如:

  • 将玩家按照一致的顺序排列在每个团队。
  • 在排行榜上将玩家分组到他们的队伍。
  • 在 3D 空间中为玩家命名,以对应他们的团队颜色。
  • 生成玩家到与只有他们的团队才能访1) 使用权 2)通行证 3)访问权限的区域。

因为此默认功能,该示例启用了 Teams 服务,然后使用两个不同的 Team 属性值代表每个团队:Team.Color 为那

重要的是,请注意 BrickColor 属性的正确名称,因为体验在多个脚本中使用此名称来跟�

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 元素的脚本。有关有关脚本的

禁用友好的火焰

虽然一些第一人称射击体验会惩罚玩家,但样本激光标签体验允许通过禁用友军射触发来获得更宽松的游戏玩法,这使得挑战性的团队得分增加而不会因游戏中的意外而减少。 此设计决定允许每个人只增加他们的团队分数,而不是通过游戏中的意外而减少。

要了解样本如何实现此功能,请检查 how ServerScriptService > LaserBlastHandler > processTaggedPlayers > 1> onPlayerTagged1> 处理伤害给标记玩家。当服务器检测到玩家的


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

如果您现在测试体验,所有玩家都将随机生成在各个端的两个不同的生成区域,无论他们属于哪个团队,这意味着每个团队都将在相邻的地方生成。

为了解决这个问题,教程的下一部分教你 about the custom logic behind restrictions on team spawning to certain spawn locations, 处理客户端状态, 当玩家离开生成区域选择他们的冲击器后,重生玩家回到他们的生成区或大厅区域,当他们的生命值达到零。