35. leaderstats dan value objects

Hampir setiap game Roblox menampilkan papan skor di sudut kanan atas: koin, poin, kemenangan. Roblox membangunnya secara otomatis — jika kamu menyiapkan datanya dengan benar. Triknya: value objects di dalam sebuah folder bernama leaderstats.

Value objects menyimpan satu nilai

Kamu sudah menyimpan angka dan teks di dalam variabel. Roblox juga punya Instances yang tugasnya hanya menyimpan satu nilai, hidup di dalam pohon Instance agar bisa dilihat oleh game:

Value object Menyimpan
IntValue bilangan bulat
NumberValue angka dengan desimal
StringValue teks
BoolValue true / false

Buat salah satunya seperti Instance biasa, lalu baca atau ubah nilainya lewat .Value:

local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Value = 0
-- later:
coins.Value = coins.Value + 1

Aturan leaderstats

Aturan ajaibnya: jika seorang Player punya folder anak bernama persis leaderstats, Roblox akan menampilkan setiap value object di dalamnya pada leaderboard, dengan Name masing-masing objek menjadi judul kolom.

Jadi skor "Coins" per pemain artinya:

Player
 └─ leaderstats   (a Folder)
     └─ Coins     (an IntValue, starting at 0)

Membangunnya saat pemain bergabung

Pemain muncul satu per satu, jadi bangun leaderstats mereka di dalam handler PlayerAdded (Bab 33), lewat sebuah Script di ServerScriptService:

local Players = game:GetService("Players")

Players.PlayerAdded:Connect(function(player)
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"      -- the exact name matters
    leaderstats.Parent = player

    local coins = Instance.new("IntValue")
    coins.Name = "Coins"                  -- becomes the column heading
    coins.Value = 0
    coins.Parent = leaderstats
end)

Dua nama itulah yang melakukan semua pekerjaan: folder harus bernama leaderstats, dan nama value object menjadi kolom. Tulis keduanya dengan benar dan papan skor akan muncul sendiri.

Mengubah skor

Setelah value object ada, menambah skor cukup satu baris. Dari handler sentuhan koin, cari Coins milik pemain dan tambahkan:

local leaderstats = player:FindFirstChild("leaderstats")
local coins = leaderstats:FindFirstChild("Coins")
coins.Value = coins.Value + 1

FindFirstChild (Bab 32) adalah cara aman untuk masuk ke dalam pohon Instance: ia mengembalikan nil alih-alih error ketika sesuatu tidak ada, jadi periksa dulu sebelum dipakai.

Inilah mekanisme di balik mini-proyek terakhir: Touch-to-Collect Coin menyiapkan leaderstats dan menambahkan koin saat disentuh; Collect-All-Coins melakukan hal yang sama untuk banyak koin sekaligus.

PR (Pekerjaan Rumah)

PR terakhir dari buku ini. Potongan kode Roblox — tulis, cek solusinya, coba di Studio.

Soal 1 — Sebuah value Points

Buka exercises/35/homework/01-points-value.lua. Buat sebuah IntValue bernama Points, dimulai dari 0. Cukup value object saja — tanpa folder.

Soal 2 — leaderstats saat bergabung

Buka exercises/35/homework/02-leaderstats.lua. Di dalam handler PlayerAdded, beri setiap pemain folder leaderstats yang berisi sebuah IntValue bernama Wins, dimulai dari 0.

Soal 3 — Tambah kemenangan

Buka exercises/35/homework/03-add-win.lua. Dengan sebuah player yang sudah ada, cari leaderstats mereka lalu Wins, dan tambahkan 1 ke Value-nya — gunakan FindFirstChild, dijaga dengan if.

Tantangan — Dua stats

Buka exercises/35/homework/04-two-stats.lua. Perluas setup PlayerAdded sehingga setiap leaderstats menyimpan dua stat: Coins (IntValue mulai dari 0) dan Rank (StringValue berisi "Novice").

Masih bingung atau sudah selesai? Buka halaman solusi PR.