Artık bir oyuncunun bir madeni para topladığını tespit edebildiğinize göre, oyuncuların topladığı madeni paraların sayısını saymanız ve bu miktarı bir sıralama listesinde görünür hale getirmeniz gerekiyor.
Madeni para toplama kaydetmek için bir modül script oluşturun
Her oyuncunun madeni para toplama verilerini saklamak ve yönetmek için, her oyuncunun madeni para toplama verilerine erişen bir veri yapısı ve işlevler içeren bir ModuleScript nesnesi oluşturmanız gerekiyor. Modül scriptleri, diğer scriptlerin gereksinim duyabileceği yeniden kullanılabilir koddur. Bu durumda, CoinService bu modül scriptini gereksinim duyduğundan, oyuncular madeni paralara dokunduğunda madeni para toplama verilerini güncelleyebilir.
Oyuncu Verisi OluşturServerStorage içinde, aşağıdaki kodla PlayerData adında bir ModuleScript oluşturun:```lualocal PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}local function defaultPlayerData()return {[PlayerData.COIN_KEY_NAME] = 0}endlocal function getData(player)local data = playerData[tostring(player.UserId)] or defaultPlayerData()playerData[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 PlayerData```
Modül scripti, bir oyuncunun madeni para toplama verilerini temsil eden sıfır veya daha fazla playerData tablosunu içeren bir PlayerData tablosu tanımlar. Bu modül scriptini gereksinim duyan her script, PlayerData tablosunun aynı kopyasını alır ve bu sayede birden fazla script, madeni para toplama verilerini değiştirebilir ve paylaşabilir.
Veri yapılarını belirtin
Modül scripti, scriptin sonunda döndürülen boş bir tablo ile başlar, bu tablo PlayerData olarak adlandırılır. Ayrıca tabloda değer almak ve ayarlamak için erişim yöntemleri içerir.
playerData tablosu, tablonun yapısını tarif eden yorumlar içerir, bu da kodun anlaşılmasını kolaylaştırır. Bu durumda, bir playerData tablosu bir userId ve o oyuncu için toplanan madeni paraların miktarını ifade eden Coins adında bir ilgili alan içerir.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerData
Yerel veri erişimcisi tanımlayın
getData() belirli bir playerData tablosunun verilerini almak için kullanılan yerel bir işlevdir. Eğer bir oyuncu bir madeni para toplamamışsa, her oyuncunun onlarla ilişkili verisi olduğundan emin olmak için defaultPlayerData() işlevinden bir tablo döndürür. Yaygın bir yöntem, basit, herkesin erişebileceği işlevler oluşturarak mantığı, ağır işleri yapan yerel kapsamlı işlevlere devretmektir.
local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
playerData[tostring(player.UserId)] = data
return data
end
Açık veri erişimcilerini tanımlayın
getValue() ve updateValue() diğer scriptlerin bu modül scriptini çağırabileceği herkesin erişimine açık işlevlerdir. Bu durumda, CoinService bu işlevleri, o oyuncu bir madeni paraya dokunduğunda bir oyuncunun madeni para toplama verilerini güncellemek için kullanır.
function PlayerData.getValue(player, key)
return getData(player)[key]
end
function PlayerData.updateValue(player, key, updateFunction)
local data = getData(player)
local oldValue = data[key]
local newValue = updateFunction(oldValue)
data[key] = newValue
return newValue
end
Bir sıralama listesi oluşturun
Madeni para toplama verilerini görsel olarak bir ekrandaki sıralama listesi ile temsil edebilirsiniz. Roblox, varsayılan bir UI kullanarak otomatik olarak bir sıralama listesi oluşturan yerleşik bir sistem içerir.
Sıralama Listesi OluşturServerStorage içinde, aşağıdaki kodla Leaderboard adında bir ModuleScript oluşturun:```lualocal Leaderboard = {}-- Yeni bir sıralama listesi oluşturmalocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' Roblox'un bir sıralama listesi oluşturmak için tanıdığı bir rezervli isimdirleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Yeni bir sıralama listesi statü değeri oluşturmalocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Bir oyuncunun statü 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 Leaderboard```
Aşağıdaki bölümler, sıralama listesinin nasıl çalıştığını daha ayrıntılı bir şekilde açıklar.
Bir sıralama listesi oluşturun
setupLeaderboard() işlevi, belirtilen oyuncunun bir çocuğu olarak yeni bir leaderstats klasör örneği oluşturur ve ayarlar. Roblox, leaderstats adındaki bir klasörü istatistiklerin saklandığı bir konteyner olarak otomatik tanır ve istatistikleri görüntülemek için bir UI öğesi oluşturur. leaderstats içindeki değerlerin "value" nesneleri (örneğin StringValue, IntValue veya NumberValue) olarak saklanması gerekir.
-- Yeni bir sıralama listesi oluşturma
local function setupLeaderboard(player)
local leaderstats = Instance.new("Folder")
-- 'leaderstats' Roblox'un bir sıralama listesi oluşturmak için tanıdığı bir rezervli isimdir
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
return leaderstats
end
-- Yeni bir sıralama listesi statü değeri oluşturma
local function setupStat(leaderstats, statName)
local stat = Instance.new("IntValue")
stat.Name = statName
stat.Value = 0
stat.Parent = leaderstats
return stat
end
Oyuncu istatistiklerini güncelleyin
setStat(), Leaderboard modülündeki tek açık işlevdir. Belirtilen bir oyuncu için veya zaten mevcut değilse, sıralama listesi için statü değerleri oluşturur.
FindFirstChild() bir nesnenin adını alır ve eğer varsa o nesneyi döndürür, yoksa nil döndürür. Bu, bir nesne kullanılmadan önce var olup olmadığını öğrenmenin yaygın ve güvenli bir yöntemidir.
-- Bir oyuncunun statü değerini güncelleme
function Leaderboard.setStat(player, statName, value)
local leaderstats = player:FindFirstChild("leaderstats")
if not leaderstats then
leaderstats = setupLeaderboard(player)
end
local stat = leaderstats:FindFirstChild(statName)
if not stat then
stat = setupStat(leaderstats, statName)
end
stat.Value = value
end
Modül scriptlerini entegre edin
Her iki modül de yerinde olduğuna göre, bunları CoinService scriptinde gereksinim duyarak oyuncu madeni para verilerini yönetmek ve görüntülemek için kullanın.
CoinService'i GüncelleServerScriptService içinde, mevcut CoinService Script'inin kodunu aşağıdakiyle değiştirin:```lua-- Hizmetleri ve değişkenleri başlatmalocal 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)-- Madeni para tablosunu güncellelocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Madeni para sıralama listesini güncelleLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Olay 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 madeni 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-- Olay dinleyicilerini ayarlamafor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end```
Orijinal CoinService scriptindeki değişiklikler şunlardır:
- Bir oyuncu bir madeni para topladığında eklenecek madeni para sayısı olarak COIN_AMOUNT_TO_ADD'i ve PlayerData'da tanımlanan anahtar adı olarak COIN_KEY_NAME'i beyan etme.
- Oyuncunun madeni para sayısını ve ilgili sıralama listesi istatistiğini güncellemek için updatePlayerCoins() yardımcı işlevini oluşturma.
- onCoinTouched() içindeki yer tutucu print() ifadesi yerine updatePlayerCoins() çağrısı ile değiştirme.
Oyun Testi
Açılır listeden Test seçeneğini seçin ve Oyna'ya tıklayın. Bir madeni paraya girin ve sıralama listesinin köşede belirdiğini, topladığınız madeni paralarla birlikte madeni para sayınızın arttığını onaylayın.