Catat dan tampilkan data pemain

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.


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:

  1. Di jendela Explorer , hover over ServerStorage dan klik tombol . Menu konteks ditampilkan.

  2. 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.

    Studio's Explorer window with both the ServerScriptService's plus icon and ModuleScript object highlighted.
  3. Ganti nama skrip modul menjadi PlayerData .

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. 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_DATA
    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

    Skrip 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 PlayerData

    Tetapkan 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_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end

    Tentukan 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]
    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

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:

  1. Di jendela Explorer , buat ModuleScript di ServerStorage , lalu ganti nama skrip modul menjadi Papan Peringkat .

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. Ganti kode default dengan kode berikut:


    local Leaderboard = {}
    -- Membuat papan peringkat baru
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 'leaderstats' adalah nama yang disimpan Roblox mengenali untuk membuat papan peringkat
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Membuat nilai stat leaderboard baru
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end
    -- Memperbarui nilai status pemain
    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

    Bagian 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 baru
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 'leaderstats' adalah nama yang disimpan Roblox mengenali untuk membuat papan peringkat
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Membuat nilai stat leaderboard baru
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end

    Perbarui 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 pemain
    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

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 :

  1. Di jendela Penjelajah , buka skrip CoinService .

  2. Ganti kode yang ada dengan kode berikut:


    -- Menginisialisasi layanan dan variabel
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Modul
    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)
    -- Perbarui meja koin
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)
    -- Perbarui papan peringkat koin
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    end
    -- Mendefinisikan penangan acara
    local function onCoinTouched(otherPart, coin)
    if coin:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Pemain menyentuh koin
    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
    -- Mengatur pendengar acara
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    Perubahan pada skrip asli CoinService termasuk:

    • Mengimpor modul Data Pemain dan Papan Peringkat dengan fungsi require().
    • 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:

  1. Di bilah alat, klik tombol Mainkan . Studio memasuki mode pengujian.

    Play button highlighted in Studio's playtesting options.
  2. 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.