Önceki derslerde, solma platformları ve ölümcül lav gibi çeşitli deneyim özellikleri oluşturdunuz. Bu ders, kullanıcıların en uzun süre hayatta kalmaya çalıştıkları oynanabilir bir deneyim oluşturmak için bunları bir araya getiriyor. Her saniye hayatta kaldıklarında, puanlarına bir puan eklenecek.
Ayarlama
Öncelikle, deneyiminiz için sahneyi ayarlamanız gerekecek. Önceki derste yaptığınız solma platformlarını çoğaltın ve kullanıcıların mümkün olduğunca uzun süre platform tahtasında kalmaları için rekabet etmelerini sağlayın.
Kullanıcıların platformlardan düştüklerinde ölmesi için ölümcül lav da kullanabilirsiniz veya sadece onların düşmesine izin verebilirsiniz. Kullanıcıların oyun oynamaya başlayabilmesi için platformlara atlayabilecekleri bir SpawnLocation yerleştirdiğinizden emin olun.

Oyuncu puanları
Roblox, kullanıcı istatistiklerini gösteren yerleşik bir Leaderboard (Liderlik Tablosu) sunar. Oyuncu puanlarını liderlik tablosunda ayarladığınızda, deneyimin sağ tarafında ekranda görünürler.

Bilgileri görüntülemek için daha özelleştirilebilir yolları sonraki derslerde öğreneceksiniz, ancak liderlik tablosu, Roblox'ta görülebilir bir puan sistemi oluşturmanın en basit yoludur.
Deneyim durumunu ayarlayan betikleri ServerScriptService içerisinde yerleştirmek en iyisidir çünkü deneyim başladığında otomatik olarak çalışacaklardır. ServerScriptService içinde SetupPoints adında bir betik oluşturun.

Oyuncuları dinleyin
Roblox'ta bir hizmet (service), bir dizi yararlı işlevi gerçekleştiren bir nesnedir. Players servisi, deneyime katılan her kullanıcı için puanları ayarlamak üzere kullanabileceğiniz PlayerAdded adında bir olaya sahiptir.
Hizmetlere, GetService fonksiyonu ile game nesnesinde erişebilirsiniz. game, deneyiminizdeki her şeyi içeren, her yerden erişilebilir bir değişkendir.
game:GetService("Players") kullanarak Players servisi için bir değişken oluşturun.
Gelen oyuncu için bir parametreye sahip onPlayerAdded adında bir fonksiyon oluşturun.
onPlayerAdded fonksiyonunu 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ülenmesini sağlamak için tek yapmanız gereken, Player nesnesinde "leaderstats" adında yeni bir Folder oluşturarak puanlarını oraya koymaktır. Yeni nesneler, bir betik içinden Instance.new() fonksiyonu 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 olarak atayı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 her türlü değeri okuyarak bulduğu her şeyi gösterir.
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ülenir.
- 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 tablosunda başlangıçta oyuncu için gösterilecektir.
- points nesnesini leaderstats klasörüne ebeveyn olarak atayı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)
Deneyiminizi test edin ve sağ üst köşede kullanıcı adlarınızın ve yanında bir puan gösterildiğini görmelisiniz.
Zamanı say
Her kullanıcı, hayatta kaldığı her saniye için bir puan kazanmalıdır. Bir while döngüsü ve task.wait() fonksiyonu, her saniye puan değerini güncellemek için kullanılabilir.
- Betiğin sonunda true koşulu ile bir while döngüsü oluşturun.
- Döngüde task.wait() ile 1 saniye bekleyin.
Players.PlayerAdded:Connect(onPlayerAdded)while true dotask.wait(1)end
Oyuncu listesi
Deneyimdeki her kullanıcı için kod çalıştırmak için, GetPlayers fonksiyonu tarafından döndürülen kullanıcıların dizisini döngüye almanız gerekiyor.
Bir dizi, sırayla depolanan bir dizi öğedir. Her öğeye indeks konumuyla erişilebilir, başlangıç noktası 1'dir. Bir dizinin uzunluğunu öğrenmek için başına # yazabilirsiniz.
- Players:GetPlayers() sonucunu playerList değişkenine depolayın.
- Başlangıç değeri 1 ve bitiş değeri #playerList olan bir for döngüsü oluşturun, böylece her kullanıcının bir döngü iterasyonu almasını sağlarsınız.
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList do-- Kullanıcı listesinde her bir kullanıcı için mantığınızı buraya ekleyinendend
Puanları ödüllendirin
For döngüsündeki her kullanıcıya bir puan ödüllendirmek için, diziden kullanıcıyı almalı ve leaderstats klasöründeki Points nesnesine 1 eklemelisiniz.
Bir dizide depolanan nesnelere köşe parantezleri kullanılarak erişilir - örneğin, playerList dizisinin ilk öğesine playerList[1] ile erişilebilir. Eğer döngüde playerList[currentPlayer] yazarsanız, döngünün her iterasyonuyla listedeki her kullanıcıyı geçebilirsiniz.
- playerList[currentPlayer] üzerindeki kullanıcıyı player adında bir değişkene depolayın.
- Kullanıcının Points nesnesini points adında bir değişkene depolayın.
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList dolocal player = playerList[currentPlayer]local points = player.leaderstats.Pointspoints.Value += 1endend
Deneyiminizi test edin ve liderlik tablosunun kullanıcı puanınızı her saniye 1 artarak gösterdiğini göreceksiniz.
Karakterleri dinleyin
Deneyimin amacı, en uzun süre hayatta kalan kişiyi görmek olduğundan, ölen kullanıcıların puanlarının sıfırlanması gerekir.
Kullanıcının öldüğünü tespit etmek için Character modeline erişmeniz gerekir. Bu model, kullanıcı Player nesnesi yüklendikten sonra deneyime eklenir ve karakter kullanıma hazır olduğunda dinlemek için CharacterAdded olayını kullanabilirsiniz. İki parametreye sahip onCharacterAdded adında bir fonksiyon oluşturun: biri karakter için, diğeri oyuncu için.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
onCharacterAdded fonksiyonunun parametrelerinde kullanıcıyı dahil etseniz de, gerçek CharacterAdded olayı yalnızca karakteri döndürdüğünden, player nesnesini de iletebilmek için olay bağlantısı için anonim bir fonksiyon kullanmalısınız.
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
Puanları sıfırlama
Bir kullanıcı öldüğünde, Humanoid otomatik olarak bir Died olayı tetikler. Bu olayı, puanları sıfırlamak için ne zaman tetikleyeceğinizi öğrenmekte kullanabilirsiniz.
Humanoid, Karakter modelinin içinde bulunur, ancak o modelin içeriği, kullanıcı doğduğunda yalnızca montelenir. Humanoid nesnesinin yüklenmesini güvenli bir şekilde beklemek için, WaitForChild() fonksiyonunu kullanın. Bunu herhangi bir ebeveyn nesnede çağırabilir ve beklediğiniz çocuğun isim dizesini parametre olarak geçebilirsiniz. character:WaitForChild("Humanoid") kullanarak Humanoid için bir değişken oluşturun.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
end
Died olayına bağlamanız gereken fonksiyon çok kısa ve yalnızca burada kullanılacağı için, tekrar anonim bir fonksiyon kullanabilirsiniz.
- Humanoid'in Died olayına yeni bir anonim fonksiyon bağlayın.
- Anonim fonksiyonda, 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)
end
Bunu test ettiğinizde, kullanıcının puanının öldüğünde sıfırlandığını göreceksiniz.
Oyuncuyu kontrol et
Eğer kullanıcılar öldüklerinde bile puan kazanmaya devam ederse, bu deneyimin ruhuna uygun olmaz, bu yüzden kodun kullanıcıların puan kazanmadan önce hayatta olup olmadıklarını kontrol etmesi gerekir.
Başlangıç olarak, onPlayerAdded fonksiyonunda kullanıcıların hayatta olup olmadığını kontrol etmek için kullanılabilecek bir öznitelik (attribute) tanımlamanız gerekir. Bu aşamada, kullanıcı henüz hayatta değil ve doğmamıştır, çünkü karakter modeli henüz eklenmemiştir.
Öznitelikler, Roblox'taki nesneleri kendi verilerinizle özelleştirmenizi sağlar. Bir öznitelik, bir isim ve bir değerden oluşur. SetAttribute fonksiyonunu kullanarak herhangi bir nesnede oluşturabilirsiniz. player üzerinde yeni bir öznitelik olan "IsAlive" adında bir öznitelik oluşturmak için SetAttribute çağrısını yapın ve değerini false 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)
end
Kullanıcının karakter modeli yeniden doğduğunda, IsAlive değerinin true olarak değiştirilmesi gerekir, böylece kullanıcı tekrar puan kazanabilir.
- onCharacterAdded içinde, player'ın IsAlive özniteliğini true olarak ayarlayın.
- onCharacterDied içinde, player'ın IsAlive özniteliğ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)
end
Son olarak, IsAlive her puan ödüllendirilmeden önce while döngüsünde kontrol edilmelidir. GetAttribute fonksiyonu, bir özniteliğin adını alır ve değerini döndürür. while döngüsünde, puan ödüllendirme kodunu if ifadesi ile sarmalayın ve koşul player:GetAttribute("IsAlive") olarak ayarlayın.
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
Artık deneyiminizi test edin ve kullanıcının hayatta kaldığı her saniye puan kazandığını, hayatta olmadığında ise 0'da kaldığını göreceksiniz. Arkadaşlarınızı yanınıza alın ve kimlerin en yüksek puanı alabileceğini görün.
Bu sadece bir başlangıçtır: deneyiminizi kullanıcılarınız için geliştirerek devam edebilirsiniz. İşte bazı ipuçları:
- Tüm platformlar için kodu tek bir betikte toplayarak güncellemeleri çok daha kolay hale getirin.
- Kullanıcıların deneyim alanına teleport edilmelerini sağlayan bir lobi alanı oluşturun, böylece kullanıcılar aynı anda başlayabilir.
- Her turun kazananlarını 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