Sekarang Anda dapat mendeteksi kapan seorang pemain telah mengumpulkan koin, bagian tutorial ini mengajarkan Anda cara menghitung berapa banyak koin yang dikumpulkan pemain, dan membuat jumlah itu terlihat di papan peringkat.
Buat skrip modul untuk mencatat koleksi koin
Untuk menangani penyimpanan dan manajemen data koleksi koin masing-masing pemain, Anda perlu membuat objek ModuleScript untuk berisi struktur data dan fungsi yang mengakses data koleksi koin untuk setiap pemain.Skrip modul adalah kode yang dapat mensyaratkan/mengharuskankembali yang dapat diminta oleh skrip lain.Dalam kasus ini, skrip modul CoinService diperlukan sehingga dapat memperbarui data koleksi koin saat pemain menyentuh koin.
Untuk membuat skrip modul:
Di jendela Explorer , hover over ServerStorage dan klik tombol ⊕ . Menu konteks ditampilkan.
Dari menu konteks, pilih ModuleScript .Skrip modul baru ditampilkan di bawah ServerStorage .Anda menempatkan skrip modul ke ServerStorage karena Anda ingin mengelola logika koleksi koin di server.
Ganti nama skrip modul menjadi 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 koleksi koin untuk pemain.Setiap skrip yang membutuhkan skrip modul ini menerima salinan yang sama dari tabel PlayerData, memungkinkan beberapa skrip untuk memodifikasi dan berbagi data koleksi koin.
Umumkan struktur data
Skrip modul dimulai dengan deklarasi tabel kosong, PlayerData , yang dikembalikan di akhir skrip.Ini juga berisi metode aksesori untuk mendapatkan dan mengatur nilai di tabel.
Tabel playerData berisi komentar yang menjelaskan struktur tabel, yang membuat kode lebih mudah dipahami.Dalam kasus ini, tabel playerData berisi userId dan bidang yang sesuai bernama Coins yang mewakili jumlah koin yang dikumpulkan untuk pemain itu.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerDataTetapkan aksesori data lokal
getData() adalah fungsi lokal yang memperoleh data untuk tabel khusus playerData .Jika pemain belum mengumpulkan koin, ia akan mengembalikan tabel DEFAULT_PLAYER_DATA untuk memastikan bahwa setiap pemain memiliki beberapa data yang terkait dengan mereka.Konvensi umum adalah untuk membuat fungsi sederhana dan berhadapan dengan publik yang mengalihkan logika ke fungsi lokal yang melakukan pengangkatan berat.
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 dataendTentukan aksesori data publik
getValue() dan updateValue() adalah fungsi berhadapan dengan publik yang dapat dipanggil oleh skrip lain yang membutuhkan skrip modul ini.Dalam kasus kami, CoinService menggunakan fungsi ini untuk memperbarui data koleksi koin pemain setiap kali pemain itu 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
Implementasikan papan peringkat
Anda dapat mewakili data koleksi koin secara visual dengan papan peringkat di layar.Roblox termasuk 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 skrip modul menjadi Papan Peringkat .
Ganti kode default dengan kode berikut:
local Leaderboard = {}-- Membuat papan peringkat barulocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' adalah nama yang disimpan Roblox mengenali untuk membuat papan peringkatleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Membuat nilai stat leaderboard barulocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Memperbarui nilai status 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 bagaimana papan peringkat bekerja secara lebih terperinci.
Buat papan peringkat
Fungsi setupLeaderboard() membuat instansi folder baru bernama leaderstats dan menetapkannya sebagai anak dari pemain yang ditentukan.Roblox secara otomatis mengenali folder bernama leaderstats sebagai wadah statistik dan membuat elemen UI untuk menampilkan statistik.Ini memerlukan nilai di leaderstats untuk disimpan sebagai objek "nilai" (seperti StringValue , IntValue atau NumberValue ).
-- Membuat papan peringkat barulocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' adalah nama yang disimpan Roblox mengenali untuk membuat papan peringkatleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Membuat nilai stat leaderboard barulocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendPerbarui statistik pemain
setStat() adalah satu-satunya fungsi publik di modul Papan Peringkat .Ini membuat nilai status 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 dan aman untuk mengetahui apakah objek ada sebelum Anda menggunakannya.
-- Memperbarui nilai status 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
Integrasikan skrip modul
Dengan kedua skrip modul Data Pemain dan Papan Peringkat selesai, memerlukannya dalam skrip CoinService untuk mengelola dan menampilkan data koin pemain.Untuk memperbarui CoinService :
Di jendela Penjelajah , buka skrip 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 meja koinlocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Perbarui papan peringkat koinLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Mendefinisikan penangan 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 skrip asli CoinService termasuk:
- Menyatakan COIN_AMOUNT_TO_ADD sebagai jumlah koin yang ditambahkan saat pemain mengumpulkan koin, dan COIN_KEY_NAME sebagai nama kunci yang didefinisikan di PlayerData .
- Membuat fungsi bantuan untuk memperbarui jumlah koin pemain dan statistik papan peringkat yang terkait.
- Mengganti pernyataan penanda print() pengganti di onCoinTouched() dengan panggilan ke updatePlayerCoins() .
Pengujian Permainan
Sudah waktunya untuk melihat apakah koleksi koin bekerja seperti yang diinginkan.Ketika Anda menyentuh dan mengumpulkan koin di game, Anda harus dapat melihat jumlah koin yang telah Anda kumpulkan di UI papan peringkat.Untuk menguji pengalaman Anda:
Di bilah alat, klik tombol Mainkan . Studio memasuki mode pengujian.
Pindahkan karakter Anda untuk menyentuh koin.Jika skrip Anda berfungsi dengan benar, UI papan peringkat ditampilkan dan meningkatkan hitungan koin Anda saat Anda mengumpulkan lebih banyak koin.