玩家現在可以收集硬幣並在死亡時失去它們,但硬幣無法做任何事情,大部分遊戲世界無法跳得很高。本教學的這一部分教你如何通過添加在屏幕上的按鈕來完成體驗的邏輯,該按鈕會花費金幣來增加跳躍力。
建立升級按鈕
Roblox 的 2D 介面通常由一個 GUI 容器內的一組 GUI 組件組成。在這種情況下,您只需要一個 TextButton 組件,說明內部有 升級跳躍(5 枚金幣) 的容器 ScreenGui.
要創建 GUI:
- 在 資料檢視器 視窗中,新增一個新文件夾到 ReplicatedStorage ,然後將文件夾重命名為 實例 。在 ReplicatedStorage 中的任何對象都可以存取每個玩家的 Roblox 客戶端,這是顯示使用者介面的地方。
- 將 ScreenGui 對象添加到 實例 文件夾。
- 選擇 ScreenGui 物件,然後在 屬性 視窗中,
- 將 名稱 設為 JumpPurchaseGui 。
- 停用 ResetOnSpawn 以確保 GUI 在重生時仍然與玩家保持關係。
- 在 導航器 窗口中,將 文字按鈕 插入 JumpPurchaseGui 容器中,然後將文字按鈕重命名為 JumpButton 。
- (可選) 配置按鈕的屬性來自定義按鈕的外觀和位置。簡單的建議包括:
- 將 文字 屬性設為 升級跳躍(5枚金幣) 。
- 將 文字尺寸 屬性設為 25。
- 將 錨點 設置為 1, 1 和 位置 設置為 {1, 0},{1, 0} 將按鈕移動到右下角。
您將在本教學後期添加按鈕到玩家的 GUI,但在此之前,您需要定義所有必要使按鈕運作的邏輯和資料。
定義跳躍力數據
目前,只有金幣數量存儲在 PlayerData 模指令碼腳本中的每個玩家。您也需要以相同的方式儲存和更新跳躍力。因為 PlayerData 中的功能不適用於更改的數據,所有需要存儲玩家跳躍力的一切都是添加 Jump 鍵並在 DEFAULT_PLAYER_DATA 中初始化其初始值。
要將 玩家數據 模組腳本更新以儲存跳躍力:
在 檢索器 窗口中,在 伺服器儲存 中開啟 PlayerData 模組腳本。
將腳本中的代碼替換為以下樣本,該樣本會初始化每個玩家的 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_DATAplayerData[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
更新跳躍力數據
現在 玩家數據 能夠跟蹤跳躍力,您需要在服務器上實現邏輯以升級玩家的客戶端請邀請的跳躍力。
伺服器和客戶端可以透過 遠端事件 或 遠端功能 進行通訊。遠端事件在發射時不會產生,適合單向通訊。遠端功能會持續運作,直到它們收到回應,這讓兩個方向的通訊成為可能。在這種情況下,客戶端需要知道服務器是否成功升級了玩家的跳躍力,因此遠端函數是理想的。
要實現跳躍升級:
在 導航器 窗口中,在 ReplicatedStorage 中開啟 實例 文件夾。
將 遠端功能 插入 Instances 文件夾,然後將遠端功能重命名為 增加跳躍力功能 。您總是在 ReplicatedStorage 中創建遠端功能,因為客戶端和服務器都必須能夠存取它們。
在 導航器 窗口中,選擇 新手玩家 。
在 屬性 窗口中,啟用 字元使用跳躍力 屬性。預設情況下,角色的跳躍力值不定義角色跳躍的數量,因此需要啟用。
在 勘探者 視窗中,插入新的腳本到 ServerScriptService ,然後將腳本重命名為 JumpService 。此腳本將包含跳躍升級的邏輯。
將預設代碼替換為以下代碼:
-- 服務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-- 更新跳躍排行榜Leaderboard.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)-- 更新金幣排行榜Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- 當角色添加時,重設玩家的跳躍力updateJumpPower(player, function(_)return 0end)end-- 在連接到「新增玩家」事件之前初始化任何添加的玩家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 對物件有父子關係。預設情況下,這包含系統使用者介面,例如聊天窗口。您現在需要在 ReplicatedStorage 創建一個腳本來將升級按鈕複製到每個玩家的 GUI 並實現按下時的行為。
要將按鈕添加到玩家的 GUI 當他們加入時:
在 導航器 窗口中,在 ReplicatedStorage 中創建一個 腳本 。
選擇腳指令碼,然後在 屬性 窗口中,
- 將 名稱 設為 JumpButtonClickHandler 。
- 將 執行上下文 設置為 客戶端 。這會告訴引擎始終在客戶端上執行此腳本來優化網絡通訊。
在開啟的腳指令碼中,將預設代碼替換為以下代碼:
local 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-- 購買成功後將會顯示錯誤訊息,如果成功為否則error(purchased)elseif success and not purchased thenwarn("Not enough coins!")endendjumpButton.Activated:Connect(onButtonClicked)-- 將跳躍購買GUI添加到玩家的GUIjumpPurchaseGui.Parent = playerGui代碼說明以下部分進一步描述代碼的細節。
- 獲得對GUI和服務器功能的參考 - 變量 IncreaseJumpPowerFunction、jumpPurchaseGui 和 jumpButton 包含對你稍後需要的功能和GUI的參考。
- 定義事件處理器 - onButtonClicked() 定義用戶單擊升級按鈕時的邏輯。它使用 pcall() (保護呼叫) 來呼叫 RemoteFunction。任何客戶端與伺服器通訊像這樣都需要 pcall() 來處理錯誤或連接問題。
遊戲測試
你現在應該可以使用升級按鈕購買金幣跳級升級。要測試項目:
在工具欄中,單擊 播放 按鈕。Studio 進入播放測試模式。
如果您的腳本正確運行,在屏幕上會出現購買跳躍力的按鈕。試試在收集任何硬幣之前點擊按鈕以檢查它是否不會給你額外的跳躍力,然後試試收集一些硬幣並看看升級在你再次點擊時是否有效。
現在代碼完成了,試試通過金幣數量和位置平衡遊戲。如果遊戲感覺太慢,請添加更多硬幣;如果感覺太快和容易,請減少硬幣並將它們放在挑戰的地方。