玩家現在可以收集金幣,在他們死亡時失去金幣,但金幣不會做任何事情,而且遊戲世界的大部分無法進入,因為沒有人能跳得很高。這個教學的其他部分教會你如何完成遊戲的邏輯,添加一個在屏幕上的按鈕,可以使用金幣增加跳躍力。
創建升級按鈕
Roblox 的 2D 介面通常由內含在 Roblox 容器中的一集 GUI 零件組成。 在這個情況下,您只需要一個 TextButton 零件,說明內容是 升級跳躍 (5 枚金幣) 內的。
要創建使用者GUI:
- 在 探險家 窗口中,將新資料夾添加到 ReplicatedStorage ,然後將資料夾重命名為 Instances 。 在 1> ReplicatedStorage1> 中的任何對象都可以對每個玩家的 Roblox 客戶端進行存取,這是 GUI 顯示的地方。
- 將 ScreenGUI 對象加到 Instances 夾中。
- 選擇 ScreenGUI 物件,然後在 屬性 窗口中,
- 將 名稱 設置為 JumpPurchaseGui 。
- 停用 ResetOnSpawn 以確保玩家重生時 GUI 會繼續保持與玩家親和關係。
- 在 Explorer 窗口中,將 TextButton 放入 JumpPurchaseGui 容器,然後重新命名文字按鈕為 1> JumpButton1>。
- (可選) 配置按鈕的外觀和位置,以配置其屬性。一些簡單的建議包括:
- 將 文字 屬性設置為 升級跳躍 (5 金幣) 。
- 將 文字大小 屬性設置為 25 。
- 將 錨定點 設為 1, 1 並將位置設為 1, 0,1,0 以將按鈕移動到右下角。
你在這個教學的後半,將按鈕添加到玩家的 GUI,但在添加之前,你必須定義要求按鈕運作的所有程式碼和資料。
定義跳躍力資料
目前,只有硬幣數量會儲存在 PlayerData 模組指令碼中的每個玩家。您還需要儲存並更新跳躍力,以同樣的方式。因為 PlayerData 中的功能對於變更的資料不具體,因此要在 Jump 的硬幣值進行初
要更新 PlayerData 模組脚本來儲存跳躍力:
在 Explorer 窗口中,在 ServerStorage 中開啟 PlayerData 模組脚本。
將腳本中的代碼替換為以下示例,以初始化每個玩家旁邊的其他玩家的 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_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
更新跳躍力資料
現在 PlayerData 可以跟蹤跳躍力,您需要在伺服器上實現 logic 來從玩家的客戶邀請請求升級跳躍力。
服務器和客戶端通過 遠端事件 或 遠端功能 來通信。遠端事件不會在發射時產生,並且適用於單向通信。遠端功能會在收到回應後產生,從而允許兩向通信。在此情況下,客戶端需要知道服務器是否成功升級玩家的跳躍力,因此遠端功能是理想的。
要實現跳躍升級:
在 Explorer 窗口中,開啟 實體存儲服務器 的 實體存儲服務器 夾位。
將 遠端功能 插入 Instances 文件夾,然後將遠端功能重新命名為 1> IncreJumpPowerFunction1>。 您總是在 4> ReplicatedStorage4> 中創建遠端功能,因為客戶和服務器都必須能夠存取它們。
在 Explorer 窗口中,選擇 StarterPlayer 。
在 屬性 窗口中,啟用 CharacterUseJumpPower 屬性。 預設情況下,一個角色的跳躍力值不會定義角色跳躍的數量,因此需要啟用。
在 Explorer 窗口中,插入新指令碼到 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-- 在連接到 PlayerAdded 事件之前初始化任何玩家for _, player in Players:GetPlayers() doonCharacterAdded(player)end-- 玩家從玩家添加事件中的初始化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)代碼說明下列部分詳細說明了代碼。
更新跳躍力資料 - updateJumpPower() 更新玩家和排行榜的跳
驗證服務器要求 - onPurchaseJumpIncrease() 首先檢查玩家是否有足夠的金幣數量以購買升級。 所有要求 從客戶端傳送到服務器的請求應該被 0> 驗證0> 以防止惡意滥用您的體驗。
將按鈕添加到玩家GUI
Class.ScreenGui 對象只在屏幕上顯示,如果它與玩家的 Class.PlayerGui 對物件相關。 默認情況下,這包含系統 GUI 如聊天窗口。您現在需要在 ReplicatedStorage 中創建一個 script 來複製升級按鈕到每個玩家的 GUI 並實現行為,當按鈕被按下
要在玩家加入時將按鈕添加到玩家的 GUI:
在 Explorer 窗口中,在 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-- 購買將會是 false 的錯誤訊息error(purchased)elseif success and not purchased thenwarn("Not enough coins!")endendjumpButton.Activated:Connect(onButtonClicked)-- 將 JumpPurchaseGui 添加到玩家的 GuijumpPurchaseGui.Parent = playerGui代碼說明
遊戲測試
您現在應該能夠使用升級按鈕購買金幣跳躍升級。 要測試項目:
在菜單欄中,單擊 播放 按鈕。Studio 進入播放測試模式。
如果您的指令碼正確運行,會出現在屏幕上的按鈕,要購買跳躍力。 嘗試在收集任何金幣之前,嘗試點擊按鈕,看看它是否給您額外的跳躍力,然後再嘗試收集一些金幣,看看升級是否在您再次點擊時工作。
現在代碼完成後,請嘗試通過金幣的數量和位置來平衡遊戲。如果遊戲感覺太慢,請添加更多金幣,否則請減少金幣,並將它們放在挑戰性的位置。