腳本升級按鈕

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


玩家現在可以收集硬幣並在死亡時失去它們,但硬幣無法做任何事情,大部分遊戲世界無法跳得很高。本教學的這一部分教你如何通過添加在屏幕上的按鈕來完成體驗的邏輯,該按鈕會花費金幣來增加跳躍力。

建立升級按鈕

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

要創建 GUI:

  1. 資料檢視器 視窗中,新增一個新文件夾到 ReplicatedStorage ,然後將文件夾重命名為 實例 。在 ReplicatedStorage 中的任何對象都可以存取每個玩家的 Roblox 客戶端,這是顯示使用者介面的地方。
  2. ScreenGui 對象添加到 實例 文件夾。
  3. 選擇 ScreenGui 物件,然後在 屬性 視窗中,
    1. 名稱 設為 JumpPurchaseGui
    2. 停用 ResetOnSpawn 以確保 GUI 在重生時仍然與玩家保持關係。
  4. 導航器 窗口中,將 文字按鈕 插入 JumpPurchaseGui 容器中,然後將文字按鈕重命名為 JumpButton
  5. (可選) 配置按鈕的屬性來自定義按鈕的外觀和位置。簡單的建議包括:
    • 文字 屬性設為 升級跳躍(5枚金幣)
    • 文字尺寸 屬性設為 25
    • 錨點 設置為 1, 1位置 設置為 {1, 0},{1, 0} 將按鈕移動到右下角。

您將在本教學後期添加按鈕到玩家的 GUI,但在此之前,您需要定義所有必要使按鈕運作的邏輯和資料。

定義跳躍力數據

目前,只有金幣數量存儲在 PlayerData 模指令碼腳本中的每個玩家。您也需要以相同的方式儲存和更新跳躍力。因為 PlayerData 中的功能不適用於更改的數據,所有需要存儲玩家跳躍力的一切都是添加 Jump 鍵並在 DEFAULT_PLAYER_DATA 中初始化其初始值。

要將 玩家數據 模組腳本更新以儲存跳躍力:

  1. 檢索器 窗口中,在 伺服器儲存 中開啟 PlayerData 模組腳本。

  2. 將腳本中的代碼替換為以下樣本,該樣本會初始化每個玩家的 Jump 值與其現有的 Coins 值:


    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

更新跳躍力數據

現在 玩家數據 能夠跟蹤跳躍力,您需要在服務器上實現邏輯以升級玩家的客戶端請邀請的跳躍力。

伺服器和客戶端可以透過 遠端事件遠端功能 進行通訊。遠端事件在發射時不會產生,適合單向通訊。遠端功能會持續運作,直到它們收到回應,這讓兩個方向的通訊成為可能。在這種情況下,客戶端需要知道服務器是否成功升級了玩家的跳躍力,因此遠端函數是理想的。

要實現跳躍升級:

  1. 導航器 窗口中,在 ReplicatedStorage 中開啟 實例 文件夾。

  2. 遠端功能 插入 Instances 文件夾,然後將遠端功能重命名為 增加跳躍力功能 。您總是在 ReplicatedStorage 中創建遠端功能,因為客戶端和服務器都必須能夠存取它們。

    Studio's Explorer window with the IncreaseJumpPowerFunction script highlighted under the Instances folder.
  3. 導航器 窗口中,選擇 新手玩家

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

  5. 勘探者 視窗中,插入新的腳本到 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
    -- 在連接到「新增玩家」事件之前初始化任何添加的玩家
    for _, player in Players:GetPlayers() do
    onCharacterAdded(player)
    end
    -- 從 PlayerAdded 事件的普通初始化玩家
    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() 更新玩家和排行榜的跳躍力,提供視覺反回饋。這個功能類似於在 創建玩家危險 中傷害玩家的代碼。提供了 Character 模型和 Humanoid 存在於升級中的玩家,功能將 JumpPower 屬性更新為由 PlayerData 儲存的新值,增加 30。如果您想讓遊戲稍長一點,可以減少這個數字。

    • 驗證服務器請求 - onPurchaseJumpIncrease() 首先檢查玩家實際上擁有購買升級所需的金幣數量。 所有來自客戶端到服務器的請求 應被認證 以防止惡意行者提交錯誤請求並濫用您的體驗。

將按鈕添加到玩家GUI

只有 ScreenGui 對象會在屏幕上顯示,如果它與玩家的 PlayerGui 對物件有父子關係。預設情況下,這包含系統使用者介面,例如聊天窗口。您現在需要在 ReplicatedStorage 創建一個腳本來將升級按鈕複製到每個玩家的 GUI 並實現按下時的行為。

要將按鈕添加到玩家的 GUI 當他們加入時:

  1. 導航器 窗口中,在 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
    -- 購買成功後將會顯示錯誤訊息,如果成功為否則
    error(purchased)
    elseif success and not purchased then
    warn("Not enough coins!")
    end
    end
    jumpButton.Activated:Connect(onButtonClicked)
    -- 將跳躍購買GUI添加到玩家的GUI
    jumpPurchaseGui.Parent = playerGui

    以下部分進一步描述代碼的細節。

    • 獲得對GUI和服務器功能的參考 - 變量 IncreaseJumpPowerFunctionjumpPurchaseGuijumpButton 包含對你稍後需要的功能和GUI的參考。
    • 定義事件處理器 - onButtonClicked() 定義用戶單擊升級按鈕時的邏輯。它使用 pcall() (保護呼叫) 來呼叫 RemoteFunction。任何客戶端與伺服器通訊像這樣都需要 pcall() 來處理錯誤或連接問題。
    • 將處理器連接到按鈕 - Activated 事件在所有平台上,包括滑鼠、觸摸螢幕或遊戲控制器上都是兼容的。當 點擊 , 觸碰遊戲控制器按鈕 被釋放時,它會被觸發。

遊戲測試

你現在應該可以使用升級按鈕購買金幣跳級升級。要測試項目:

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

    Play button highlighted in Studio's playtesting options.
  2. 如果您的腳本正確運行,在屏幕上會出現購買跳躍力的按鈕。試試在收集任何硬幣之前點擊按鈕以檢查它是否不會給你額外的跳躍力,然後試試收集一些硬幣並看看升級在你再次點擊時是否有效。

現在代碼完成了,試試通過金幣數量和位置平衡遊戲。如果遊戲感覺太慢,請添加更多硬幣;如果感覺太快和容易,請減少硬幣並將它們放在挑戰的地方。