編寫升級按鈕

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


玩家現在可以收集硬幣並在死亡時失去它們,但這些硬幣沒有任何作用,而大多數3D世界在沒有能夠跳得很高的情況下是無法訪問的。本節教程教您如何通過添加一個在屏幕上花費硬幣以提高跳躍能力的按鈕來完成您的體驗邏輯。

創建升級按鈕

Roblox中的2D界面通常由GUI容器內的一系列GUI組件組成。在這種情況下,您只需要一個TextButton組件,其內部顯示“升級跳躍 (5 硬幣)”的字樣,並放在ScreenGui容器內。

設置升級GUI

在ReplicatedStorage中創建一個名為Instances的資料夾。
在Instances資料夾內,創建一個名為JumpPurchaseGui的ScreenGui,並禁用ResetOnSpawn。
在JumpPurchaseGui內,創建一個名為JumpButton的TextButton,並設置以下屬性:
- 文本: "升級跳躍 (5 硬幣)"
- 文本大小: 25
- 錨點: 1, 1
- 位置: {1, 0}, {1, 0}
在Instances資料夾內,還需創建一個名為IncreaseJumpPowerFunction的RemoteFunction。
最後,在StarterPlayer服務上啟用CharacterUseJumpPower屬性。

定義跳躍能力數據

目前,只為每個玩家在PlayerData模組腳本中存儲了硬幣數量。您還需要以相同的方式存儲和更新跳躍能力。由於PlayerData中的功能不特定於要更改的數據,存儲玩家跳躍能力所需的所有內容就是添加一個Jump鍵並在defaultPlayerData()中初始化其初始值。

更新PlayerData以包含跳躍能力

在ServerStorage中,用以下代碼替換現有的PlayerData ModuleScript的代碼:
```lua
local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Coins"
PlayerData.JUMP_KEY_NAME = "Jump"
local playerData = {
--[[
[userId: string] = {
["Coins"] = coinAmount: number,
["Jump"] = jumpPower: number
}
--]]
}
local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0,
[PlayerData.JUMP_KEY_NAME] = 0,
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
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能夠跟蹤跳躍能力,您需要實現在伺服器上提升跳躍能力的邏輯,這是由玩家的客戶端請求觸發的。

伺服器和客戶端可以通過RemoteEventsRemoteFunctions進行通信。Remote events在觸發時不會暫停而可用於單向通信;而Remote functions則會暫停,直到收到回覆,這使得雙向通信成為可能。

對於本教程,客戶端需要知道伺服器是否成功升級了玩家的跳躍能力,因此應使用Remote function。

創建JumpService

在ServerScriptService中,創建一個名為JumpService的Script,並使用以下代碼:
```lua
-- 服務
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
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
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
-- 通常通過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()更新玩家的跳躍能力和Leaderboard以提供可視反饋。此功能類似於在創建玩家危害中損害玩家的代碼。假設存在一個Character模型和Humanoid模型用於被升級的玩家,此函數將JumpPower屬性更新為由PlayerData存儲的新值,增加30。如果您希望您的遊戲持續更久,可以減少此數字。

  • 驗證服務器請求 - onPurchaseJumpIncrease()首先檢查玩家實際上是否擁有所需的硬幣數量來購買升級。所有客戶端對服務器的請求必須經過驗證,以防止惡意行為者提交虛假的請求並利用您的遊戲。

將按鈕添加到玩家的GUI中

ScreenGui對象僅在其被設置為玩家的PlayerGui對象的父項時顯示在屏幕上。默認情況下,這包含系統GUI,如聊天窗格。現在,您需要在ReplicatedStorage中創建一個腳本,將升級按鈕複製到每個玩家的GUI中,並實施按鈕被按下時的行為。

創建JumpButtonClickHandler

在ReplicatedStorage中,創建一個名為JumpButtonClickHandler的Script,並將RunContext設置為Client,並使用以下代碼:
```lua
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
-- purchased將是錯誤消息,如果成功為false
error(purchased)
elseif success and not purchased then
warn("硬幣不足!")
end
end
jumpButton.Activated:Connect(onButtonClicked)
-- 將JumpPurchaseGui添加到玩家的Gui中
jumpPurchaseGui.Parent = playerGui
```

以下部分更詳細地描述代碼。

  • 獲取對GUI和服務器功能的引用 - 變量IncreaseJumpPowerFunctionjumpPurchaseGuijumpButton包含對將來需要調用的函數和GUI的引用。
  • 定義事件處理程序 - onButtonClicked()定義了用戶單擊升級按鈕時的邏輯。它使用pcall()(保護調用)來調用RemoteFunction。任何這樣的客戶端與伺服器的通信都需要pcall()來處理錯誤或連接問題。
  • 將處理程序連接到按鈕 - Activated事件在所有平台上均均相容,包括鼠標、觸摸屏或遊戲手柄上下文。當點擊觸摸釋放控制器按鈕時觸發。

玩測

從下拉菜單中選擇測試並單擊播放升級跳躍按鈕顯示在右下角。

嘗試在收集任何硬幣之前單擊按鈕,以檢查它不會獎勵您額外的跳躍能力,然後嘗試收集一些硬幣,看看在您再次單擊時升級是否有效。

隨著代碼的完成,您可以嘗試調整難度:如果節奏感覺緩慢,則增加硬幣數量;如果升級過於輕鬆,則減少一些並將其放在更隱蔽的位置。

©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。