创建玩家危险

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


危险物体会在玩家触碰它们时降低玩家的生命值。作为一个简单的起点,本教程的这一部分教你如何在体验中的水平上创建一个大型隐形部件,以便坠落到危险中会将玩家的生命值降为零并重生回体验的开始。

创建基本水灾

要创建基本水灾:

  1. 探索器 窗口中,添加一个新文件夹到 世界 文件夹,然后重命名为 危险 。确保名称拼写正确,否则代码无法运行。

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

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

    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. 服务器脚本服务 中创建一个 脚本 ,然后将其重命名为 危险服务

  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)
-- WaitForChild 将停止玩家循环,因此下面应在单独线程中执行
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 在玩家死亡时发射,将硬币数量设置为 0 .task.spawn() 创建一个独立线程来处理这一问题,因此其他玩家生命周期方面的执行可以继续。
  • Player.PlayerRemoved 在玩家离开体验时触发,用于清理玩家状态。
  • 该代码包含玩家可能在 Players.PlayerAdded 事件执行之前收集硬币的潜在问题,然后将他们的硬币数重置为零。为了解决这个问题,请考虑解决方案,例如代码计划或在初始化完成之前冻结玩家角色。然而,这些解决方案涉及更复杂的脚本概念,超出了本教程的范围。

游戏测试

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

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

    Play button highlighted in Studio's playtesting options.
  2. 移动你的角色收集一些硬币,然后跳入水中。如果你的脚本正常运行,你的角色死亡,排行榜上的硬币数量重置为 0