Menyimpan dan Menampilkan 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 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:

  1. Di jendela Explorer , geser atas ServerStorage dan klik tombol . Menu konteks ditampilkan.

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

    Studio's Explorer window with both the ServerScriptService's plus icon and ModuleScript object highlighted.
  3. Ganti nama skrip modul ke 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 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 PlayerData

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

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

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:

  1. Di jendela Explorer , buat ModuleScript di ServerStorage , lalu ganti nama script modul ke 1> Leaderboard1>.

    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 direservasi Roblox mengenal untuk membuat papan peringkat
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Menciptakan 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 statis seorang 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 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 baru
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 'leaderstats' adalah nama yang direservasi Roblox mengenal untuk membuat papan peringkat
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Menciptakan 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 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 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

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> :

  1. Di jendela Explorer , buka script 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 tabel koin
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)
    -- Perbarui papan peringkat koin
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    end
    -- Mendefinisikan penangani 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 naskah asli CoinService menyertakan:

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

  1. Di bilah menu, klik tombol Bermain . Studio memasuki mode pengujian.

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. 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.