指定升級按鈕

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


玩家現在可以收集金幣,在他們死亡時失去金幣,但金幣不會做任何事情,而且遊戲世界的大部分無法進入,因為沒有人能跳得很高。這個教學的其他部分教會你如何完成遊戲的邏輯,添加一個在屏幕上的按鈕,可以使用金幣增加跳躍力。

創建升級按鈕

Roblox 的 2D 介面通常由內含在 Roblox 容器中的一集 GUI 零件組成。 在這個情況下,您只需要一個 TextButton 零件,說明內容是 升級跳躍 (5 枚金幣) 內的。

要創建使用者GUI:

  1. 探險家 窗口中,將新資料夾添加到 ReplicatedStorage ,然後將資料夾重命名為 Instances 。 在 1> ReplicatedStorage1> 中的任何對象都可以對每個玩家的 Roblox 客戶端進行存取,這是 GUI 顯示的地方。
  2. ScreenGUI 對象加到 Instances 夾中。
  3. 選擇 ScreenGUI 物件,然後在 屬性 窗口中,
    1. 名稱 設置為 JumpPurchaseGui
    2. 停用 ResetOnSpawn 以確保玩家重生時 GUI 會繼續保持與玩家親和關係。
  4. Explorer 窗口中,將 TextButton 放入 JumpPurchaseGui 容器,然後重新命名文字按鈕為 1> JumpButton1>。
  5. (可選) 配置按鈕的外觀和位置,以配置其屬性。一些簡單的建議包括:
    • 文字 屬性設置為 升級跳躍 (5 金幣)
    • 文字大小 屬性設置為 25
    • 錨定點 設為 1, 1 並將位置設為 1, 0,1,0 以將按鈕移動到右下角。

你在這個教學的後半,將按鈕添加到玩家的 GUI,但在添加之前,你必須定義要求按鈕運作的所有程式碼和資料。

定義跳躍力資料

目前,只有硬幣數量會儲存在 PlayerData 模組指令碼中的每個玩家。您還需要儲存並更新跳躍力,以同樣的方式。因為 PlayerData 中的功能對於變更的資料不具體,因此要在 Jump 的硬幣值進行初

要更新 PlayerData 模組脚本來儲存跳躍力:

  1. Explorer 窗口中,在 ServerStorage 中開啟 PlayerData 模組脚本。

  2. 將腳本中的代碼替換為以下示例,以初始化每個玩家旁邊的其他玩家的 Jump 值:


    local PlayerData = {}
    PlayerData.COIN_KEY_NAME = "Coins"
    PlayerData.JUMP_KEY_NAME = "Jump"
    local playerData = {
    -- [[
    [userId: string] = {
    ["Coins"] = coinAmount: number,
    ["Jump"] = jumpPower: number
    }
    --}]
    }
    local DEFAULT_PLAYER_DATA = {
    [PlayerData.COIN_KEY_NAME] = 0,
    [PlayerData.JUMP_KEY_NAME] = 0,
    }
    local function getData(player)
    local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end
    function PlayerData.getValue(player, key)
    return getData(player)[key]
    end
    function PlayerData.updateValue(player, key, updateFunction)
    local data = getData(player)
    local oldValue = data[key]
    local newValue = updateFunction(oldValue)
    data[key] = newValue
    return newValue
    end
    return PlayerData

更新跳躍力資料

現在 PlayerData 可以跟蹤跳躍力,您需要在伺服器上實現 logic 來從玩家的客戶邀請請求升級跳躍力。

服務器和客戶端通過 遠端事件遠端功能 來通信。遠端事件不會在發射時產生,並且適用於單向通信。遠端功能會在收到回應後產生,從而允許兩向通信。在此情況下,客戶端需要知道服務器是否成功升級玩家的跳躍力,因此遠端功能是理想的。

要實現跳躍升級:

  1. 在 Explorer 窗口中,開啟 實體存儲服務器 的 實體存儲服務器 夾位。

  2. 遠端功能 插入 Instances 文件夾,然後將遠端功能重新命名為 1> IncreJumpPowerFunction1>。 您總是在 4> ReplicatedStorage4> 中創建遠端功能,因為客戶和服務器都必須能夠存取它們。

    Studio's Explorer window with the IncreaseJumpPowerFunction script highlighted under the Instances folder.
  3. Explorer 窗口中,選擇 StarterPlayer

  4. 屬性 窗口中,啟用 CharacterUseJumpPower 屬性。 預設情況下,一個角色的跳躍力值不會定義角色跳躍的數量,因此需要啟用。

  5. 在 Explorer 窗口中,插入新指令碼到 ServerScriptService ,然後將指令碼重命名為 JumpService。這個指令碼會包含跳升級的程式碼。

  6. 將以下代碼替換為預設代碼:


    -- 服務
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- 模組
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- 事件
    local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
    local JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAME
    local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
    local JUMP_POWER_INCREMENT = 30
    local JUMP_COIN_COST = 5
    local function updateJumpPower(player, updateFunction)
    -- 更新跳躍力桌
    local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)
    -- 更新玩家的跳躍力
    local character = player.Character or player.CharacterAdded:Wait()
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.JumpPower = newJumpPower
    -- 更新跳躍排行榜
    Leaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)
    end
    end
    local function onPurchaseJumpIncrease(player)
    local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)
    if coinAmount < JUMP_COIN_COST then
    return false
    end
    -- 增加玩家的跳躍力
    updateJumpPower(player, function(oldJumpPower)
    oldJumpPower = oldJumpPower or 0
    return oldJumpPower + JUMP_POWER_INCREMENT
    end)
    -- 更新金幣桌
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)
    return oldCoinAmount - JUMP_COIN_COST
    end)
    -- 更新硬幣排行榜
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    return true
    end
    local function onCharacterAdded(player)
    -- 添加角色時重設玩家的跳躍力
    updateJumpPower(player, function(_)
    return 0
    end)
    end
    -- 在連接到 PlayerAdded 事件之前初始化任何玩家
    for _, player in Players:GetPlayers() do
    onCharacterAdded(player)
    end
    -- 玩家從玩家添加事件中的初始化
    local function onPlayerAdded(player)
    player.CharacterAdded:Connect(function()
    onCharacterAdded(player)
    end)
    end
    local function onPlayerRemoved(player)
    updateJumpPower(player, function(_)
    return nil
    end)
    end
    IncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncrease
    Players.PlayerAdded:Connect(onPlayerAdded)
    Players.PlayerRemoving:Connect(onPlayerRemoved)

    下列部分詳細說明了代碼。

    • 更新跳躍力資料 - updateJumpPower() 更新玩家和排行榜的跳

    • 驗證服務器要求 - onPurchaseJumpIncrease() 首先檢查玩家是否有足夠的金幣數量以購買升級。 所有要求 從客戶端傳送到服務器的請求應該被 0> 驗證0> 以防止惡意滥用您的體驗。

將按鈕添加到玩家GUI

Class.ScreenGui 對象只在屏幕上顯示,如果它與玩家的 Class.PlayerGui 對物件相關。 默認情況下,這包含系統 GUI 如聊天窗口。您現在需要在 ReplicatedStorage 中創建一個 script 來複製升級按鈕到每個玩家的 GUI 並實現行為,當按鈕被按下

要在玩家加入時將按鈕添加到玩家的 GUI:

  1. Explorer 窗口中,在 ReplicatedStorage 中建立 指令碼

  2. 選擇指令碼,然後在 屬性 視窗中,

    1. 名稱 設置為 JumpButtonClickHandler
    2. 執行程式碼 設為 客戶端 。這告訴引擎永遠在客戶端上執行此程式碼,以最佳化網路通訊。
  3. 在開啟的指令碼中,將預設代碼變更為以下代碼:


    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local playerGui = player.PlayerGui
    local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
    local jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGui
    local jumpButton = jumpPurchaseGui.JumpButton
    local function onButtonClicked()
    local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)
    if not success then
    -- 購買將會是 false 的錯誤訊息
    error(purchased)
    elseif success and not purchased then
    warn("Not enough coins!")
    end
    end
    jumpButton.Activated:Connect(onButtonClicked)
    -- 將 JumpPurchaseGui 添加到玩家的 Gui
    jumpPurchaseGui.Parent = playerGui

    下列部分詳細說明了代碼。

    • 獲取GUI和伺服器功能的引用 - 變數 IncreaseJumpPowerFunctionjumpPurchaseGui 和 0> jumpButton0> 包含參考功能和GUI,您稍後需要的功能。
    • 定義事件處理器 - onButtonClicked() 定義用戶點擊升級按鈕時的逻辑。它使用 pcall() (保護調用) 來喚用 0> Class.RemoteFunction0>。任何客戶
    • 連接處理器到按鈕按鈕連接到按鈕 - 事件 Activated 對所有平台,包括滑鼠標、觸摸屏或遊戲手柄上下文都相容。它會在 點擊 、0>點擊0>或 3>點擊 3>釋放時啟

遊戲測試

您現在應該能夠使用升級按鈕購買金幣跳躍升級。 要測試項目:

  1. 在菜單欄中,單擊 播放 按鈕。Studio 進入播放測試模式。

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. 如果您的指令碼正確運行,會出現在屏幕上的按鈕,要購買跳躍力。 嘗試在收集任何金幣之前,嘗試點擊按鈕,看看它是否給您額外的跳躍力,然後再嘗試收集一些金幣,看看升級是否在您再次點擊時工作。

現在代碼完成後,請嘗試通過金幣的數量和位置來平衡遊戲。如果遊戲感覺太慢,請添加更多金幣,否則請減少金幣,並將它們放在挑戰性的位置。