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 kaç madeni para topladığını saymanız ve bu miktarı bir liderlik tablosunda görünür hale getirmeniz gerekiyor.

Madeni para toplama kaydetmek için bir modül betiği 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 fonksiyonlar içeren bir ModuleScript nesnesi oluşturmanız gerekiyor. Modül betikleri, diğer betiklerin talep edebileceği yeniden kullanılabilir kodlardır. Bu durumda, CoinService bu modül betiğini talep eder, böylece oyuncular madeni paralara dokunduğunda madeni para toplama verilerini güncelleyebilir.

PlayerData Oluştur
ServerStorage'da, aşağıdaki kod ile 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 betiği, bir oyuncunun madeni para toplama verilerini temsil eden sıfır veya daha fazla playerData tablosu içeren bir PlayerData tablosu tanımlar. Bu modül betiğini talep eden her betik, PlayerData tablosunun aynı kopyasını alır, bu da birden fazla betiğin madeni para toplama verilerini değiştirmesine ve paylaşmasına olanak tanır.

Veri yapılarını tanımlayın

Modül betiği, betiğin sonunda döndürülen boş bir tablo olan PlayerData ile başlar. Ayrıca, tabloda değerleri almak ve ayarlamak için erişim yöntemleri içerir.

playerData tablosu, tablonun yapısını tanımlayan yorumlar içerir, bu da kodun anlaşılmasını kolaylaştırır. Bu durumda, bir playerData tablosu, o oyuncu için toplanan madeni para miktarını temsil eden bir userId ve buna karşılık gelen Coins adlı bir 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 tablosu için verileri alır. Eğer bir oyuncu madeni para toplamadıysa, her oyuncunun onlarla ilişkili bazı verilere sahip olmasını sağlamak için defaultPlayerData() fonksiyonundan bir tablo döndürür. Yaygın bir gelenek, mantığı yerel kapsamlı fonksiyonlara devreden basit, kamuya açık fonksiyonlar oluşturmaktır.

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

Kamuya açık veri erişimcileri tanımlayın

getValue() ve updateValue() diğer betiklerin bu modül betiğini talep edebileceği kamuya açık fonksiyonlardır. Bizim durumumuzda, CoinService bu fonksiyonları, bir oyuncu bir madeni paraya dokunduğunda 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 liderlik tablosu oluşturun

Madeni para toplama verilerini görsel olarak ekranda bir liderlik tablosu ile temsil edebilirsiniz. Roblox, varsayılan bir UI kullanarak otomatik olarak bir liderlik tablosu oluşturan yerleşik bir sisteme sahiptir.

Liderlik Tablosu Oluştur
ServerStorage'da, aşağıdaki kod ile Leaderboard adında bir ModuleScript oluşturun:
```lua
local Leaderboard = {}
-- Yeni bir liderlik tablosu oluşturma
local function setupLeaderboard(player)
local leaderstats = Instance.new("Folder")
-- 'leaderstats' Roblox'un bir liderlik tablosu oluşturmak için tanıdığı bir isimdir
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
return leaderstats
end
-- Yeni bir liderlik tablosu istatistik 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 istatistik 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, liderlik tablosunun nasıl çalıştığını daha ayrıntılı olarak açıklar.

Bir liderlik tablosu oluşturun

setupLeaderboard() fonksiyonu, belirtilen oyuncunun çocuğu olarak yeni bir leaderstats klasörü örneği oluşturur. Roblox, leaderstats adında bir klasörü otomatik olarak istatistiklerin bir konteyneri olarak tanır ve istatistikleri görüntülemek için bir UI öğesi oluşturur. leaderstats içindeki değerlerin "değer" nesneleri (örneğin, StringValue, IntValue veya NumberValue) olarak saklanmasını gerektirir.

-- Yeni bir liderlik tablosu oluşturma
local function setupLeaderboard(player)
local leaderstats = Instance.new("Folder")
-- 'leaderstats' Roblox'un bir liderlik tablosu oluşturmak için tanıdığı bir isimdir
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
return leaderstats
end
-- Yeni bir liderlik tablosu istatistik 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 kamuya açık fonksiyondur. Belirtilen bir oyuncu veya liderlik tablosu için istatistik değerleri oluşturur, eğer zaten mevcut değilse.

FindFirstChild() bir nesnenin adını alır ve nesne mevcutsa onu döndürür, mevcut değilse nil döndürür. Kullanımdan önce bir nesnenin mevcut olup olmadığını öğrenmenin yaygın ve güvenli bir yoludur.

-- Bir oyuncunun istatistik 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 betiklerini entegre edin

Her iki modül de yerinde olduğunda, CoinService betiğinde bunları talep edin ve oyuncu madeni para verilerini yönetin ve görüntüleyin.

CoinService'i Güncelle
ServerScriptService'de, mevcut CoinService Betiği'nin kodunu aşağıdaki ile değiştirin:
```lua
-- Servisleri 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 liderlik tablosunu 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 paraya 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 betiğindeki değişiklikler şunları içerir:

  • PlayerData ve Leaderboard modüllerini require() fonksiyonu 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 tanımlama.
  • Oyuncunun madeni para sayısını ve ilişkili liderlik tablosu istatistiğini güncellemek için updatePlayerCoins() yardımcı fonksiyonunu oluşturma.
  • onCoinTouched() içindeki yer tutucu print() ifadesini updatePlayerCoins() çağrısı ile değiştirme.

Oyun Testi

Açılır menüden Test'i seçin ve Oyna'ya tıklayın. Bir madeni paraya yürüyün ve liderlik tablosunun köşede göründüğünü ve daha fazla madeni para topladıkça madeni para sayınızın arttığını doğrulayı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.