創建玩家危險物

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡


危險物體在玩家接觸時會減少健康。作為一個簡單的起點,本教程的這部分教你如何在你的體驗中創建一個與水平面相同的隱形大型部分,這樣掉入這個危險物中會使玩家的健康變為零並將他們重生回體驗的起始點。

創建基本水危險

要創建基本的水危險:

  1. Explorer 窗口中,將一個新文件夾添加到 World 文件夾中,然後將其重命名為 Hazards。 確保名稱拼寫正確且大小寫正確,否則代碼將無法運行。

  2. Hazards 文件夾中,插入一個 block 部件並將其重命名為 Hazard

    Studio的Explorer窗口,Hazard塊部分在Hazards文件夾下突出顯示。
  3. 移動和縮放該部件以覆蓋島嶼和平台周圍的水線。例如,示例 Island Jump - Scripting 體驗將 Size 設置為 825, 1, 576 並將 CFrame.Position 設置為 174, -6.5, 38

    遠觀所有圓柱形海堆和島嶼的景象。大型塊狀部件覆蓋水面,玩家如果從海堆掉落可以著陸的地方。
  4. 選擇該部件,然後在 Properties 窗口中,配置以下屬性,以便使危險物隱形,並且玩家可以直接穿過它:

    • Transparency 設置為 1。這樣使得危險物隱形,這樣實際水面看起來就是危險物。
    • 禁用 CanCollide。這告訴引擎其他部件可以不受阻礙地穿過這個危險物,意味著玩家可以掉進這個危險物中。
    • 啟用 Anchored。這告訴引擎永遠不要因為任何與物理相關的模擬而改變危險物的位置,這意味著玩家可以接觸到危險物而不會影響其位置。
  5. ServerScriptService 中創建一個 Script,然後將其重命名為 HazardService

  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

    HazardServiceCoinService 有許多相似之處。然而,玩家在觸碰危險物時會使其 健康設置為 0,而不是收集硬幣。

    隨意修改、添加或刪除你的體驗中的危險物,以創造獨特的障礙。只要它們包含在 Hazards 文件夾中,代碼循環就會將事件處理程序連接到你的所有危險物上。

連接到玩家生命週期

玩家生命週期代表玩家在你的體驗中互動時發生的事件,例如加入、離開或重生。你需要連接處理程序到這些事件,以便為每個主要生命週期事件正確執行邏輯。在 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)

該代碼定義了在適當的生命週期事件期間重置硬幣數的函數:

  • Players.PlayerAdded 在玩家加入體驗時觸發,並將硬幣數設置為 0
  • Player.CharacterAdded 在玩家的角色模型被添加到世界中時觸發。它在 PlayerAdded 之後和每當玩家重生時發生。
  • Humanoid.Died 在玩家死亡時觸發,並將硬幣數設置為 0task.spawn() 為處理這個創建了一個單獨的線程,以便玩家生命週期的其他方面可以執行。
  • Player.PlayerRemoved 在玩家離開體驗時觸發,以清理玩家狀態。
  • 此代碼中存在一個潛在問題,玩家可能在 Players.PlayerAdded 事件執行之前收集硬幣,然後硬幣數被重置為零。為了減輕這個問題,考慮使用代碼調度或在初始化完成之前凍結玩家角色等解決辦法。然而,這些解決方案涉及更複雜的腳本概念,超出了本教程的範圍。

測試遊戲

是時候看看玩家危險物是否按預期工作。當你觸摸水面時,你的角色應該會死亡並失去他們的硬幣。要測試你的遊戲:

  1. 在工具欄中,點擊 Play 按鈕。Studio 進入測試模式。

    Studio的測試選項中突出顯示的播放按鈕。
  2. 移動你的角色來收集一些硬幣,然後跳進水中。如果你的 腳本正常工作,則你的角色死亡,排行榜上的硬幣數重置為 0