Puanlama Noktaları

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Önceki eğitimlerde, fading platforms (solgunan platformlar) ve deadly lava (öldüren lav) gibi çeşitli deneyim özellikleri yaptınız. Bu eğitim, bunları bir oynanabilir deneyime bağlıyor, kullanıcıların en uzun süre hayatta kalabileceğini görüyor. Her saniye hayatta kalan kullanıcı için bir puan eklenir.

Yükleme

Öncelikle, deneyimin için sahneyi ayarlamanız gerekir. Önceki eğitimde yaptığınız solan platformları kopyala ve kullanıcıların platformlardaki kalma süresini olabildiğince uzun süre tutmak için kullanıcıların rekabet etmesine izin verin.

Ayrıca, kullanıcıları platformlardan düştüğünde öldürmek için öldürücü lav kullanabilirsiniz, ya da sadece onların sona ermesine izin verin. Kullanıcıların oyuna başlaması için bir SpawnLocation yerleştirin.

Oyuncu Puanları

Roblox, kullanıcı istatistiklerini göstermek için Lider tablosu içerir. Player puanlarınızı liderlik tablosuayarladığınızda, ekranınızın sağ tarafında görüntülenir.

Leaderboard with username and points shown

Daha son eğitimlerde bilgileri göstermek için daha özelleştirilebilir yollar öğreneceksiniz, ancak lider tablosu Roblox'ta görünür puanlama sistemini yapmanın en basit yoludur.

Deneyim devletini ayarlayan kodları ServerScriptService içine koymak en iyidir, çünkü deneyim başladığında otomatik olarak çalışacaktır. ServerScriptService içinde, deneyim başladığında oluşturulan bir kod olan SetupPoints adlı bir kod oluşturun.

SetupPoints script in place in ServerScriptService in the Explorer window

Oyuncular Dinleniyor

Roblox'ta, bir hizmet bir dizi faydalı işlevi yerine getiren bir nesnedir. Players hizmetinin bir etkinliği vardır, böylece deneyime katılan her kullanıcı için puan ayarlayabilirsiniz.

Class.DataModel|game nesnede game işleviyle hizmetlere erişebilirsiniz. game her deneyiminizdeki şeyi içeren yerel bir değişkendir.

  1. Oyuncular hizmeti için bir değişken oluşturan şu kaynakları kullanın: game:GetService("Players") .

  2. Giren oyuncunun için bir parametre içeren onPlayerAdded bir işlev oluşturun.

  3. PlayerAdded etkinliğine onPlayerAdded işlevini bağla.


    local Players = game:GetService("Players")
    local function onPlayerAdded(player)
    end
    Players.PlayerAdded:Connect(onPlayerAdded)

İstatistikler'i Oluştur

Bir kullanıcının puanlarını liderlik tablosugörmek için yapmanız gereken tek şey, onların Folder nesinde yeni bir Player oluşturmak ve onların puanlarını içine koymak. Yeni nesler "leaderstats" içinde bir kullanıc

  1. Yeni bir Folder nesnesi oluşturmak için Instance.new("Folder") , sonucu yeni bir değişken olarak leaderstats adında saklar.


    local function onPlayerAdded(player)
    local leaderstats = Instance.new("Folder")
    end
  2. leaderstats öğesinin Adını "leaderstats" olarak ayarla.

  3. Ebeveyn leaderstats ile player .


    local Players = game:GetService("Players")
    local function onPlayerAdded(player)
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    end
    Players.PlayerAdded:Connect(onPlayerAdded)

Noktalar Oluşturulması

Lider tablosu sistemi herhangi bir değeri leaderstats klasöründe okur ve bulduğu şeyi gösterir.

Bir oyuncunun puanlarını izleyen bir istatistik eklemek için, yeni bir IntValue nesnesi leaderstats klasörüne ebeveyn olabilir. Değer nesnesinin ismi, mevcut değerinin yanında görüntülenir.

  1. Yeni bir IntValue nesnesi oluşturmak için Instance.new() ile çalışan 2> points2> değişken kullanın.
  2. Name ını "Points" ile ayarla.
  3. Value ını 0 için ayarla; bu, lider tablosunun oyuncunun başlangıç ​​için ilk olarak gösterdiği şeydir.
  4. Ebeveyn olarak points nesneyi leaderstats klasörüne.

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 lider tablosunun sağ üstte kullanıcılarınızın isimleriyle birlikte görünmesi gerekir ve bir puan skoru onların yanında.

Zamanı Sayma

Her kullanıcı, hayatta olduğu her saniye için bir puan kazanmalıdır. Bir mientras loop ve Library.task.wait() işlevi, her saniye puanların değerini güncellemenin kullanılabilir yollarıdır.

  1. Yazının sonunda, while koşulu ile true koşulu arasında bir while ループ oluşturun.
  2. Library.task.wait() 1 saniye boyunca sürecek.

Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
end

Oyuncu Listesi

Her kullanıcının deneyimdeki kodu çalıştırmak için, Class.Players:GetPlayers işlevinin döndüğü GetPlayersınızı itereceksiniz.

Bir matris, önlü sıralanmış bir listedir. Her bir öğe, indeksi pozisyonu ile erişilebilir. Bir matrisin uzunluğunu 1 ile başlayan bir öğe kümesi ile elde edebilirsiniz.

  1. Sonucu Players:GetPlayers() ile bir playerList 변수 içine saklayın.
  2. Bir başlangıç değeri 1 ve bir son değeri #playerList ile 1 çevirimi oluştur, böylece oyuncu başına bir çevirim alırsın.

while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
-- PlayerList'deki her oyuncuya mantığınızı ekleyin
end
end

Puan Ödüllendirme

Kullanıcılara for döngüsünde her kullanıcıya bir puan vermek için kullanıcıyı matrisinden çıkarmanız gerekir ve 1'i Puanlar nesneyine kaydedilen onların leaderstats klasörüne eklemelisiniz.

Bir matris içinde saklanan nesneler boşluk çizgileri kullanılarak erişilir - durum, playerList matrisindeki ilk öğe playerList[1] ile erişilebilir. Eğer for döngüsüne yazarsanız, listede her kullanıcıyla her itérationde hareket edebil

  1. Kullanıcıyı playerList[currentPlayer] olarak değiştken bir değişkende sakla.
  2. Kullanıcının Puanları nesnesini points değişkenine saklayın.
  3. Class.IntValue.Value|Value özelliğini points ile bir points.Value + 1 arasına ayarlayı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
end

Deneyinizi test edin ve lider tablosunun her saniye oyuncunuzun puanını 1 artırdığını görmelisiniz.

Karakterleri Dinlemek

Deneyin amacı, kimin en uzun süre hayatta kalabileceğini görmek, bu yüzden ölen kullanıcıların puanlarını 0'a sıfırlamaları gerekecek.

Karakter öldüğünde tespit etmek için kullanıcı için Karakter Modeli almanız gerekir. Bu model sadece deneyime sonra Class.Player nesneyi yüklendiğinde eklenir ve oyuncuhazır olmas


local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")

Kullanıcıyı onCharacterAdded işlevinin parametrelerine dahil etmenize rağmen, asıl CharacterAdded etkinliği sadece karakteri, değil de ilişkili kullanıcıyı geri verir. e şekilde de 1> oyuncu1> nesini kullanırken, bir 4>anonim fonksiyon4>


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

Noktaları Sıfırlama

Bir kullanıcı öldüğünde, onların Humanoid otomatik olarak bir Died etkinliği başlatır. Bu etkinliği kullanarak noktalarınızı sıfırlama zamanını belirleyebilirsiniz.

Humanoid, Karakter modelinde bulunur, ancak bu modelin içeriği sadece kullanıcının oluşturduğu sahne olarak toplanır. Kodunuzu güvenli bir şekilde Humanoid nesneyi yüklemeye kullanmak için WaitForChild() işlevini kull


local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
end

Ölü olayına bağlanmanız gereken işlev çok kısa ve sadece burada gerekli olacak, böylece anonim bir işlev kullanabilirsiniz.

  1. Yeni bir anonim işlevi ölü etkinliğine bağla.
  2. Anonim işlevinde, oyuncunun points nesnesi için points adında bir değişken oluştur.
  3. Class.IntValue.Value|Value özelliğini points ile 0 arasında ayarla.

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 edin ve kullanıcının puanı öldüğünde yenileneceğini göreceksiniz.

Oyuncuyu Kontrol Etme

Kullanıcılar ölü olduğunda bile puan kazanmaya devam ederse, kodun bir puanı vermeden önce kullanıcıların hayatta olduğunu kontrol etmesi gerekir.

Kullanıcının canlı olup olmadığını kontrol etmek için onPlayerAdded işlevinde bir onPlayerAdded tanımlayarak başlamanız gerekir. Bu noktada, kullanıcının canlı olup olmadığını kontrol etmek için karakter modeli hala eklenmelidir.

Özellikler, Roblox'ta kendi verilerinizle nesneleri özelleştirebilirsiniz. Bir özellik bir isim ve bir değerden oluşur. SetAttribute işlevini kullanarak herhangi


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 değiştirilmesi gerekir true , böylece kullanıcı tekrar puan kazanabilir.

  1. In onCharacterAdded , IsAlive özelliğini player ın içine 1>doğru1> ayarlar.
  2. In onCharacterDied , IsAlive özelliğini player ın 1> false1> değerine ayarlar.

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 herhangi bir noktanın ödül edildiğindeki while döngüsünden önce kontrol edilmelidir. Class.Instance:GetAttribute()|GetAttribute


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
end

Şimdi deneyiminizi test edin ve kullanıcının her saniye hayatta olduğunda puan kazandığını görmelisiniz ve yaşlı değilken 0'da kalmalısınız. Arkadaşlarınızla oynayın ve en yüksek puanı kimin alabileceğini görün.

Bu sadece bir başlat: kullanıcılarınız için deneyiminizi geliştirmeyi sürdürebilirsiniz. İşte bazı ipuçları:

  • Tüm platformlar için kodu tek bir senaryoda birleştirin, böylece güncelleme çok daha kolay hale gelir.
  • Kullanıcıların deneyim alanına ışınlanmasını beklediği 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