現在您可以偵測玩家是否收集到金幣,這個教學節目會教您如何計算玩家收集到的金幣數量,並將該數量顯示在排行榜上。
建立模塊指令以記錄硬幣收集
要處理每個玩家的金幣收集資料的存儲和管理,您需要創建一個 ModuleScript 對象來包含一個資料結構和功能,可以對每個玩家的金幣收集資料進行存取。模組腳本是其他指令碼可能需需要 必填的重用代碼。在此情況下, CoinService 需要此模組��
要創建模組腳指令碼:
在 Explorer 窗口中,將鼠標移動至 ServerStorage 並點擊 ⊕ 按鈕。一個上下文菜單顯示。
從上下文菜單中選擇 模組脚本 。 新的模組 script 會顯示在 ServerStorage 下。 您正在將模組 script 放置在 ServerStorage 因為您想要管理伺服器上的金幣收集逻辑。
將模組指令碼重命名為 PlayerData 。
將以下代碼替換為預設代碼:
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {-- [[[userId: string] = {["Coins"] = coinAmount: number}]]}local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_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 表,其中包含零或多個 playerData 桌子,代表玩家收集硬幣資料。每個需要此模組腳本的腳本都會獲得相同的 PlayerData 表,允許多個腳本修改並分享硬幣收集資料。
宣告資料結構
模塊腳本從空檯子的宣言開始,PlayerData,它在腳指令碼結束時返回。它還包含可以取得和設置值在檯子上的配件方法。
playerData 桌子包含描述桌子結構的評論,這使代碼更容易理解。在這個情況下,playerData 桌子包含 userId 和對應的字段 1> Coins1> 代表該玩家收集的金幣數量。
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {-- [[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerData定義本地資料配件
getData() 是一個本地函數,它可以為特定 playerData 桌子的數據提取。如果玩家沒有收集硬幣,它會返回一個 DEFAULT_PLAYER_DATA 桌子來確保每個玩家都有一些與他們相關的數據。一個常見的約定是創建簡
local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataend定義公共資料存取器
getValue() 和 updateValue() 是其他需要此模組腳本的其他指令。在我們的案例中, CoinService 使用這些功能來更新玩家每次觸摸到金幣時的金幣收集數據。
function 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 newValueend
實現排行榜
您可以使用屏幕排行榜代表金幣收集資料。 Roblox 包含一個內置系統,可以自動生成排行榜,並且使用預設 UI 生成排行榜。
要創建排行榜:
在 Explorer 窗口中,在 ServerStorage 中創建模組脚本,然後將模組脚本重命名為 排行榜 。
將以下代碼替換為預設代碼:
local Leaderboard = {}-- 創建新排行榜local function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 「leader統計」是 Roblox 為創建排行榜所使用的保留名稱leaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- 創建新的排行榜統計值local function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- 更新玩家的統計值function Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueendreturn Leaderboard代碼說明下列部分詳細說明排行榜的工作方式。
建立排行榜
setupLeaderboard() 函數創建了名為 leaderstats 的新資料條目,並將它設為指定玩家的子樣。 Roblox 會自動��
-- 創建新排行榜local function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 「leader統計」是 Roblox 為創建排行榜所使用的保留名稱leaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- 創建新的排行榜統計值local function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend更新玩家統計資料
setStat() 是 排行榜 模組中唯一的公共函數。它會創建指定玩家或排行榜自身的 stat 值,如果尚未存在。
FindFirstChild() 取得對象的名稱,並且如果對象存在,將對象返回,否則 nil 如果對象不存在。它是一種常見、安全的方法來查看對象是否存在,並且在你使用它之前。
-- 更新玩家的統計值function Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueend
整合模組指令碼
完成 PlayerData 和 排行榜 模組腳本後,需要在 CoinService 指令碼中引用它們來管理並顯示玩家的硬幣數據。要更新 1>CoinService1> :
在 Explorer 窗口中,開啟 CoinService 指令碼。
將現有代碼變更為下列代碼:
-- 初始化服務和變數local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- 模組local Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal COOLDOWN = 10local COIN_AMOUNT_TO_ADD = 1local function updatePlayerCoins(player, updateFunction)-- 更新金幣桌local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- 更新硬幣排行榜Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- 定義事件處理器local function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- 玩家碰到了硬幣coin.Transparency = 1coin:SetAttribute("Enabled", false)updatePlayerCoins(player, function(oldCoinAmount)oldCoinAmount = oldCoinAmount or 0return oldCoinAmount + COIN_AMOUNT_TO_ADDend)task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- 設定事件聽取者for _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end代碼說明原始 CoinService 指令碼的變更包括:
- 將 COIN_AMOUNT_TO_ADD 宣告為玩家收集金幣時添加的金幣數量,和 COIN_KEY_NAME 作為 PlayerData 中定義的鑰匙名稱。
- 建立幫助功能 updatePlayerCoins() 以更新玩家的硬幣數量和關聯排行榜統計。
- 將 print() 語句在 onCoinTouched() 中的位置替換為 updatePlayerCoins() 。
遊戲測試
是時候看看金幣收集是否如預期。當您在遊戲中觸摸並收集一枚金幣時,您應該能夠看到您收集的金幣數量。要測試您的體驗:
在菜單欄中,單擊 播放 按鈕。Studio 進入播放測試模式。
將您的角色移動觸摸硬幣。如果您的指令碼正確運行,則硬幣排行榜 UI 會顯示,並且隨著您收集更多硬幣而增加您的硬幣數量。