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

*เนื้อหานี้แปลโดยใช้ 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 เพื่อแสดงสถิติ จำเป็นต้องเก็บค่าที่อยู่ใน 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 เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ