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

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


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

สร้างสคริปโมดูลเพื่อบันทึกเหรียญ

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

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

  1. ใน หน้าต่าง Explorer เลื่อนเมาส์ไปที่ 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 มี userId และสาขาตรงกันของชื่อ 1>


    local PlayerData = {}
    PlayerData.COIN_KEY_NAME = "Coins"
    local playerData = {
    --[[
    [userId: string] = {
    ["Coins"] = coinAmount: number
    }
    ]]
    }
    ...
    return PlayerData

    กำหนดตัวแปรของข้อมูลท้องถิ่น

    getData() เป็นคุณสมบัติที่พบในท้องถิ่นที่ดึงข้อมูลสำหรับตาราง playerData ที่เฉพาะ หากผู้เล่นยังไม่ได้เก็บเหรียญ พวกเขาจะสร้างตา


    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 ให้สร้าง ModuleScript ใน ServerStorage แล้วเปลี่ยนชื่อหน้าเว็บไซต์ของโมดูลสกริปต์เป็น 1>Leaderboard1>

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. แทนที่รหัสเริ่มต้นด้วยรหัสต่อไปนี้:


    local Leaderboard = {}
    -- ตารางอันดับ
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- ‘leader統計’ ตารางอันดับ
    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 และตั้ง


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

    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 เพื่อจัดการและแสดงผลของข้อมูลเหรียญผู้เล่น เพื่อปรับปรุง 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 รวมถึง:

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

ทดสอบ

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

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

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. ย้ายตัวละครของคุณเพื่อแตะเหรียญ หากสคริปต์ของคุณทำงานอย่างถูกต้อง ระบบจัดอันดับ UI จะปรากฏขึ้นและเพิ่มจำนวนเหรียญของคุณเมื่อคุณเก็บเหรียญมากขึ้น