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

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


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

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

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

สร้าง PlayerData

ใน ServerStorage ให้สร้าง ModuleScript ชื่อ PlayerData พร้อมโค้ดดังต่อไปนี้:
```lua
local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Coins"
local playerData = {
--[[
[userId: string] = {
["Coins"] = coinAmount: number
}
]]
}
local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
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 เฉพาะ หากผู้เล่นยังไม่เคยเก็บเหรียญ มันจะส่งกลับตารางจากฟังก์ชัน defaultPlayerData() เพื่อให้แน่ใจว่าผู้เล่นทุกคนมีข้อมูลบางอย่างที่เกี่ยวข้องกับพวกเขา แนวปฏิบัติทั่วไปคือการสร้างฟังก์ชันที่เรียบง่ายและเผยแพร่หน้าสาธารณะที่ส่งต่อให้กับฟังก์ชันที่มีขอบเขตในท้องถิ่นที่ทำงานหนัก


local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
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 เริ่มต้น

สร้าง Leaderboard

ใน ServerStorage ให้สร้าง ModuleScript ชื่อ Leaderboard พร้อมโค้ดดังต่อไปนี้:
```lua
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 Element เพื่อแสดงข้อมูลสถิติ จำเป็นต้องจัดเก็บค่าใน 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() เป็นฟังก์ชันสาธารณะเพียงฟังก์ชันเดียวในโมดูล 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

รวมโมดูลสคริปต์

เมื่อโมดูลทั้งสองพร้อมแล้ว ให้เรียกใช้งานในสคริปต์ CoinService เพื่อจัดการและแสดงข้อมูลเหรียญของผู้เล่น

อัปเดต CoinService

ใน ServerScriptService ให้แทนที่รหัสสคริปต์ CoinService ที่มีอยู่ด้วยรหัสดังต่อไปนี้:
```lua
-- การตั้งค่าเซิร์ฟเวอร์และตัวแปร
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()

ทดลองเล่น

เลือก Test จากเมนูดรอปดาวน์และคลิก Play เดินเข้าไปในเหรียญและยืนยันว่ากระดานผู้นำปรากฏในมุมและจำนวนเหรียญของคุณเพิ่มขึ้นเมื่อคุณเก็บเหรียญมากขึ้น

©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ