Orta seviye öğreticiler

Oyuncu verilerini standart veri depolarıyla kaydedin

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

Veri depoları, farklı oyuncu oturumları boyunca kalıcı oyuncu verilerini kaydetmek ve yüklemek için kullanabileceğiniz bir hizmettir. Oyuncunun ilerlemesi veya envanteri gibi önemli bilgileri saklar ve oyuncunun oyununuzu bir sonraki katılımında bu verileri geri almasını sağlar. Veri depoları olmadan, oyuncu oyundan ayrıldığında tüm ilerlemelerini kaybederdi.

İki tür veri deposu vardır: standart ve sıralı. Bu eğitim, sıralama veya sıralama gerektirmeyen sayı, dize ve tablo gibi verileri saklayan standart veri depolarını kullanır.

Gold Rush veri deposu eğitimi - Başlangıç .rbxl dosyasını başlangıç noktası olarak ve Gold Rush veri deposu eğitimi - Tamamlandı .rbxl dosyasını referans olarak kullanarak, bu eğitim, oyuncu ilerlemesini kaydetme ve daha tutarlı oyunlar oluşturma için ihtiyaç duyduğunuz temeli sağlar. Ayrıca:

  • Bir oyuncunun topladığı altın miktarını kaydetme ve yükleme.
  • Kullanıcı arayüzünü oyuncunun altın envanterini gösterecek şekilde güncelleme.
  • Oyuncunun altın envanterini her 30 saniyede bir otomatik olarak kaydetme.
  • Oyuncunun oyundan ayrıldığında konumunu kaydetme.
  • Oyuncu yeniden oyuna katıldığında konumunu geri yükleme.

Bu eğitimin sonunda, ServerScriptService altında veri depoları ile iki betik oluşturmuş olacaksınız:

  1. Oyuncunun altınını izleyen, yükleyen ve otomatik olarak kaydeden güncellenmiş GoldManager betiği.
  2. Oyuncunun oyundan ayrıldığında konumunu kaydeten ve geri döndüğünde konumunu geri yükleyen güncellenmiş PositionManager betiği.

Studio API hizmetlerine erişimi etkinleştirin

Veri depoları, cihazınızda yerel olarak saklanmadığı için oyununuz, bunları kullanmak için Roblox'un arka ucuyla sunucu ile sunucu arasında iletişime dayanır. Varsayılan olarak, Studio bu iletişimi istismar veya kazara kullanımı önlemek için kısıtlar. Studio'da API hizmetlerine erişim, yalnızca güvenilir oyunların Roblox'un arka ucuna okumalar ve yazmalar yapmasını sağlaması için açıkça etkinleştirilene kadar devredışı bırakılır.

Veri depolarını kullanabilmek için Studio API hizmetlerine erişimi etkinleştirmek için:

  1. Gold Rush veri deposu eğitimi - Başlangıç .rbxl dosyasını Studio'da açın ve yerel bir kopyasını oluşturun.
  2. Studio'da, DosyaDeneyim AyarlarıGüvenlik'e gidin.
  3. API Hizmetlerine Studio Erişimini Etkinleştir seçeneğini açın.
  4. Değişikliklerinizi kaydedin.

Standart bir veri deposu oluşturun

Bir veri deposu oluştururken, her zaman DataStoreService'i sunucu tarafı Script'inden çağırmalısınız. Bunu yapmak önemlidir çünkü:

  • Roblox, kalıcı oyuncu verilerine erişim ve bunları değiştirme izni yalnızca sunucuya aittir, bu nedenle istemciden tüm veri deposu erişimini engeller.
  • Sunucu tarafı betikleri merkezi bir ortamda çalışır, böylece okunan ve yazılan verilerin doğru ve geçerli olduğunu garanti eder.
  • İstemci tarafı betikleri oyuncunun cihazında çalıştığı için, istemcinin veri depolarınıza erişimi olursa, herhangi bir oyuncu oyunu istismar edebilir ve diğer oyuncuların verilerini çalabilir veya üzerine yazabilir.

Veri deposuna ayrıca verilerinizi düzenli tutmak ve farklı veri depolarında çakışmasını önlemek için benzersiz bir ad vermelisiniz. Bu eğitimde, oyuncunun altın envanterini kaydeden veri deposuna PlayerGold denir.

PlayerGold veri deposunu oluşturmak için:

  1. ServerScriptService altında mevcut GoldManager betiğini açın.

  2. Betiğin üst kısmındaki diğer hizmetlerin altında, DataStoreService'i başlatın ve GetDataStore ile "PlayerGold" dizesini çağırın.


    local DataStoreService = game:GetService("DataStoreService")
    local goldStore = DataStoreService:GetDataStore("PlayerGold")

Oyuncu verilerini kaydetme ve yükleme

Veri depoları, verileri tanımlayan anahtarlar ve verileri saklayan değerlerden oluşur.

AnahtarDeğer
AçıklamaBir anahtar, belirli bir veri parçasına erişmek için kullanabileceğiniz benzersiz bir tanımlayıcıdır.

Anahtarlar, verilerinizi düzenlemenizi, böylece kolayca yönetmenizi ve hata ayıklamanızı sağlar.
Bir değer, kaydetmek veya yüklemek istediğiniz gerçek veridir, örneğin oyuncunun envanteri veya ayarları.

Değerler, oturumlar arasında ilerlemeyi saklamanıza ve oyuncu verilerini bir sonraki katıldığında geri almanıza olanak tanır.
İzin verilen formatlarSadece dizeler olabilir.Sayılar, dizeler, boole veya tablolar olabilir.
Örnekler"Player_A", "TopScore", "GameSetting"100, "Level_5", true, {gold = 100, level = 5}

Bu eğitimde, anahtar oyuncunun userId'si ve değer topladığı altın miktarıdır. Bu anahtarı ve değeri kullanarak oyuncu verilerini kaydetmek ve yüklemek için:

  1. GoldManager betiğine, oyuncunun altınını PlayerGold veri deposuna kaydetmek için saveGold adında bir yardımcı işlev ekleyin.


    local function saveGold(userId, value)
    local success, err = pcall(function()
    -- `userId` oyuncunun benzersiz kimliğidir
    -- `value` o oyuncu için kaydedilecek altın miktarıdır
    goldStore:SetAsync(userId, value)
    end)
    end
  2. OPTIONAL
    saveGold işlevine, oyuncunun kimliğini ve bir hata mesajını yazdıran bir uyarı ekleyin. Bu adım zorunlu olmasa da, işleviniz başarısız olursa daha kolay hata ayıklama için iyi bir uygulamadır.


    local function saveGold(userId, value)
    local success, err = pcall(function()
    -- `userId` oyuncunun benzersiz kimliğidir
    -- `value` o oyuncu için kaydedilecek altın miktarıdır
    goldStore:SetAsync(userId, value)
    end)
    if not success then
    warn("[KAYIT HATASI] Altın kaydedilemedi", userId, ":", err)
    end
    end
  3. Oyuncunun oyuna girdiğinde altınını yüklemek için onPlayerAdded olayını değiştirin. Güncellenmiş onPlayerAdded işlevi:

    • PlayerGold veri deposundaki içeriği yüklemeye çalışır. Oyuncunun kaydedilmiş altın miktarını döndürür veya oyuncunun hiç altını yoksa ya da oyunu daha önce oynamadıysa 0 değerini döndürür.
    • Kodunuzu daha kolay hata ayıklamanıza yardımcı olacak bir hata ayıklama kaydı sağlar. Bu hata ayıklama kaydı, oyuna katılan oyuncunun kaydedilmiş altınını veya onPlayerAdded veri deposuna erişemezse bir hata mesajı içerir.
    • Kullanıcı arayüzünü güncelleyerek, oyuncunun kaydedilmiş altınını ekranında görüntüler.

    local function onPlayerAdded(player)
    local userId = player.UserId
    local success, storedGold = pcall(function()
    return goldStore:GetAsync(userId)
    end)
    if success then
    local currentGold = storedGold or 0
    playerGold[userId] = currentGold
    uiEvent:FireClient(player, {
    gold = currentGold,
    doTween = false,
    showAlert = not success
    })
    else
    uiEvent:FireClient(player, { showAlert = true })
    warn("Altın yüklenemedi", player.Name)
    end
    end
  4. Oyuncu oyundan ayrıldığında daha önce oluşturduğunuz saveGold işlevini çağırarak oyuncunun altınını kaydetmek için onPlayerRemoving olayını değiştirin.


    local function onPlayerRemoving(player)
    local userId = player.UserId
    if playerGold[userId] then
    saveGold(userId, playerGold[userId])
    end
    end

Oyuncu verilerini otomatik olarak kaydetme

Oyuncunun verilerini otomatik olarak kaydetmek iyi bir uygulamadır çünkü oyuncunun verilerini kaybetmesini korur. Eğer yalnızca oyuncunun verisini onPlayerRemoving'de oyundan ayrıldığında kaydederseniz, oyuncu beklenmedik bir şekilde sunucudan bağlantısını keserse en son ilerlemelerini kaybedebilirsiniz.

Oyuncunun verilerini otomatik kaydetmek için:

  1. Oyununuzun, oyuncunun verilerini ne sıklıkta otomatik olarak kaydedeceğini belirlemek için yeni bir sabit oluşturun. Sabit, oyun çalışırken değeri değişmeyen bir değişkendir. Bu sabiti, betiğiniz boyunca otomatik kaydetme aralığına atıfta bulunmak ve otomatik kaydetme sıklığını kolayca ayarlamak için kullanabilirsiniz.


    -- Bu sayı saniye cinsindendir
    local AUTOSAVE_INTERVAL = 30
  2. Oyuncu oyunda olduğu sürece çalışan bir arka plan döngüsü oluşturmak için mevcut onPlayerAdded işlevine bir otomatik kaydetme coroutine ekleyin. Coroutine, asenkron olarak çalışan bir işlevdir; belirli noktalarda duraklayabilir, bıraktığı yerden devam edebilir ve diğer betik bölümleriyle paralel olarak çalışabilir.

    Bu betikte, otomatik kaydetme coroutine arka plan döngüsü, AUTOSAVE_INTERVAL sabitinizdeki saniye sayısını bekler, sonra daha önce oluşturduğunuz saveGold işlevini çağırır.


    coroutine.wrap(function()
    while player.Parent do
    task.wait(AUTOSAVE_INTERVAL)
    if playerGold[userId] then
    print("[OTOMATİK KAYIT] Kaydediliyor", playerGold[userId], "altın", player.Name)
    saveGold(userId, playerGold[userId])
    end
    end
    end)()

Oyuncu konumunu kaydetme ve yükleme

Bir oyuncunun konumunu kaydetmek için, Character ile çalışmalısınız, Player nesnesi değil. Bir oyuncunun Character'ı, 3D dünyadaki fiziksel modelini temsil eder ve mevcut konum ve yönlendirmesi için koordinatlara sahiptir; ancak Player nesnesi yalnızca kullanıcı hesabını temsil eder.

Veri depoları yalnızca sayılar, dizeler ve tablolar gibi temel veri türlerini kaydedebileceği için, doğrudan karmaşık nesneleri (örneğin, Vector3 veya CFrame değerlerini) kaydedemezsiniz. Bir oyuncunun konumunu kaydetmek için, bunu üç ayrı sayıya (X, Y ve Z koordinatları) bölmeli ve bunları ayrı ayrı kaydetmelisiniz. Konumu daha sonra yüklerken, kaydedilmiş koordinatları kullanarak Vector3'ü yeniden oluşturabilirsiniz.

Karakterin konumunu kaydetmek ve yüklemek için:

  1. ServerScriptService altında mevcut PositionManager betiğini açın.

  2. Betiğin en üstüne, DataStoreService'i başlatın ve "PlayerPosition" dizesi ile GetDataStore'u çağırın.


    local DataStoreService = game:GetService("DataStoreService")
    local positionStore = DataStoreService:GetDataStore("PlayerPosition")
  3. Bir oyuncunun userId'sini ve bir Vector3 konumunu alan savePosition adında bir yardımcı işlev ekleyin. Vector3 değerlerini doğrudan kaydedemeyeceğiniz için, konumu X, Y, Z sayıların bir tablosuna dönüştürün.


    local function savePosition(player, position)
    local userId = player.UserId
    local success, err = pcall(function()
    positionStore:SetAsync(userId, {position.X, position.Y, position.Z})
    end)
    end
  4. OPTIONAL
    savePosition işlevine, konumunu kaydedemediğiniz oyuncunun adını ve bir hata mesajını yazdıran bir uyarı ekleyin. Bu adım zorunlu olmasa da, işleviniz başarısız olursa daha kolay hata ayıklama için iyi bir uygulamadır.


    local function savePosition(player, position)
    local userId = player.UserId
    local success, err = pcall(function()
    positionStore:SetAsync(userId, {position.X, position.Y, position.Z})
    end)
    if not success then
    warn("Konum kaydedilemedi", player.Name, ":", err)
    end
    end
  5. PlayerPosition veri deposundaki oyuncunun kaydedilmiş koordinatlarını yüklemek için loadPosition adında başka bir yardımcı işlev ekleyin. Karakterin konumunu dünyadaki konumuna geri yüklemek için PivotTo'yu kullanın. Oyuncunun kaydedilmiş konumu bir tablo olarak döndüğü için, bir Vector3'ü yeniden oluşturmalı ve ardından karakteri hareket ettirmek için bir CFrame'e dönüştürmelisiniz.


    local function loadPosition(userId, character)
    local userId = player.UserId
    local success, savedCoords = pcall(function()
    return positionStore:GetAsync(userId)
    end)
    if success and savedCoords then
    local pos = Vector3.new(savedCoords[1], savedCoords[2], savedCoords[3])
    print("Konum geri yüklendi", player.Name)
    character:PivotTo(CFrame.new(pos))
    elseif not success then
    warn("Konum yüklenemedi", player.Name)
    end
    end
  6. Her oyuncu oyununuza katıldığında konum mantığını ayarlamak için onPlayerAdded olayını değiştirin. Güncellenmiş onPlayerAdded işlevinin içinde:

    • CharacterAdded, oyuncunun karakteri yeniden doğduğunda loadPosition'ı çağırarak son bilinen konumunu geri yükler.
    • CharacterRemoving, oyuncunun oyundan çıkarılmasını gerçekleştiğinde karakterinin mevcut konumunu kaydetmek için savePosition'ı çağırır.
    • GetPivot karakterin oyundan çıkarıldığı sırada tam konumunu alır.

    local function onPlayerAdded(player)
    local userId = player.UserId
    player.CharacterAdded:Connect(function(character)
    loadPosition(player, character)
    end)
    player.CharacterRemoving:Connect(function(character)
    local pos = character:GetPivot().Position
    savePosition(player, pos)
    end)
    end
    Player.PlayerAdded:Connect(onPlayerAdded)

Nihai kod

Aşağıdaki kod parçacıkları, eksiksiz GoldManager ve PositionManager betikleri için kullanılabilir. Bunları doğrudan Gold Rush veri kaydetme eğitimi - Başlangıç .rbxl dosyasında Studio'da yapıştırabilir ve çalıştırabilirsiniz.

GoldManager


-- Hizmetleri al
-- Hizmetleri al
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local CollectionService = game:GetService("CollectionService")
local DataStoreService = game:GetService("DataStoreService")
-- Kullanıcı arayüzünü güncellemek için uzak olay
local uiEvent = ReplicatedStorage:WaitForChild("UIEvent")
-- Oyuncunun altın parçalarını kaydetmek için veri deposu
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Tek bir oturum için oyuncunun altın parçalarını saklamak için tablo
local playerGold = {}
-- Sabitler
local GOLD_VALUE = 10 -- Her altın parçasının değeri
local GOLD_REGEN_DELAY = 2 -- Bir parçanın yeniden doğması için gecikme (saniye cinsinden)
local AUTOSAVE_INTERVAL = 30 -- Oyuncunun parçalarının ne sıklıkta kaydedileceği (saniye cinsinden)
-- Oyuncunun bir altın parçasını toplamasını işleyen işlev
local function processGoldTouch(chunk, player)
-- Oyuncu parçayı topladığında parçayı gizle
chunk.Parent = nil
-- Parçayı oyuncunun oturum altın puanına ekle
local userId = player.UserId
playerGold[userId] = (playerGold[userId] or 0) + GOLD_VALUE
print(player.Name, "artık", playerGold[userId], "altına sahip")
-- Bu oturum için yeni altın puanını yansıtacak şekilde kullanıcı arayüzünü güncelle
uiEvent:FireClient(player, {
gold = playerGold[userId],
doTween = true,
showAlert = false
})
-- Biraz bekleyin ve sonra yeni toplanan altın parçasını yeniden doğurun
task.delay(GOLD_REGEN_DELAY, function()
chunk.Parent = workspace.GoldChunks
end)
end
-- "Gold" etiketiyle işaretlenmiş tüm parçaları döngüye al ve bunları dokunma algılamasına bağla
for _, chunk in ipairs(CollectionService:GetTagged("Gold")) do
chunk.Touched:Connect(function(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player then
processGoldTouch(chunk, player)
end
end)
end
-- Oyuncunun altınını veri deposuna kaydetmek için işlev
local function saveGold(player, value)
local userId = player.UserId
local success, err = pcall(function()
goldStore:SetAsync(userId, value)
end)
if not success then
warn("Altın kaydedilemedi", player.Name, ":", err)
end
end
-- Oyuncunun oyuna katılmasını işleyen işlev
local function onPlayerAdded(player)
local userId = player.UserId
print(player.Name, "oyuna katıldı")
-- Oyuncunun veri deposundan altınını yüklemeye çalış
local success, storedGold = pcall(function()
return goldStore:GetAsync(userId)
end)
if success then
-- Oyuncunun veri deposunun değeri kullanılarak mevcut oturum altın puanını ayarlama
local currentGold = storedGold or 0
playerGold[userId] = currentGold
-- Oyuncunun veri deposundaki değeri ile kullanıcı arayüzünü güncelle
uiEvent:FireClient(player, {
gold = currentGold,
doTween = false,
showAlert = false
})
print("Yüklendi", currentGold, "altın için", player.Name)
else
-- Oyuncuya altının yüklenemediğini bildir
uiEvent:FireClient(player, { showAlert = true })
warn("Altın yüklenemedi", player.Name)
end
-- Oyuncunun altınını her 30 saniyede bir kaydetmek için otomatik kaydetme coroutine'ini başlat
coroutine.wrap(function()
while player.Parent do
task.wait(AUTOSAVE_INTERVAL)
if playerGold[userId] then
saveGold(player, playerGold[userId])
print("Otomatik kaydediliyor", playerGold[userId], "altın için", player.Name)
end
end
end)()
end
-- Oyuncunun oyundan ayrılmasını işleyen işlev
local function onPlayerRemoving(player)
local userId = player.UserId
print(player.Name, "oyundan ayrıldı")
-- Oyuncunun altının izlenip izlenmediğini kontrol et
if playerGold[userId] then
-- Oyuncunun oyundan ayrılmadan önce altınını kaydet
saveGold(player, playerGold[userId])
end
end
-- Katılan ve ayrılan oyuncu olaylarını bağlayın
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)

PositionManager


-- Hizmetleri al
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
-- Oyuncunun konumunu kaydetmek için veri deposu
local positionStore = DataStoreService:GetDataStore("PlayerPosition")
-- Oyuncunun konumunu {X, Y, Z} tablosu olarak kaydeden işlev
local function savePosition(player, position)
local userId = player.UserId
local success, err = pcall(function()
positionStore:SetAsync(userId, {position.X, position.Y, position.Z})
end)
if not success then
warn("Konum kaydedilemedi", player.Name, ":", err)
end
end
-- Oyuncunun son kaydedilmiş konumunu yükleyen ve karakterini hareket ettiren işlev
local function loadPosition(player, character)
local userId = player.UserId
local success, savedCoords = pcall(function()
return positionStore:GetAsync(userId)
end)
if success and savedCoords then
local pos = Vector3.new(savedCoords[1], savedCoords[2], savedCoords[3])
print("Konum geri yüklendi", player.Name)
character:PivotTo(CFrame.new(pos))
elseif not success then
warn("Konum yüklenemedi", player.Name)
end
end
-- Oyuncunun oyuna katılmasını işleyen işlev
local function onPlayerAdded(player)
local userId = player.UserId
-- Oyuncunun karakteri doğduğunda konumunu yüklemeye çalış
player.CharacterAdded:Connect(function(character)
loadPosition(player, character)
end)
-- Oyuncunun karakteri kaldırıldığında konumunu kaydet
player.CharacterRemoving:Connect(function(character)
local pos = character:GetPivot().Position
savePosition(player, pos)
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.