创建玩家危险

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


危险对象会增加玩家触摸它们时的生命值。作为简单的起始点,这部分教程的教程向你教会如何在体验中创建一个大型隐形部分,以便落入危险可以让玩家的生命值变为零并重生,从而回到体验的开始。

创建一个基础水害

要创建基础水害危险:

  1. Explorer 窗口中,将一个新文件夹添加到 世界 文件夹,然后重命名它为 危险 。确保名称正确地拼写为正确,否则代码将无法工作。

  2. 危险 文件夹中,插入一个 方块 部分并将其重命名为 危险

    Studio's Explorer window with the Hazard block Part highlighted under the Hazards folder.
  3. 将零件移动和缩放以覆盖岛屿和平台周围的水线。例如,示例 岛屿跳跃 - 脚本 体验设置 大小825, 1, 576 和 1> CFrame.Position1> 为 4> 174, -6.5, 384>。

    A far out view of all of the cylinder sea stacks and the island. A large block part covers the water where a player could land if they fell from a sea stack.
  4. 选择零件,然后在 属性 窗口中,配置以下属性以隐藏危险,玩家可以通过它:

    • 将透明度设置为1。这使危险隐形,因此实际水域显示为危险。
    • 禁用 可以碰撞 . 这告诉引擎其他部分可以穿过危险,意味着玩家可以穿过危险。
    • 启用 锚定 。这使引擎永远不会因任何物理相关模拟而改变危险的位置,从而保证玩家可以触摸危险而不会影响其位置。
  5. 在 ServerScriptService 中创建一个 脚本,然后将其重命名为 危险服务。

  6. 将以下代码替换为默认代验证码:


    local Players = game:GetService("Players")
    local Workspace = game:GetService("Workspace")
    local hazardsFolder = Workspace.World.Hazards
    local hazards = hazardsFolder:GetChildren()
    local function onHazardTouched(otherPart)
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = 0
    end
    end
    end
    for _, hazard in hazards do
    hazard.Touched:Connect(onHazardTouched)
    end

    危险服务 有很多与 金币服务 的相似性。然而,而不是收集硬币,玩家的健康设置为 0 当他们触摸危险时。

    随意修改、添加或移除危险对象在您的体验中创建独特的障碍。 只要它们包含在 危险 文件夹中,代码循环将事件处理器连接到您的所有危险。

连接到玩家生命周期

玩家生命周期代表玩家在您的体验中互动时发生的事件,例如加入、离开或重生。您需要将处理器连接到这些事件,以便为每个主要生命周期事件执行合适的逻辑。在 CoinService 脚本中,复制并粘贴以下代码在脚本底部:


local function onPlayerAdded(player)
-- 将玩家币重置为 0
updatePlayerCoins(player, function(_)
return 0
end)
player.CharacterAdded:Connect(function(character)
-- 等待孩子将停止玩家循环,因此以下应在单独的线程中进行
task.spawn(function()
-- 当玩家死亡时
character:WaitForChild("Humanoid").Died:Connect(function()
-- 将玩家币重置为 0
updatePlayerCoins(player, function(_)
return 0
end)
end)
end)
end)
end
-- 在连接到 PlayerAdded 事件之前初始化任何玩家
for _, player in Players:GetPlayers() do
onPlayerAdded(player)
end
local function onPlayerRemoved(player)
updatePlayerCoins(player, function(_)
return nil
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoved)

该代码定义了重置硬币计数器在适当的生命周期事件中的函数:

  • Player.PlayerAdded 发生时玩家加入体验,并将硬币数量设置为 0
  • Player.CharacterAdded 发生玩家角色模型添加到世界时。它发生在 PlayerAdded 和玩家重生时。
  • Humanoid.Died 发生玩家死亡时,并将硬币数设置为 0task.spawn() 创建了一个单独的线程来处理这个,因此其他玩家生命周期的其他部分可以正常执行。
  • Player.PlayerRemoved 触发时玩家离开体验以清理玩家状态。
  • 此代码包含潜在问题,在玩家收集硬币之前,Players.PlayerAdded 事件执行,然后将其硬币数量重置为零。为了解决此问题,请考虑使用代码排程或冻结玩家角色直到初始化完成的解决方案。然而,这些解决方案涉及更复杂的脚本概念,这些概念超出本次教程的范围。

游戏测试

是时候看看玩家的危险是否如预期般工作。当你触摸水时,你的角色应该死亡并且失去硬币。要测试你的游戏:

  1. 在菜单栏中,单击 播放 按钮。Studio进入播放测试模式。

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. 移动您的角色收集一些硬币,然后跳入水中。如果您的脚本正常运行,您的角色将死亡,并且排行榜上的硬币数量将重置为 0