Sekarang Anda dapat mendeteksi ketika seorang pemain telah mengumpulkan koin, bagian ini dari tutorial menunjukkan cara menghitung berapa banyak koin yang telah dikumpulkan pemain, dan membuat jumlah itu terlihat di papan peringkat.
Buat Skrip Modul untuk Mengumpulkan Koin
Untuk menangani penyimpanan dan manajemen data kumpulan koin setiap pemain, Anda harus membuat objek ModuleScript untuk menyimpan struktur data dan fungsi yang mengakses data kumpulan koin untuk setiap pemain. Script modul adalah kode yang dapat dimodifikasi yang dapat diminta oleh skrip lain. Dalam kasus ini, CoinService
Untuk membuat naskah modul:
Di jendela Explorer , geser atas ServerStorage dan klik tombol ⊕ . Menu konteks ditampilkan.
Dari menu konteks, pilih ModuleScript . Sebuah naskah modul baru ditampilkan di bawah ServerStorage . Anda menempatkan naskah modul ke dalam ServerStorage karena Anda ingin mengelola logika mata uang di server.
Ganti nama skrip modul ke PlayerData .
Ganti kode default dengan kode berikut:
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 PlayerDataPenjelasan KodeSkrip modul mendefinisikan tabel PlayerData yang berisi nol atau banyak tabel playerData, yang mewakili data kumpulan koin untuk pemain. Setiap script yang memerlukan modul skrip ini menerima salinan yang sama dari tabel PlayerData, yang memungkinkan beberapa script untuk mengubah dan berbagi data kumpulan koin.
Menetapkan Struktur Data
Skrip modul dimulai dengan pengumuman tabel kosong, PlayerData , yang dikembalikan pada akhir skrip. Ini juga mengandung metode aksesori untuk mendapatkan dan menetapkan nilai di tabel.
Tabel playerData berisi komentar yang menggambarkan struktur tabel, yang membuat kode lebih mudah dimengerti. Dalam hal ini, tabel playerData berisi userId dan kolom yang sesuai bernama 1> Coins1> yang mewakili jumlah koin yang dikumpulkan untuk pemain itu.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerDataMendefinisikan akses lokal data
getData() adalah fungsi lokal yang mengambil data untuk tabel playerData tertentu. Jika seorang pemain belum mengumpulkan koin, itu mengembalikan tabel DEFAULT_PLAYER_DATA untuk menjamin bahwa setiap pemain memiliki beberapa data yang terkait dengan mereka. Konvensi umum adalah unt
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 dataendMendefinisikan akses data publik
getValue() dan updateValue() adalah fungsi-fungsi antarmuka publik yang dapat dipanggil oleh skrip lain yang memerlukan data koin koleksi koin pemain setiap kali pemain menyentuh koin. Dalam kasus kami, CoinService menggunakan fungsi-fungsi ini untuk menyelesaikan data koin pemain setiap kali pemain menyentuh koin.
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
Menerapkan Papan Peringkat
Anda dapat mewakili data koleksi koin secara visual dengan papan peringkat pada layar. Roblox menyertakan sistem bawaan yang secara otomatis menghasilkan papan peringkat menggunakan UI default.
Untuk membuat papan peringkat:
Di jendela Explorer , buat ModuleScript di ServerStorage , lalu ganti nama script modul ke 1> Leaderboard1>.
Ganti kode default dengan kode berikut:
local Leaderboard = {}-- Membuat papan peringkat barulocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' adalah nama yang direservasi Roblox mengenal untuk membuat papan peringkatleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Menciptakan nilai stat leaderboard barulocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Memperbarui nilai statis seorang pemainfunction 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 LeaderboardPenjelasan KodeBagian berikut menjelaskan cara papan peringkat bekerja lebih rinci.
Membuat Papan Peringkat
Fungsi setupLeaderboard() membuat kumpulan item baru bernama leaderstats dan menetapkannya sebagai anak dari pemain yang ditentukan. Roblox sec
-- Membuat papan peringkat barulocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' adalah nama yang direservasi Roblox mengenal untuk membuat papan peringkatleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Menciptakan nilai stat leaderboard barulocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendMemperbarui Statistik Pemain
setStat() adalah satu-satunya fungsi publik dalam modul Papan Peringkat . Menciptakan nilai stat untuk pemain tertentu atau papan peringkat itu sendiri jika belum ada.
FindFirstChild() mengambil nama objek dan mengembalikan objek jika ada, atau nil jika tidak. Ini adalah metode umum, aman untuk mengetahui apakah objek ada sebelum Anda menggunakannya.
-- Memperbarui nilai statis seorang pemainfunction 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
Mengintegrasi Skrip Modul
Dengan kedua PlayerData dan Leaderboard modul skrip, selesaikan mereka dalam CoinService script untuk mengelola dan menampilkan data koin pemain. Untuk memperbarui 1> CoinService1> :
Di jendela Explorer , buka script CoinService .
Ganti kode yang ada dengan kode berikut:
-- Menginisialisasi layanan dan variabellocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Modullocal 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)-- Perbarui tabel koinlocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Perbarui papan peringkat koinLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Mendefinisikan penangani acaralocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Pemain menyentuh koincoin.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-- Mengatur pendengar acarafor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endPenjelasan KodePerubahan pada naskah asli CoinService menyertakan:
- Mengklarifikasi COIN_AMOUNT_TO_ADD sebagai jumlah koin yang akan ditambahkan ketika seorang pemain mengumpulkan koin, dan COIN_KEY_NAME sebagai nama kunci yang didefinis dalam PlayerData .
- Membuat fungsi pembantu updatePlayerCoins() untuk menyelesaikan jumlah koin pemain dan statistik papan peringkat yang terkait.
- Mengganti pengganti print() dengan panggilan ke onCoinTouched() .
Ujian
Saatnya untuk melihat apakah koleksi koin bekerja seperti yang diharapkan. Saat Anda menyentuh dan mengumpulkan koin dalam game, Anda seharusnya dapat melihat jumlah koin yang telah Anda kumpulkan di UI papan peringkat. Untuk menguji pengalaman Anda:
Di bilah menu, klik tombol Bermain . Studio memasuki mode pengujian.
Pindahkan karakter Anda untuk menyentuh koin. Jika skrip Anda bekerja dengan benar, UI papan peringkat ditampilkan dan meningkatkan jumlah koin Anda saat Anda mengumpulkan lebih banyak koin.