玩家現在可以收集硬幣並在死亡時失去它們,但這些硬幣沒有任何作用,而大多數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的代碼:```lualocal 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,}endlocal function getData(player)local data = playerData[tostring(player.UserId)] or defaultPlayerData()playerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerData```
更新跳躍能力數據
現在PlayerData能夠跟蹤跳躍能力,您需要實現在伺服器上提升跳躍能力的邏輯,這是由玩家的客戶端請求觸發的。
伺服器和客戶端可以通過RemoteEvents或RemoteFunctions進行通信。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.IncreaseJumpPowerFunctionlocal JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAMElocal COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal JUMP_POWER_INCREMENT = 30local JUMP_COIN_COST = 5local 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 thenhumanoid.JumpPower = newJumpPower-- 更新跳躍LeaderboardLeaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)endendlocal function onPurchaseJumpIncrease(player)local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)if coinAmount < JUMP_COIN_COST thenreturn falseend-- 增加玩家的跳躍能力updateJumpPower(player, function(oldJumpPower)oldJumpPower = oldJumpPower or 0return oldJumpPower + JUMP_POWER_INCREMENTend)-- 更新硬幣表local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)return oldCoinAmount - JUMP_COIN_COSTend)-- 更新硬幣LeaderboardLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- 當角色添加時重置玩家的跳躍能力updateJumpPower(player, function(_)return 0end)end-- 初始化在連接到PlayerAdded事件之前添加的任何玩家for _, player in Players:GetPlayers() doonCharacterAdded(player)end-- 通常通過PlayerAdded事件初始化玩家local function onPlayerAdded(player)player.CharacterAdded:Connect(function()onCharacterAdded(player)end)endlocal function onPlayerRemoved(player)updateJumpPower(player, function(_)return nilend)endIncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncreasePlayers.PlayerAdded:Connect(onPlayerAdded)Players.PlayerRemoving:Connect(onPlayerRemoved)```
將按鈕添加到玩家的GUI中
ScreenGui對象僅在其被設置為玩家的PlayerGui對象的父項時顯示在屏幕上。默認情況下,這包含系統GUI,如聊天窗格。現在,您需要在ReplicatedStorage中創建一個腳本,將升級按鈕複製到每個玩家的GUI中,並實施按鈕被按下時的行為。
創建JumpButtonClickHandler在ReplicatedStorage中,創建一個名為JumpButtonClickHandler的Script,並將RunContext設置為Client,並使用以下代碼:```lualocal ReplicatedStorage = game:GetService("ReplicatedStorage")local Players = game:GetService("Players")local player = Players.LocalPlayerlocal playerGui = player.PlayerGuilocal IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGuilocal jumpButton = jumpPurchaseGui.JumpButtonlocal function onButtonClicked()local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)if not success then-- purchased將是錯誤消息,如果成功為falseerror(purchased)elseif success and not purchased thenwarn("硬幣不足!")endendjumpButton.Activated:Connect(onButtonClicked)-- 將JumpPurchaseGui添加到玩家的Gui中jumpPurchaseGui.Parent = playerGui```
以下部分更詳細地描述代碼。
- 獲取對GUI和服務器功能的引用 - 變量IncreaseJumpPowerFunction、jumpPurchaseGui和jumpButton包含對將來需要調用的函數和GUI的引用。
- 定義事件處理程序 - onButtonClicked()定義了用戶單擊升級按鈕時的邏輯。它使用pcall()(保護調用)來調用RemoteFunction。任何這樣的客戶端與伺服器的通信都需要pcall()來處理錯誤或連接問題。
玩測
從下拉菜單中選擇測試並單擊播放。升級跳躍按鈕顯示在右下角。
嘗試在收集任何硬幣之前單擊按鈕,以檢查它不會獎勵您額外的跳躍能力,然後嘗試收集一些硬幣,看看在您再次單擊時升級是否有效。
隨著代碼的完成,您可以嘗試調整難度:如果節奏感覺緩慢,則增加硬幣數量;如果升級過於輕鬆,則減少一些並將其放在更隱蔽的位置。