Verileri kaydet

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

Oyunlar genellikle oturumlar arasında kalıcı verileri depolamak gerekir, oyuncunun seviyesi, deneyim puanları, para, envanter öğeleri, konum ve daha fazlası gibi.

Bu eğitim, temel bir veri deposu oluşturmayı, oyuncu verilerini kaydetmeyi ve verileri bir oyun oturumuna geri okumayı gösterir.

Studio erişimini etkinleştir

Varsayılan olarak, Stüdyo'da test edilen oyunlar veri depolarına erişemez, bu yüzden önce bunları etkinleştirmelisiniz:

  1. Yayınlayın deneyimi.

  2. Dosya ve Oyun Ayarları seçin.

  3. Güvenlik bölümünde , Studio'nun API Hizmetlerine Erişimini Etkinleştir ve Kaydet seçeneğine tıklayın.

Bir veri depolama oluşturun

Veri depoları benzersiz bir isim gerektirir.Bu örnek, her oyuncunun altını kalıcı depolama alanına kaydeden bir veri depolaması oluşturur: OyuncuAltını

  1. Create a Script within ServerScriptService called GoldManager .

  2. Veri depoları DataStoreService, bu yüzden hizmeti alın:


    local DataStoreService = game:GetService("DataStoreService")
  3. Dize DataStoreService:GetDataStore() ile çağrı "PlayerGold" .Bu yöntem zaten varsa OyuncuAltın veri depolarına erişir.Eğer mevcut değilse, yöntem yeni bir veri depolama alanı oluşturur ve adlandırır PlayerGold .


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

Verileri kaydet

Veri depoları temelde bir Luau tablosu gibi bir sözlüktür.Veri depolamasındaki her değer benzersiz bir anahtar tarafından indekslenir, ki bu oyuncunun benzersiz UserId 'si veya sadece bir oyun promosyonu için adlandırılmış bir dize olabilir.

KeyValue
3125060850
35167597920
50530609278000

Oyuncu verilerini veri depolarına kaydetmek için:

  1. Veri depolama anahtarı için playerUserID adlı bir değişken oluşturun. Ardından, bir oyuncunun başlangıç altın miktarını depolamak için playerGold kullanın.


    local DataStoreService = game:GetService("DataStoreService")
    local goldStore = DataStoreService:GetDataStore("PlayerGold")
    -- Veri depolama anahtarı ve değeri
    local playerUserID = 505306092
    local playerGold = 250
  2. Verileri PlayerGold veri deposuna kaydetmek için, önceden oluşturulan anahtar ve değer değişkenlerini geçerek korunan bir çağrı içinde SetAsync çağrınızı yapın.


    local DataStoreService = game:GetService("DataStoreService")
    local goldStore = DataStoreService:GetDataStore("PlayerGold")
    -- Veri depolama anahtarı ve değeri
    local playerUserID = 505306092
    local playerGold = 250
    -- Veri depolama anahtarı ayarla
    local success, error = pcall(function()
    goldStore:SetAsync(playerUserID, playerGold)
    end)
    if not success then
    warn(error)
    end

SetAsync() gibi işlevler ara sıra başarısız olabilen ağ çağrılarıdır.Yukarıda gösterildiği gibi, pcall() böyle hataların tespit edilmesi ve ele alınması için kullanılır.

En temel haliyle, pcall() bir işlev kabul eder ve iki değer döndürür:

  • İşlev hata olmadan yürütüldüğünde durum, yoksa true ya da başka bir şekilde false.
  • İşlevin veya bir hata mesajının dönüş değeri.

Yukarıdaki örnek, 13. satırda durumu kontrol eder. Eğer SetAsync() herhangi bir nedenden dolayı başarısız olursa, örnek Çıktı penceresinde hata görüntüler.

Verileri oku

Bir veri depolamasından veri okumak için, istenen anahtar adıyla GetAsync() çağırın.


local DataStoreService = game:GetService("DataStoreService")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Veri depolama anahtarı ve değeri
local playerUserID = 505306092
local playerGold = 250
-- Veri depolama anahtarı ayarla
local setSuccess, errorMessage = pcall(function()
goldStore:SetAsync(playerUserID, playerGold)
end)
if not setSuccess then
warn(errorMessage)
end
-- Veri deposu anahtarını oku
local getSuccess, currentGold = pcall(function()
return goldStore:GetAsync(playerUserID)
end)
if getSuccess then
print(currentGold)
end

Senaryoyu test etmek için Çalıştır 'a tıklayın ve currentGold penceresine basılan değeri fark edin.İşlevlerin veri depolama sunucularına bağlanması gerektiği için birkaç saniye sürebileceğini unutmayın.

Otomatik olarak okuyup kaydet

Önceki senaryo çalışır, ancak temel bir sorunu vardır: playerUserID ve playerGold için sert kodlanmış değerler içerir, bu yüzden farklı miktarda altını olan çok sayıda oyuncuyu desteklemez.Daha gerçekçi bir çözüm, oyuncu deneyime bağlandığında altın değerini okur ve ardından oyuncu ayrıldığında saklar.Bu yaklaşım, veri depolama çağrılarını etkinliklerePlayers bağlamak demektir.


local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Verileri etkilemekten kaçınmak için her oyuncu için yerel bir tabloya altın değerleri ekleyin
-- tekrar tekrar sakla.
local playerGold = {}
local function incrementGold(player, amount)
playerGold[player.UserId] += amount
end
local function onPlayerAdded(player)
-- Veri deposu anahtarını oku
local success, storedGold = pcall(function()
return goldStore:GetAsync(player.UserId)
end)
if success then
local currentGold
if storedGold then
currentGold = storedGold
else
currentGold = 0
end
playerGold[player.UserId] = currentGold
print(currentGold)
end
-- Test altın artışı
incrementGold(player, 5)
end
local function onPlayerRemoving(player)
-- Veri depolama anahtarı ayarla
local success, err = pcall(function()
goldStore:SetAsync(player.UserId, playerGold[player.UserId])
end)
if not success then
warn(err)
end
-- Girişi temizleyin, böylece tablo, sunucunun ömrü boyunca büyümez
playerGold[player.UserId] = nil
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)

Karakter konumunu okuyup kaydet

Oyuncu konumunu kaydetmek için, Character yerine Player ile çalışırsınız, ancak prensip benzerdir.Bu kez, Script içinde ServerScriptService adlı bir Konum Yöneticisi oluşturun:


local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local Workspace = game:GetService("Workspace")
local playerPositionStore = DataStoreService:GetDataStore("PlayerPositionStore")
local function positionHandler(player)
-- Karakter eklemesinde konumu yükle
player.CharacterAdded:Connect(function(character)
local success, coords = pcall(function()
return playerPositionStore:GetAsync(player.UserId)
end)
local position = Vector3.new(coords[1], coords[2], coords[3])
if success and position then
character:PivotTo(CFrame.new(position))
print("Loaded player position!")
else
warn("Failed to load position for player " .. player.Name .. ". Placing in default position.")
end
-- Ölümde oyuncu yeniden doğmasını ele al
local humanoid = character:FindFirstChildOfClass("Humanoid")
humanoid.Died:Connect(function()
local spawnLocation = Workspace:FindFirstChild("SpawnLocation")
character:PivotTo(spawnLocation.CFrame)
end)
end)
-- Karakter kaldırma sırasında konum kaydetme
player.CharacterRemoving:Connect(function(character)
local position = character:GetPivot().Position
local success, err = pcall(function()
playerPositionStore:SetAsync(player.UserId, {position.X, position.Y, position.Z})
print("Saved player position!")
end)
if not success then
warn("Failed to save position for player " .. player.Name .. ": " .. err)
end
end)
end
Players.PlayerAdded:Connect(positionHandler)

Bu senaryo yeni bir veri depolaması ekler, playerPositionStore .Veri depoları yalnızca temel türleri depoladığından, nesneler yerine X, Y ve Z koordinatlarını bir tek Vector3 veya CFrame değeri yerine bireysel olarak depolamanız gerekir.Deneyiminizi test ederken, karakterinizi hareket ettirin.Karakterinizin deneyiminizi test ettiğiniz bir sonraki seferde aynı pozisyona nasıl geri döndüğünü not edin.

Örnek proje

Artık temel veri depolama kullanımını anladığınıza göre, Altın Yarışı örnek oyununda bunu test et.Ayrıca oyunu Studio'da düzenleyebilir ve geliştirilmiş GoldManager kodunu keşfedebilirsiniz, ki bu, arayüzün bir parçası olarak altını görüntüler ve otomatik kaydetmeyi içerir.