Dalam tutorial sebelumnya, Anda telah membuat berbagai fitur pengalaman termasuk platform memudar dan lava mematikan. Tutorial ini menggabungkan semuanya menjadi pengalaman yang dapat dimainkan di mana pengguna melihat siapa yang dapat bertahan hidup paling lama. Setiap detik mereka bertahan hidup, satu poin akan ditambahkan ke skor mereka.
Siapkan
Pertama-tama, Anda perlu menyiapkan pemandangan untuk pengalaman Anda. Duplikat platform memudar yang Anda buat di tutorial sebelumnya dan biarkan pengguna bersaing untuk tetap berada di papan platform selama mungkin.
Anda juga bisa menggunakan lava mematikan untuk membunuh pengguna ketika mereka jatuh dari platform, atau cukup biarkan mereka jatuh menuju kehancuran mereka. Pastikan Anda menempatkan SpawnLocation di tempat di mana pengguna dapat melompat ke platform untuk mulai bermain.

Poin Pemain
Roblox memiliki Leaderboard bawaan untuk menampilkan statistik pengguna. Ketika Anda mengatur poin pemain melalui papan peringkat, mereka akan muncul di sisi kanan layar dalam pengalaman.

Anda akan mempelajari lebih banyak cara kustomisasi untuk menampilkan informasi di tutorial selanjutnya, tetapi papan peringkat adalah cara termudah untuk membuat sistem skor yang terlihat di Roblox.
Sebaiknya letakkan skrip yang mengatur status pengalaman ke dalam ServerScriptService karena skrip tersebut akan secara otomatis dijalankan ketika pengalaman dimulai. Di ServerScriptService, buat skrip bernama SetupPoints.

Dengarkan Pemain
Di Roblox, layanan adalah objek yang melakukan berbagai fungsi berguna. Layanan Players memiliki sebuah peristiwa bernama PlayerAdded yang dapat Anda gunakan untuk mengatur poin bagi setiap pengguna yang bergabung dengan pengalaman.
Anda dapat mengakses layanan dengan fungsi GetService di objek game. game adalah variabel yang dapat diakses dari mana saja yang berisi segala sesuatu dalam pengalaman Anda.
Buat variabel untuk layanan Players menggunakan game:GetService("Players").
Buat fungsi bernama onPlayerAdded dengan parameter untuk pemain yang masuk.
Hubungkan fungsi onPlayerAdded ke peristiwa PlayerAdded.
local Players = game:GetService("Players")local function onPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)
Buat Folder Statistik
Agar poin pengguna ditampilkan di papan peringkat, yang perlu Anda lakukan hanyalah membuat Folder baru di objek Player mereka yang disebut "leaderstats" dan menempatkan poin mereka di sana. Objek baru dapat dibuat dari dalam skrip melalui fungsi Instance.new().
Buat objek baru Folder menggunakan Instance.new("Folder"), menyimpan hasilnya dalam variabel baru bernama leaderstats.
local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")endAtur properti Name dari leaderstats menjadi "leaderstats".
Parent leaderstats ke player.
local Players = game:GetService("Players")local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = playerendPlayers.PlayerAdded:Connect(onPlayerAdded)
Buat Poin
Sistem papan peringkat membaca nilai apa pun di dalam folder leaderstats dan menampilkan apa pun yang ditemukannya.
Untuk menambahkan statistik yang akan melacak poin pemain, objek IntValue baru dapat diparentkan ke folder leaderstats. Nama objek nilai tersebut akan ditampilkan bersamaan dengan nilai saat ini.
- Atur Name menjadi "Points".
- Atur Value menjadi 0; ini adalah apa yang awalnya akan ditampilkan papan peringkat untuk pemain.
- Parent objek points ke folder leaderstats.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
end
Players.PlayerAdded:Connect(onPlayerAdded)
Uji pengalaman Anda dan seharusnya Anda melihat papan peringkat muncul di kanan atas dengan nama pengguna Anda dan skor poin di samping mereka.
Hitung Waktu
Setiap pengguna harus mendapatkan satu poin untuk setiap detik mereka hidup. Sebuah loop while dan fungsi task.wait() dapat digunakan untuk memperbarui nilai poin setiap detik.
- Di akhir skrip, buat loop while dengan true sebagai syarat.
- Di dalam loop, task.wait() selama 1 detik.
Players.PlayerAdded:Connect(onPlayerAdded)while true dotask.wait(1)end
Daftar Pemain
Untuk menjalankan kode untuk setiap pengguna di pengalaman, Anda perlu mengiterasi melalui array pengguna yang dikembalikan oleh fungsi GetPlayers.
Array adalah daftar item yang disimpan secara berurutan. Setiap item dapat diakses melalui posisi indeks-nya, dimulai dari 1. Anda dapat mendapatkan panjang dari sebuah array dengan menambahkannya dengan #.
- Simpan hasil dari Players:GetPlayers() dalam variabel playerList.
- Buat sebuah loop for dengan nilai awal 1 dan nilai akhir #playerList, sehingga Anda mendapatkan satu iterasi dari loop per pemain.
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList do-- Tambahkan logika Anda di sini untuk setiap pemain dalam playerListendend
Beri Poin
Untuk memberikan satu poin kepada setiap pengguna dalam loop for, Anda perlu mengambil pengguna dari array dan menambahkan 1 ke objek Points yang tersimpan dalam folder leaderstats mereka.
Objek yang disimpan dalam array diakses menggunakan kurung siku - misalnya, item pertama dalam array playerList dapat diakses dengan playerList[1]. Jika Anda menulis playerList[currentPlayer] di dalam loop for, Anda dapat bergerak melalui setiap pengguna dalam daftar dengan setiap iterasi loop.
- Simpan pengguna di playerList[currentPlayer] dalam variabel bernama player.
- Simpan objek Points pengguna dalam variabel bernama points.
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList dolocal player = playerList[currentPlayer]local points = player.leaderstats.Pointspoints.Value += 1endend
Uji pengalaman Anda dan Anda seharusnya menemukan bahwa papan peringkat menunjukkan skor pemain Anda meningkat 1 setiap detik.
Dengarkan Karakter
Tujuan dari pengalaman ini adalah untuk melihat siapa yang dapat bertahan hidup paling lama, jadi pengguna yang mati perlu memiliki poin mereka disetel ke 0.
Anda perlu mendapatkan model Character untuk pengguna untuk mendeteksi kapan mereka mati. Model ini hanya ditambahkan ke pengalaman setelah objek Player dimuat dan Anda dapat menggunakan peristiwa CharacterAdded untuk mendengarkan kapan karakter siap digunakan. Buat fungsi bernama onCharacterAdded dengan dua parameter: satu untuk karakter, satu untuk pemain.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
Meskipun Anda menyertakan pengguna dalam parameter fungsi onCharacterAdded, peristiwa CharacterAdded hanya mengembalikan karakter, bukan pengguna terkait. Untuk meneruskan objek player juga, gunakan fungsi anonim untuk koneksi peristiwa tersebut.
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
end
Reset Poin
Ketika pengguna mati, Humanoid mereka secara otomatis memicu peristiwa Died. Anda dapat menggunakan peristiwa ini untuk mengetahui kapan harus mereset poin mereka.
Humanoid ditemukan di dalam model Character, tetapi isi dari model itu hanya dirakit saat pengguna muncul. Untuk membuat kode Anda aman menunggu objek Humanoid dimuat, gunakan fungsi WaitForChild(). Anda dapat memanggilnya pada objek induk mana pun, dengan menambahkan nama string dari anak yang Anda tunggu. Buat variabel untuk menunggu Humanoid menggunakan character:WaitForChild("Humanoid").
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
end
Fungsi yang perlu Anda hubungkan ke peristiwa Died sangat pendek dan hanya akan dibutuhkan di sini, jadi Anda dapat menggunakan fungsi anonim lagi.
- Hubungkan fungsi anonim baru ke peristiwa Died Humanoid.
- Dalam fungsi anonim, buat variabel bernama points untuk objek Points pemain.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
end)
end
Uji ini dan Anda akan melihat skor pengguna direset ketika mereka mati.
Periksa Pemain
Jika pengguna terus mendapatkan poin bahkan saat mati, itu sama sekali tidak sesuai dengan semangat pengalaman ini, jadi kode perlu memeriksa apakah pengguna hidup sebelum memberi poin.
Anda perlu memulai dengan mendefinisikan atribut dalam fungsi onPlayerAdded yang dapat digunakan untuk memeriksa apakah pengguna hidup. Pada titik ini, pengguna belum hidup dan muncul, karena model karakter mereka masih perlu ditambahkan.
Atribut memungkinkan Anda menyesuaikan objek di Roblox dengan data Anda sendiri. Sebuah atribut terdiri dari nama dan nilai. Anda dapat membuat satu pada objek mana pun menggunakan fungsi SetAttribute. Panggil SetAttribute pada player untuk membuat atribut baru bernama "IsAlive" dengan nilai false.
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player:SetAttribute("IsAlive", false)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
end
Setelah model karakter pengguna respawn, nilai dari IsAlive perlu diubah menjadi true agar pengguna dapat mulai mendapatkan poin lagi.
- Di onCharacterAdded, atur atribut IsAlive dari player menjadi true.
- Di onCharacterDied, atur atribut IsAlive dari player menjadi false.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
player:SetAttribute("IsAlive", true)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
player:SetAttribute("IsAlive", false)
end)
end
Akhirnya, IsAlive harus diperiksa sebelum setiap poin diberikan dalam loop while di akhir skrip. Fungsi GetAttribute mengambil nama atribut dan mengembalikan nilainya. Di dalam loop while, bungkus kode untuk memberikan poin dalam pernyataan if dengan syarat player:GetAttribute("IsAlive").
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList dolocal player = playerList[currentPlayer]if player:GetAttribute("IsAlive") thenlocal points = player.leaderstats.Pointspoints.Value += 1endendend
Uji pengalaman Anda sekarang dan Anda seharusnya menemukan pengguna mendapatkan poin setiap detik mereka hidup, dan tetap di 0 saat tidak hidup. Ajak teman-teman Anda bermain bersamamu dan lihat siapa yang bisa mendapatkan skor tertinggi.
Ini baru permulaan: Anda dapat terus meningkatkan pengalaman Anda bagi pengguna. Berikut adalah beberapa tips:
- Tempatkan kode untuk semua platform ke dalam satu skrip, membuatnya jauh lebih mudah untuk diperbarui.
- Buat area lobi di mana pengguna menunggu untuk dipindahkan ke area pengalaman, sehingga pengguna dapat memulai secara bersamaan.
- Umumkan pemenang dari setiap putaran.
Kode Akhir
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
player:SetAttribute("IsAlive", true)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
player:SetAttribute("IsAlive", false)
end)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player:SetAttribute("IsAlive", false)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for i = 1, #playerList do
local player = playerList[i]
if player:GetAttribute("IsAlive") then
local points = player.leaderstats.Points
points.Value += 1
end
end
end