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