Oyuncu verilerini kaydetme ve görüntüleme

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


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ştur

ServerStorage içinde, aşağıdaki kodla PlayerData adında bir ModuleScript oluşturun:
```lua
local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Coins"
local playerData = {
--[[
[userId: string] = {
["Coins"] = coinAmount: number
}
]]
}
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
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
return 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ştur

ServerStorage içinde, aşağıdaki kodla Leaderboard adında bir ModuleScript oluşturun:
```lua
local Leaderboard = {}
-- 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
-- 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
return 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üncelle

ServerScriptService içinde, mevcut CoinService Script'inin kodunu aşağıdakiyle değiştirin:
```lua
-- Hizmetleri ve değişkenleri başlatma
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Modüller
local Leaderboard = require(ServerStorage.Leaderboard)
local PlayerData = require(ServerStorage.PlayerData)
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
local COOLDOWN = 10
local COIN_AMOUNT_TO_ADD = 1
local function updatePlayerCoins(player, updateFunction)
-- Madeni para tablosunu güncelle
local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)
-- Madeni para sıralama listesini güncelle
Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
end
-- Olay işleyicisini tanımlama
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- Oyuncu bir madeni para dokundu
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
updatePlayerCoins(player, function(oldCoinAmount)
oldCoinAmount = oldCoinAmount or 0
return oldCoinAmount + COIN_AMOUNT_TO_ADD
end)
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
-- Olay dinleyicilerini ayarlama
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
```

Orijinal CoinService scriptindeki değişiklikler şunlardır:

  • PlayerData ve Leaderboard modüllerini require() işlevi ile içe aktarma.
  • 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.

©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.