創建玩家危險

*此內容是使用 AI(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, 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. 在 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

    危險服務 與 金幣服務 非常相似。然而,而不是收集硬幣,玩家會在接觸危險時將其的 生命值設為 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)

該代碼定義了重設硬幣計數器 during 合適的生命時間事件的函數:

  • 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