บันทึกและแสดงข้อมูลผู้เล่น

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่


ตารางอันดับส่วนนี้ของบทแนะนำการใช้งานสอนวิธีการนับจํานวนเหรียญที่ผู้เล่นรวบรวมและทําให้จํานวนนั้นปรากฏบนลีดเดอร์บอร์ด

คอลเล็กชัน

เพื่อจัดการการจัดเก็บและการจัดการข้อมูลการรวบรวมเหรียญของผู้เล่นแต่ละคนคุณต้องสร้างวัตถุ ModuleScript เพื่อบรรจุโครงสร้างข้อมูลและฟังก์ชันที่เข้าถึงข้อมูลการรวบรวมเหรียญสำหรับผู้เล่นทุกคนสคริปต์โมดูลเป็นรหัสที่สามารถใช้ซ้ำได้ที่สคริปต์อื่นๆ สามารถต้องการได้ในกรณีนี้ CoinService ต้องใช้สคริปต์โมดูลนี้เพื่อให้สามารถอัปเดตข้อมูลการรวบรวมเหรียญได้เมื่อผู้เล่นสัมผัสเหรียญ

เพื่อสร้างสคริปต์โมดูล:

  1. ในหน้าต่าง สํารวจ เลื่อนเมาส์ไปที่ ServerStorage และคลิกที่ปุ่ม เมนูบริบทจะแสดงขึ้น

  2. จากเมนูบริบท เลือก ModuleScript สคริปต์โมดูลใหม่จะแสดงภายใต้ ServerStorage คุณกำลังวางสคริปต์โมดูลใน 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 และฟิลด์ที่ตรงกันชื่อ Coins ซึ่งเป็นจำนวนเหรียญที่เก็บรวบรวมสำหรับผู้เล่นนั้น


    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

ตารางอันดับ

ตารางอันดับรวมระบบที่ติดตั้งไว้ล่วงหน้าที่สร้างลีดเดอร์บอร์ดโดยอัตโนมัติโดยใช้ UI เริ่มต้น

ตารางอันดับ:

  1. ในหน้าต่าง สํารวจ สร้าง ModuleScript ใน ServerStorage จากนั้นเปลี่ยนชื่อสคริปต์โมดูลเป็น ลีดเดอร์บอร์ด

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. รหัส:


    local Leaderboard = {}
    -- ตารางอันดับ
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- ชื่อ 'leaderstats' เป็นชื่อสำรองที่ 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 จะรู้จักโฟลเดอร์ชื่อ leaderstats เป็นคอนเทนเนอร์ของสถิติและสร้างองค์ประกอบ UI เพื่อแสดงสถิติต้องการให้ค่าใน leaderstats ถูกจัดเก็บเป็นวัตถุ "ค่า" (เช่น StringValue , IntValue หรือ NumberValue )


    -- ตารางอันดับ
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- ชื่อ 'leaderstats' เป็นชื่อสำรองที่ 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() เป็นฟังก์ชันสาธารณะเดียวในโมดูล ลีดเดอร์บอร์ด มันสร้างค่าสถิติสำหรับผู้เล่นที่กำหนดหรือลีดเดอร์บอร์ดเองหากยังไม่มีอยู่

    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 และ Leaderboard สมบูรณ์แล้ว จำเป็นต้องใช้ในสคริปต์ CoinService เพื่อจัดการและแสดงข้อมูลเหรียญผู้เล่นเพื่ออัปเดต CoinService :

  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 รวมถึง:

    • นำเข้าโมดูล ข้อมูลผู้เล่น และ ลีดเดอร์บอร์ด ด้วยฟังก์ชัน require()
    • ประกาศ COIN_AMOUNT_TO_ADD เป็นจํานวนเหรียญที่จะเพิ่มเมื่อผู้เล่นรวบรวมเหรียญ และ COIN_KEY_NAME เป็นชื่อกุญแจที่กําหนดไว้ใน PlayerData * สร้างฟังก์ชันช่วยเหลือ updatePlayerCoins() เพื่ออัปเดตจํานวนเหรียญของผู้เล่นและสถิติลีดเดอร์บอร์ดที่เกี่ยวข้อง
    • เปลี่ยนคำสั่งว่างเปล่า print() ใน onCoinTouched() ด้วยการโทรไปที่ updatePlayerCoins()

ทดสอบการเล่น

ถึงเวลาที่จะดูว่าคอลเลกชันเหรียญทำงานตามที่ตั้งใจไว้หรือไม่เมื่อคุณสัมผัสและรวบรวมเหรียญในเกมคุณควรสามารถเห็นจำนวนเหรียญที่คุณรวบรวมไว้ใน UI บนลีดเดอร์บอร์ดได้เพื่อทดสอบประสบการณ์ของคุณ:

  1. ในแถบเครื่องมือ คลิกปุ่ม เล่น คุณจะเข้าสู่โหมดการทดสอบเล่น Studio

    Play button highlighted in Studio's playtesting options.
  2. ย้ายตัวละครของคุณเพื่อสัมผัสเหรียญหากสคริปต์ทำงานอย่างถูกต้อง UI ลีดเดอร์บอร์ดจะแสดงและเพิ่มจํานวนเหรียญที่คุณรวบรวมเมื่อคุณรวบรวมเหรียญเพิ่มเติม