现在,玩家可以从任何平台掉落而没有后果。此部分将引导您创建一个与游戏中的水面高度相同的大型不可见障碍物。当玩家掉入障碍物时,他们的健康值会降低到零,并在游戏开始时重新生成。
创建基本水障碍
创建基本水障碍在 Workspace > World 中,创建一个名为 Hazards 的新文件夹。在 Hazards 文件夹内,创建一个名为 Hazard 的方块部件,大小为 825, 1, 576,CFrame.Position 为 174, -6.5, 38,以使该部件覆盖岛屿和平台周围的水。将透明度设为 1,使得该部件不可见,实际的水看起来就是障碍,禁用 CanCollide 以便玩家能掉入水中,并启用 Anchored 以减少物理作用于其移动。
检测玩家何时接触障碍
障碍物不会执行任何操作,直到您编写一个监听 Touched 的脚本,并将玩家的健康值降低为零。
创建 HazardService在 ServerScriptService 中,创建一个名为 HazardService 的脚本,代码如下:```lualocal Players = game:GetService("Players")local Workspace = game:GetService("Workspace")local hazardsFolder = Workspace.World.Hazardslocal hazards = hazardsFolder:GetChildren()local function onHazardTouched(otherPart)local character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player thenlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = 0endendendfor _, hazard in hazards dohazard.Touched:Connect(onHazardTouched)end```
代码解释
HazardService 与 CoinService 有许多相似之处。然而,当玩家接触障碍物时,他们的 健康值会被设为 0,而不是收集硬币。
可以自由修改、添加或删除游戏中的障碍物,以创建独特的障碍。只要它们包含在 Hazards 文件夹中,代码循环会将事件处理程序连接到您所有的障碍物。
连接到玩家生命周期
玩家生命周期代表玩家在您的游戏中进行交互时发生的事件,例如加入、离开或重新生成。您需要将处理程序连接到这些事件,以便为每个主要生命周期事件执行逻辑。
将生命周期处理程序添加到 CoinService在 ServerScriptService 中,在现有 CoinService 脚本的底部附加以下代码(不要替换任何现有代码——在其后添加):```lualocal function onPlayerAdded(player)-- 重置玩家的硬币为 0updatePlayerCoins(player, function(_)return 0end)player.CharacterAdded:Connect(function(character)-- WaitForChild 会停止玩家循环,因此下面的内容应在单独线程中完成task.spawn(function()-- 当玩家死亡时character:WaitForChild("Humanoid").Died:Connect(function()-- 重置玩家的硬币为 0updatePlayerCoins(player, function(_)return 0end)end)end)end)end-- 初始化在连接到 PlayerAdded 事件前添加的玩家for _, player in Players:GetPlayers() doonPlayerAdded(player)endlocal function onPlayerRemoved(player)updatePlayerCoins(player, function(_)return nilend)endPlayers.PlayerAdded:Connect(onPlayerAdded)Players.PlayerRemoving:Connect(onPlayerRemoved)```
代码解释
该代码定义了在适当的生命周期事件期间重置硬币计数的函数:
- Players.PlayerAdded 在玩家加入游戏时触发,并将硬币计数设为 0。
- Player.CharacterAdded 在玩家的角色模型添加到世界时触发。它发生在 PlayerAdded 之后,且在玩家重新生成时。
- Player.PlayerRemoved 在玩家离开游戏时触发,以清理玩家状态。
- 此代码存在潜在问题,即玩家可能会在执行 Players.PlayerAdded 事件之前收集硬币,然后硬币计数被重置为零。为缓解此问题,可以考虑诸如代码调度或在初始化完成之前冻结玩家角色等解决方案。然而,这些解决方案涉及到更复杂的脚本概念,超出了本教程的范围。
游戏测试
从下拉菜单中选择 Test 并点击 Play。收集几个硬币,然后跳入水中。您的角色应该会死亡并在起始位置重新生成,硬币计数被重置为 0。