ตอนนี้คุณสามารถตรวจจับได้ว่าผู้เล่นมีเหรียญสะสมแล้วเมื่อคุณใช้ส่วนนี้ของการฝึกสอนคุณจะได้เรียนรู้วิธีการนับจำนวนเหรียญที่ผู้เล่นมีและทำให้จำนวนนั้นมองเห็นได้บนลีดเดอร์บอร์ด
สร้างสคริปโมดูลเพื่อบันทึกเหรียญ
เพื่อจัดการข้อมูลเกี่ยวกับเหรียญของผู้เล่นแต่ละราย คุณต้องสร้างวัตถุ ModuleScript เพื่อให้มีโครงสร้างข้อมูลและการใช้งานที่เข้าถึงข้อมู
เพื่อสร้างสคริปโมดูล:
ใน หน้าต่าง Explorer เลื่อนเมาส์ไปที่ 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 มี 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_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
ใส่รายการผู้นำ
คุณสามารถแทนที่ข้อมูลเกี่ยวกับคอลเลกชันเหรียญด้วยกระดานผู้นำบนหน้าจอได้ รวมถึง Roblox ระบบการจัดอันดับที่สร้างขึ้นโดยอัตโนมัติโดยใช้ UI เริ่มต้น
เพื่อสร้างกระดานผู้นํา:
ใน หน้าต่าง Explorer ให้สร้าง ModuleScript ใน ServerStorage แล้วเปลี่ยนชื่อหน้าเว็บไซต์ของโมดูลสกริปต์เป็น 1>Leaderboard1>
แทนที่รหัสเริ่มต้นด้วยรหัสต่อไปนี้:
local Leaderboard = {}-- ตารางอันดับlocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- ‘leader統計’ ตารางอันดับ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 และตั้ง
-- ตารางอันดับlocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- ‘leader統計’ ตารางอันดับ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() เป็นตัวแปรสาธารณะเดียวในโมดูล Leaderboard มันสร้างค่าสถิติสำหรับผู้เล่นที่กำหนดหรือตารางผู้นำด้วยกันหากมันยังไม่มีอยู่
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 เพื่อจัดการและแสดงผลของข้อมูลเหรียญผู้เล่น เพื่อปรับปรุง 1>CoinService1> :
ในหน้าต่าง 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 จะปรากฏขึ้นและเพิ่มจำนวนเหรียญของคุณเมื่อคุณเก็บเหรียญมากขึ้น