記錄並顯示玩家數據

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


現在您可以偵測玩家是否收集到金幣,這個教學節目會教您如何計算玩家收集到的金幣數量,並將該數量顯示在排行榜上。

建立模塊指令以記錄硬幣收集

要處理每個玩家的金幣收集資料的存儲和管理,您需要創建一個 ModuleScript 對象來包含一個資料結構和功能,可以對每個玩家的金幣收集資料進行存取。模組腳本是其他指令碼可能需需要 必填的重用代碼。在此情況下, CoinService 需要此模組��

要創建模組腳指令碼:

  1. 在 Explorer 窗口中,將鼠標移動至 ServerStorage 並點擊 ⊕ 按鈕。一個上下文菜單顯示。

  2. 從上下文菜單中選擇 模組脚本 。 新的模組 script 會顯示在 ServerStorage 下。 您正在將模組 script 放置在 ServerStorage 因為您想要管理伺服器上的金幣收集逻辑。

    Studio's Explorer window with both the ServerScriptService's plus icon and ModuleScript object highlighted.
  3. 將模組指令碼重命名為 PlayerData

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. 將以下代碼替換為預設代碼:


    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_DATA
    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 表,其中包含零或多個 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_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end

    定義公共資料存取器

    getValue()updateValue() 是其他需要此模組腳本的其他指令。在我們的案例中, CoinService 使用這些功能來更新玩家每次觸摸到金幣時的金幣收集數據。


    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

實現排行榜

您可以使用屏幕排行榜代表金幣收集資料。 Roblox 包含一個內置系統,可以自動生成排行榜,並且使用預設 UI 生成排行榜。

要創建排行榜:

  1. Explorer 窗口中,在 ServerStorage 中創建模組脚本,然後將模組脚本重命名為 排行榜

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. 將以下代碼替換為預設代碼:


    local Leaderboard = {}
    -- 創建新排行榜
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 「leader統計」是 Roblox 為創建排行榜所使用的保留名稱
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- 創建新的排行榜統計值
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end
    -- 更新玩家的統計值
    function Leaderboard.setStat(player, statName, value)
    local leaderstats = player:FindFirstChild("leaderstats")
    if not leaderstats then
    leaderstats = setupLeaderboard(player)
    end
    local stat = leaderstats:FindFirstChild(statName)
    if not stat then
    stat = setupStat(leaderstats, statName)
    end
    stat.Value = value
    end
    return Leaderboard

    下列部分詳細說明排行榜的工作方式。

    建立排行榜

    setupLeaderboard() 函數創建了名為 leaderstats 的新資料條目,並將它設為指定玩家的子樣。 Roblox 會自動��


    -- 創建新排行榜
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 「leader統計」是 Roblox 為創建排行榜所使用的保留名稱
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- 創建新的排行榜統計值
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end

    更新玩家統計資料

    setStat()排行榜 模組中唯一的公共函數。它會創建指定玩家或排行榜自身的 stat 值,如果尚未存在。

    FindFirstChild() 取得對象的名稱,並且如果對象存在,將對象返回,否則 nil 如果對象不存在。它是一種常見、安全的方法來查看對象是否存在,並且在你使用它之前。


    -- 更新玩家的統計值
    function Leaderboard.setStat(player, statName, value)
    local leaderstats = player:FindFirstChild("leaderstats")
    if not leaderstats then
    leaderstats = setupLeaderboard(player)
    end
    local stat = leaderstats:FindFirstChild(statName)
    if not stat then
    stat = setupStat(leaderstats, statName)
    end
    stat.Value = value
    end

整合模組指令碼

完成 PlayerData排行榜 模組腳本後,需要在 CoinService 指令碼中引用它們來管理並顯示玩家的硬幣數據。要更新 1>CoinService1> :

  1. 在 Explorer 窗口中,開啟 CoinService 指令碼。

  2. 將現有代碼變更為下列代碼:


    -- 初始化服務和變數
    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.Coins
    local coins = coinsFolder:GetChildren()
    local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
    local COOLDOWN = 10
    local COIN_AMOUNT_TO_ADD = 1
    local 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") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- 玩家碰到了硬幣
    coin.Transparency = 1
    coin:SetAttribute("Enabled", false)
    updatePlayerCoins(player, function(oldCoinAmount)
    oldCoinAmount = oldCoinAmount or 0
    return oldCoinAmount + COIN_AMOUNT_TO_ADD
    end)
    task.wait(COOLDOWN)
    coin.Transparency = 0
    coin:SetAttribute("Enabled", true)
    end
    end
    end
    -- 設定事件聽取者
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    原始 CoinService 指令碼的變更包括:

    • 使用 Global.LuaGlobals.requir需要 必填() 函數匯入 PlayerDatarequire() 模組。
    • COIN_AMOUNT_TO_ADD 宣告為玩家收集金幣時添加的金幣數量,和 COIN_KEY_NAME 作為 PlayerData 中定義的鑰匙名稱。
    • 建立幫助功能 updatePlayerCoins() 以更新玩家的硬幣數量和關聯排行榜統計。
    • print() 語句在 onCoinTouched() 中的位置替換為 updatePlayerCoins()

遊戲測試

是時候看看金幣收集是否如預期。當您在遊戲中觸摸並收集一枚金幣時,您應該能夠看到您收集的金幣數量。要測試您的體驗:

  1. 在菜單欄中,單擊 播放 按鈕。Studio 進入播放測試模式。

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. 將您的角色移動觸摸硬幣。如果您的指令碼正確運行,則硬幣排行榜 UI 會顯示,並且隨著您收集更多硬幣而增加您的硬幣數量。