Önceki eğitimlerde, solma platformları ve ölümcül lav dahil olmak üzere çeşitli oyun özellikleri yaptınız. Bu eğitim, kullanıcıların en uzun süre hayatta kalmaya çalıştığı oynanabilir bir oyuna bunları bir araya getiriyor. Her saniye hayatta kaldıklarında, puanlarına bir puan eklenecek.
Kurulum
Öncelikle, oyununuz için sahneyi ayarlamanız gerekecek. Önceki eğitimde yaptığınız solma platformlarını çoğaltın ve kullanıcıların mümkün olduğunca uzun süre platformlar üzerinde kalmaları için rekabet etmelerine izin verin.
Ayrıca, kullanıcıların platformlardan düştüklerinde ölmesi için ölümcül lav kullanabilir veya sadece onların düşmesine izin verebilirsiniz. Kullanıcıların oyun oynamaya başlamak için platformlara atlayabilecekleri bir SpawnLocation yerleştirdiğinizden emin olun.

Oyuncu puanları
Roblox, kullanıcı istatistiklerini göstermek için yerleşik bir Leaderboard (Liderlik Tablosu) sunar. Oyuncu puanlarını liderlik tablosu aracılığıyla ayarladığınızda, bunlar oyundaki ekranın sağ tarafında görünür.

Daha özelleştirilebilir bilgileri görüntüleme yollarını sonraki eğitimlerde öğreneceksiniz, ancak liderlik tablosu, Roblox'ta görünür bir puanlama sistemi oluşturmanın en basit yoludur.
Oyun durumunu ayarlayan betikleri ServerScriptService içine koymak en iyisidir çünkü bunlar oyun başladığında otomatik olarak çalışır. ServerScriptService içinde SetupPoints adında bir betik oluşturun.

Oyuncuları dinleyin
Roblox'ta, bir hizmet bir dizi yararlı işlevi yerine getiren bir nesnedir. Players hizmetinin, oyuna katılan her kullanıcı için puanları ayarlamak üzere kullanabileceğiniz PlayerAdded adında bir olayı vardır.
Hizmetlere, GetService işlevi aracılığıyla game nesnesinde erişebilirsiniz. game, oyununuzdaki her şeyi içeren, her yerden erişilebilen bir değişkendir.
game:GetService("Players") kullanarak Players hizmeti için bir değişken oluşturun.
Gelen oyuncu için bir parametre ile onPlayerAdded adında bir işlev oluşturun.
onPlayerAdded işlevini PlayerAdded olayına bağlayın.
local Players = game:GetService("Players")local function onPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)
İstatistikler klasörü oluşturun
Bir kullanıcının puanlarının liderlik tablosunda görüntülenmesi için, yapmanız gereken tek şey, Player nesnesinde "leaderstats" adında yeni bir Folder oluşturmak ve puanlarını oraya koymaktır. Yeni nesneler, bir betik içinde Instance.new() işlevi aracılığıyla oluşturulabilir.
Instance.new("Folder") kullanarak yeni bir Folder nesnesi oluşturun ve sonucu leaderstats adında yeni bir değişkende saklayın.
local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")endleaderstats'ın Name özelliğini "leaderstats" olarak ayarlayın.
leaderstats'ı player'a ebeveyn yapın.
local Players = game:GetService("Players")local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = playerendPlayers.PlayerAdded:Connect(onPlayerAdded)
Puanları oluşturun
Liderlik tablosu, leaderstats klasöründeki herhangi bir değeri okur ve bulduğu her şeyi görüntüler.
Bir oyuncunun puanlarını takip edecek bir istatistik eklemek için, yeni bir IntValue nesnesi leaderstats klasörüne ebeveyn olarak eklenebilir. Değer nesnesinin adı, mevcut değeriyle birlikte görüntülenecektir.
- Instance.new() kullanarak yeni bir IntValue nesnesi oluşturmak için points adında bir değişken kullanın.
- Name'i "Points" olarak ayarlayın.
- Value'yi 0 olarak ayarlayın; bu, liderlik tablosunun başlangıçta oyuncu için göstereceği değerdir.
- points nesnesini leaderstats klasörüne ebeveyn yapın.
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)Oyunuzu test edin ve liderlik tablosunun sağ üst köşede kullanıcı adlarınız ve yanlarında bir puan gösterdiğini görmelisiniz.
Zamanı sayın
Her kullanıcı, hayatta kaldıkları her saniye için bir puan kazanmalıdır. Bir while döngüsü ve task.wait() işlevi, her saniye puan değerini güncellemek için kullanılabilir.
- Betiğin sonunda, koşul olarak true olan bir while döngüsü oluşturun.
- Döngü içinde, task.wait() ile 1 saniye bekleyin.
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
endOyuncu listesi
Oyundaki her kullanıcı için kod çalıştırmak istiyorsanız, GetPlayers işlevi tarafından döndürülen dizi üzerinden yineleme yapmanız gerekir.
Dizi, sırayla saklanan bir dizi öğedir. Her öğeye indeks konumuyla erişilebilir, bu da 1'den başlar. Bir dizinin uzunluğunu almak için, önüne # koyabilirsiniz.
- Players:GetPlayers() sonucunu playerList değişkenine saklayın.
- 1 başlangıç değeri ve #playerList bitiş değeri ile bir for döngüsü oluşturun, böylece her oyuncu için bir döngü yinelemesi elde edersiniz.
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
-- playerList içindeki her oyuncu için burada mantığınızı ekleyin
end
endPuanları verin
For döngüsündeki her kullanıcıya bir puan vermek için, diziden kullanıcıyı almanız ve leaderstats klasöründeki Points nesnesine 1 eklemeniz gerekecek.
Bir dizide saklanan nesnelere köşeli parantezler kullanarak erişilir - örneğin, playerList dizisindeki ilk öğeye playerList[1] ile erişebilirsiniz. For döngüsünde playerList[currentPlayer] yazarsanız, her döngü yinelemesinde listedeki her kullanıcıyı geçebilirsiniz.
- playerList[currentPlayer]'daki kullanıcıyı player adında bir değişkende saklayın.
- Kullanıcının Points nesnesini points adında bir değişkende saklayın.
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
local player = playerList[currentPlayer]
local points = player.leaderstats.Points
points.Value += 1
end
endOyunuzu test edin ve liderlik tablosunun oyuncularınızın puanının her saniye 1 artarak gösterildiğini görmelisiniz.
Karakterleri dinleyin
Oyunun amacı, en uzun süre hayatta kalan kişinin kim olduğunu görmek olduğundan, ölen kullanıcıların puanlarının 0'a sıfırlanması gerekecek.
Kullanıcının öldüğünü tespit etmek için, kullanıcının Karakter modelini almanız gerekecek. Bu model, yalnızca Player nesnesi yüklendikten sonra oyuna eklenir ve karakterin kullanılabilir hale geldiğini dinlemek için CharacterAdded olayını kullanabilirsiniz. onCharacterAdded adında, biri karakter için, diğeri oyuncu için olmak üzere iki parametre alan bir işlev oluşturun.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")onCharacterAdded işlevinin parametrelerinde kullanıcıyı dahil etseniz de, gerçek CharacterAdded olayı yalnızca karakteri döndürür, ilişkili kullanıcıyı değil. player nesnesini de geçirmek için, olay bağlantısı için bir anonim işlev kullanın.
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)
endPuanları sıfırlayın
Bir kullanıcı öldüğünde, Humanoid otomatik olarak bir Died olayı tetikler. Bu olayı, puanlarını ne zaman sıfırlayacağınızı öğrenmek için kullanabilirsiniz.
Humanoid, Karakter modelinin içinde bulunur, ancak bu modelin içeriği yalnızca kullanıcı doğduğunda bir araya getirilir. Humanoid nesnesinin yüklenmesini güvenli bir şekilde beklemek için, WaitForChild() işlevini kullanın. Bunu, beklediğiniz çocuğun dize adını geçirerek herhangi bir ebeveyn nesnesinde çağırabilirsiniz. Humanoid için beklemek üzere bir değişken oluşturun: character:WaitForChild("Humanoid").
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
endDied olayına bağlamanız gereken işlev çok kısadır ve yalnızca burada gerekecektir, bu nedenle yine bir anonim işlev kullanabilirsiniz.
- Humanoid'in Died olayına yeni bir anonim işlev bağlayın.
- Anonim işlevde, kullanıcının Points nesnesi için points adında bir değişken oluşturun.
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)
endBunu test edin ve kullanıcının puanının öldüğünde sıfırlandığını görün.
Oyuncuyu kontrol edin
Eğer kullanıcılar öldüklerinde bile puan kazanmaya devam ediyorlarsa, bu oyunun ruhuna aykırıdır, bu nedenle kodun, puan vermeden önce kullanıcıların hayatta olup olmadığını kontrol etmesi gerekir.
Öncelikle, onPlayerAdded işlevinde kullanıcının hayatta olup olmadığını kontrol etmek için kullanılabilecek bir özellik tanımlamanız gerekecek. Bu noktada, kullanıcı henüz hayatta değil ve doğmamış durumda, çünkü karakter modeli henüz eklenmemiştir.
Özellikler, Roblox'taki nesneleri kendi verilerinizle özelleştirmenizi sağlar. Bir özellik, bir isim ve bir değerden oluşur. Herhangi bir nesnede SetAttribute işlevini kullanarak bir tane oluşturabilirsiniz. player üzerinde yeni bir özellik olan "IsAlive" değerini false olarak oluşturmak için SetAttribute çağrısını yapın.
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)
endKullanıcının karakter modeli yeniden doğduğunda, IsAlive değerinin true olarak değiştirilmesi gerekir, böylece kullanıcı tekrar puan kazanmaya başlayabilir.
- onCharacterAdded içinde, player'ın IsAlive özelliğini true olarak ayarlayın.
- onCharacterDied içinde, player'ın IsAlive özelliğini false olarak ayarlayın.
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)
endSon olarak, IsAlive her puan verildiğinde, betiğin sonundaki while döngüsünde kontrol edilmelidir. GetAttribute işlevi, bir özelliğin adını alır ve değeri döndürür. while döngüsünde, puan vermek için kodu if ifadesiyle player:GetAttribute("IsAlive") koşuluyla sarmalayın.
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
local player = playerList[currentPlayer]
if player:GetAttribute("IsAlive") then
local points = player.leaderstats.Points
points.Value += 1
end
end
endArtık oyununuzu test edin ve kullanıcının hayatta kaldıkları her saniye için puan kazandığını, hayatta olmadıklarında ise 0'da kaldığını görmelisiniz. Arkadaşlarınızı davet edin ve en yüksek puanı kimin alacağını görün.
Bu sadece başlangıç: Oyununuzu kullanıcılarınız için geliştirmeye devam edebilirsiniz. İşte bazı ipuçları:
- Tüm platformlar için kodu tek bir betikte toplayarak güncellemeyi çok daha kolay hale getirin.
- Kullanıcıların oyun alanına teleport edilmeden önce bekleyecekleri bir lobide alan oluşturun, böylece kullanıcılar aynı anda başlayabilir.
- Her turda kazananları duyurun.
Nihai kod
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