Artık bir oyuncunun bir para topladığını tespit edebildiğinize göre, bu eğitimin bu bölümü, oyuncuların kaç para topladığını saymayı ve bu miktarı bir liderlik tablosugörünür hale getirmeyi öğretir.
Para koleksiyonunu kaydetmek için bir modül senaryosu oluştur
Her oyuncunun para koleksiyonu verilerini depolayıp yönetmek için, her oyuncunun para koleksiyonu verilerine erişen bir veri yapısı ve işlevleri içeren bir ModuleScript nesne oluşturmanız gerekir.Modül kodları, diğer kodların gerektirebileceği yeniden kullanılabilir koddur.Bu durumda, CoinService bu modül senaryosunu gerektirir, böylece oyuncular para dokununca para koleksiyonu verilerini güncelleyebilir.
Bir modül senaryosu oluşturmak için:
Araştırıcı penceresinde, Sunucu Depolama üzerine gelin ve ⊕ düğmesine tıklayın. Bir bağımsız menü görüntülenir.
Kontekst menüsünden ModülScript seçin.Yeni bir modül senaryosu ServerStorage altında görüntülenir.Sunucuda para koleksiyon mantığını yönetmek istediğiniz için bir modül kodunu ServerStorage içine yerleştiriyorsunuz çünkü sunucuda para koleksiyon mantığını yönetmek istiyorsunuz.
Modül kodunu OyuncuVerileri olarak yeniden adlandırın.
Varsayılan kodu aşağıdaki kodla değiştirin:
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerDataKod açıklamasıModül kodu, bir oyuncunun para koleksiyonu verilerini temsil eden sıfır veya çok sayıda PlayerData tablo içeren bir playerData tablosu tanımlar.Bu modül koduna ihtiyaç duyan her senaryo, PlayerData tablosunun aynı kopyasını alır ve çok sayıda senaryonun para koleksiyonu verilerini değiştirmesine ve paylaşmasına izin verir.
Veri yapılarını ilan et
Modül kodu, boş bir tablo ilanı ile başlar, PlayerData , kodun sonunda geri döndürülür.Ayrıca tabloda değerler almak ve ayarlamak için yardımcı yöntemler de içerir.
playerData tablosu, kodu daha kolay anlamak için tablonun yapısını tanımlayan yorumlar içerir.Bu durumda, bir playerData tablosu bir userId ve bu oyuncunun topladığı para miktarını temsil eden bir alan olan Coins adlı bir alan içerir.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerDataYerel bir veri erişimcisini tanımlayın
getData() özel bir playerData tablosu için veri alan yerel bir işlevdir.Bir oyuncu bir para toplamadıysa, her oyuncunun onlarla ilgili bazı verilere sahip olduğundan emin olmak için bir DEFAULT_PLAYER_DATA tablosu döndürür.Ortak bir anlaşma, ağır kaldırmayı yapan yerel ölçekli işlevlere mantığı yükleyen basit, halka açık işlevler oluşturmaktır.
local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataendHalka açık veri erişimcilerini tanımlayın
getValue() ve updateValue() özellikle bu modül kılavuzuna ihtiyaç duyan diğer kodların çağırabileceği halka açık işlevlerdir.Bizim durumumuzda, CoinService bu işlevleri kullanarak bir oyuncunun para koleksiyonu verilerini herhangi bir zamanda günceller, oyuncu bir paraya dokunduğunda.
function PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueend
Bir liderlik tablosuuygulayın
Ekran üzeri liderlik tablosuile para koleksiyonu verilerini görsel olarak temsil edebilirsiniz.Roblox, varsayılan bir UI kullanarak otomatik olarak bir lider tablosu oluşturan bir dahili sistem içerir.
liderlik tablosutablosu oluşturmak için:
Araştırmacı penceresinde, Sunucu Depolama 'da bir ModülScript oluşturun, ardından modül kaydını Liderlik Tablosu olarak yeniden adlandırın.
Varsayılan kodu aşağıdaki kodla değiştirin:
local Leaderboard = {}-- Yeni bir liderlik tablosuoluşturmalocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- liderlik tablosutablosu oluşturmak için Roblox tarafından tanınan rezerve edilmiş bir isim 'leaderstats'leaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Yeni bir lider tablosu istatistik değeri oluşturmalocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Bir oyuncunun istatistik değerini güncellemefunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueendreturn LeaderboardKod açıklamasıAşağıdaki bölümler, lider tablosunun daha ayrıntılı olarak nasıl çalıştığını açıklar.
Bir lider tablosu oluşturun
The setupLeaderboard() fonksiyonu, adı leaderstats olan yeni bir klasör örneği oluşturur ve belirtilen oyuncunun bir çocuğu olarak ayarlar.Roblox, leaderstats adlı bir klasörü istatistiklerin bir kutusu olarak otomatik olarak tanır ve istatistikleri görüntülemek için bir UI öğesi oluşturur.Değerlerin leaderstats depolanması gerekir "değer" nesneleri olarak (örneğin StringValue , IntValue veya NumberValue gibi).
-- Yeni bir liderlik tablosuoluşturmalocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- liderlik tablosutablosu oluşturmak için Roblox tarafından tanınan rezerve edilmiş bir isim 'leaderstats'leaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Yeni bir lider tablosu istatistik değeri oluşturmalocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendOyuncu istatistiklerini güncelle
setStat() Lider tablosu modülündeki tek kamu işlevidir.Zaten mevcut değilse belirlenmiş bir oyuncu veya lider tablosu için istatistik değerleri oluşturur.
FindFirstChild() bir nesnenin adını alır ve varsa nesneyi döndürür, yoksa nil döndürmez.Bir nesnenin kullanmadan önce var olup olmadığını öğrenmenin yaygın ve güvenli bir yöntemidir.
-- Bir oyuncunun istatistik değerini güncellemefunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueend
Modül kodlarını birleştirin
Hem OyuncuVerileri hem de LiderTablosu modül kodları tamamlandıktan sonra, oyuncu para verilerini yönetmek ve görüntülemek için ParaHizmeti kodundaki onlara ihtiyacınız var.Güncelle CoinService :
Gezgin penceresinde, CoinService kodunu açın.
Mevcut kodu aşağıdaki kodla değiştirin:
-- Hizmetler ve değişkenlerin başlatılmasılocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Modüllerlocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal COOLDOWN = 10local COIN_AMOUNT_TO_ADD = 1local function updatePlayerCoins(player, updateFunction)-- Para tablosunu güncellelocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Para lider liderlik tablosugüncelleLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Etkinlik işleyicisini tanımlamalocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Oyuncu bir para dokunducoin.Transparency = 1coin:SetAttribute("Enabled", false)updatePlayerCoins(player, function(oldCoinAmount)oldCoinAmount = oldCoinAmount or 0return oldCoinAmount + COIN_AMOUNT_TO_ADDend)task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Etkinlik dinleyicilerini ayarlamafor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endKod açıklamasıOrijinal CoinService scriptine yapılan değişiklikler şunları içerir:
- İçeri aktarma OyuncuVerileri ve LiderTablosu modülleri ile fonksiyonu.
- Bir oyuncu bir para topladığında eklenmesi gereken para sayısı olarak COIN_AMOUNT_TO_ADD ilan edilir ve COIN_KEY_NAME OyuncuVerileri 'de tanımlanan anahtar adı olarak.
- Oyuncunun para sayısını ve ilişkili lider tablosu statünü güncelleştirmek için yardımcı işlev oluşturma updatePlayerCoins() Türkçe: oyuncupara sayısını ve ilişkili lider tablosu statünü güncelleştirmek için yardımcı işlev oluşturma
- Yer tutucu print() ifadesini onCoinTouched() 'a bir çağrı ile değiştirerek updatePlayerCoins() 'a yönlendiriliyor.
Oynatma testi
Para koleksiyonunun hedeflendiği gibi çalışıp çalışmadığını görmenin zamanı geldi.oyunbir para dokunup topladığınızda, lider tablosu UI'sinde topladığınız para miktarını görebilmelisiniz.Deneyiminizi test etmek için:
Araç çubuğunda, Oyna düğmesine tıklayın. Studio oyun testi moduna girer.
Karakterini bir para dokunmak için hareket ettir.Eğer senaryolarınız doğru çalışıyorsa, lider tablosu arayüzü görüntülenir ve daha fazla para toplarken para sayınız artar.