ตารางอันดับส่วนนี้ของบทแนะนำการใช้งานสอนวิธีการนับจํานวนเหรียญที่ผู้เล่นรวบรวมและทําให้จํานวนนั้นปรากฏบนลีดเดอร์บอร์ด
คอลเล็กชัน
เพื่อจัดการการจัดเก็บและการจัดการข้อมูลการรวบรวมเหรียญของผู้เล่นแต่ละคนคุณต้องสร้างวัตถุ ModuleScript เพื่อบรรจุโครงสร้างข้อมูลและฟังก์ชันที่เข้าถึงข้อมูลการรวบรวมเหรียญสำหรับผู้เล่นทุกคนสคริปต์โมดูลเป็นรหัสที่สามารถใช้ซ้ำได้ที่สคริปต์อื่นๆ สามารถต้องการได้ในกรณีนี้ CoinService ต้องใช้สคริปต์โมดูลนี้เพื่อให้สามารถอัปเดตข้อมูลการรวบรวมเหรียญได้เมื่อผู้เล่นสัมผัสเหรียญ
เพื่อสร้างสคริปต์โมดูล:
ในหน้าต่าง สํารวจ เลื่อนเมาส์ไปที่ ServerStorage และคลิกที่ปุ่ม ⊕ เมนูบริบทจะแสดงขึ้น
จากเมนูบริบท เลือก ModuleScript สคริปต์โมดูลใหม่จะแสดงภายใต้ ServerStorage คุณกำลังวางสคริปต์โมดูลใน ServerStorage เพราะคุณต้องการจัดการโลจิสติกการรวบรวมเหรียญบนเซิร์ฟเวอร์
เปลี่ยนชื่อสคริปต์โมดูลเป็น PlayerData
รหัส:
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_DATAplayerData[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หากผู้เล่นยังไม่ได้รวบรวมเหรียญ มันจะส่งคืนตาราง 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_DATAplayerData[tostring(player.UserId)] = datareturn dataendกำหนดตัวเข้าถึงข้อมูลสาธารณะ
getValue() และ updateValue() เป็นฟังก์ชันที่เผยแพร่สู่สาธารณะที่สคริปต์อื่นๆ ที่ต้องการสคริปต์โมดูลนี้สามารถโทรได้ในกรณีของเรา CoinService ใช้ฟังก์ชันเหล่านี้เพื่ออัปเดตข้อมูลการเก็บรวบรวมเหรียญของผู้เล่นเมื่อผู้เล่นแตะเหรียญ
function 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 newValueend
ตารางอันดับ
ตารางอันดับรวมระบบที่ติดตั้งไว้ล่วงหน้าที่สร้างลีดเดอร์บอร์ดโดยอัตโนมัติโดยใช้ UI เริ่มต้น
ตารางอันดับ:
ในหน้าต่าง สํารวจ สร้าง ModuleScript ใน ServerStorage จากนั้นเปลี่ยนชื่อสคริปต์โมดูลเป็น ลีดเดอร์บอร์ด
รหัส:
local 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 เพื่อแสดงสถิติต้องการให้ค่าใน leaderstats ถูกจัดเก็บเป็นวัตถุ "ค่า" (เช่น StringValue , IntValue หรือ NumberValue )
-- ตารางอันดับ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อัปเดตสถิติผู้เล่น
setStat() เป็นฟังก์ชันสาธารณะเดียวในโมดูล ลีดเดอร์บอร์ด มันสร้างค่าสถิติสำหรับผู้เล่นที่กำหนดหรือลีดเดอร์บอร์ดเองหากยังไม่มีอยู่
FindFirstChild() ใช้ชื่อของวัตถุและส่งคืนวัตถุหากมันมีอยู่หรือ nil หากไม่มีเป็นวิธีทั่วไปและปลอดภัยในการตรวจสอบว่าวัตถุมีอยู่ก่อนที่คุณจะใช้งาน
-- การอัปเดตมูลค่าสถิติของผู้เล่น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 = valueend
รวมสคริปต์ของโมดูล
เมื่อสคริปต์โมดูล PlayerData และ Leaderboard สมบูรณ์แล้ว จำเป็นต้องใช้ในสคริปต์ CoinService เพื่อจัดการและแสดงข้อมูลเหรียญผู้เล่นเพื่ออัปเดต CoinService :
ในหน้าต่าง 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.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()
ทดสอบการเล่น
ถึงเวลาที่จะดูว่าคอลเลกชันเหรียญทำงานตามที่ตั้งใจไว้หรือไม่เมื่อคุณสัมผัสและรวบรวมเหรียญในเกมคุณควรสามารถเห็นจำนวนเหรียญที่คุณรวบรวมไว้ใน UI บนลีดเดอร์บอร์ดได้เพื่อทดสอบประสบการณ์ของคุณ:
ในแถบเครื่องมือ คลิกปุ่ม เล่น คุณจะเข้าสู่โหมดการทดสอบเล่น Studio
ย้ายตัวละครของคุณเพื่อสัมผัสเหรียญหากสคริปต์ทำงานอย่างถูกต้อง UI ลีดเดอร์บอร์ดจะแสดงและเพิ่มจํานวนเหรียญที่คุณรวบรวมเมื่อคุณรวบรวมเหรียญเพิ่มเติม