建立玩家危險

*此內容是使用 AI(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。這會使危險隱形,因此實際的水看起來是危險。
    • 停用 CanCollide 。這會告訴引擎其他零件可以無中斷地通過危險,意味著玩家可以通過危險掉落。
    • 啟用 錨定 。這會告訴引擎永遠不要因為任何物理相關模擬而改變危險的位置,這意味著玩家可以觸碰危險而不會影響其位置。
  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 時,他們會有自己的生命值設置為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
-- 在連接到「新增玩家」事件之前初始化任何添加的玩家
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 進入播放測試模式。

    Play button highlighted in Studio's playtesting options.
  2. 將你的角色移動到收集一些硬幣,然後跳入水中。如果您的腳本正確運作,您的角色死亡,並將幣數重設為 0