Roblox Studio’da DataStoreService ile Oyuncu Verilerini Güvenle Kaydetme
Roblox oyunlarınızda oyuncuların parasını, eşyalarını ve seviyelerini kalıcı olarak kaydetmek için DataStoreService ve pcall kullanımının detaylı mimarisi.

Oyuncu Verileri Neden Kaydedilmelidir?
Roblox Studio\’da bir Obby, Tycoon veya RPG oyunu geliştirdiğinizde, oyuncuların kazandığı puanlar, satın aldığı Game Pass özellikleri veya envanterindeki eşyalar oyunun geçici belleğinde tutulur. Oyuncu sunucudan ayrıldığında (Disconnect) bu bellekteki tüm veriler silinir. Oyuncuların emeklerinin boşa gitmemesi ve oyuna geri döndüklerinde kaldıkları yerden devam edebilmeleri için verilerin Roblox\’un devasa bulut veritabanlarına kaydedilmesi gerekir. Bu işlemi gerçekleştiren köprü modülün adı DataStoreService\’dir.
DataStoreService Nedir ve Nasıl Çağrılır?
DataStoreService, Roblox oyun motorunun (Luau) yerleşik bir API\’sidir. Kod yazmaya başlamadan önce, projenizin Roblox sunucularında yayınlanmış (Published) olması ve Oyun Ayarları (Game Settings) menüsünden \’Güvenlik\’ (Security) sekmesindeki \’Enable Studio Access to API Services\’ seçeneğinin açık olması zorunludur; aksi takdirde test sırasında kayıt işlemleri hata verir. Bir script içinde servisi çağırmak için öncelikle `local DataStoreService = game:GetService(\”DataStoreService\”)` tanımı yapılır. Ardından `local PlayerData = DataStoreService:GetDataStore(\”MyGameData_V1\”)` satırıyla kendinize özel bir veri tablosu oluşturursunuz.
GetAsync ile Veri Okuma Mantığı
Oyuncu sunucuya bağlandığında (PlayerAdded eventi tetiklendiğinde), sistemin yapması gereken ilk iş oyuncunun daha önce bir kaydı olup olmadığını kontrol etmektir. Bunun için benzersiz bir anahtar (Key) kullanılır. Genellikle oyuncunun değişmeyen kimliği olan `UserId` en güvenli anahtardır (Örn: `\”Player_\” .. player.UserId`). `GetAsync(Key)` fonksiyonu çalıştırıldığında sistem buluta gider ve o anahtara ait bir veri olup olmadığını sorgular. Veri varsa oyuncunun ekranındaki UI güncellenir; veri yoksa (ilk kez giriyorsa) oyuncuya 0 para ve başlangıç eşyaları tanımlanarak yeni bir tablo oluşturulur.
Veri Kaybını Önlemek: Pcall (Protected Call) Kullanımı
Bulut sistemleriyle iletişim kurarken anlık internet kopmaları, Roblox sunucularındaki yoğunluklar veya API kesintileri yaşanabilir. Eğer `GetAsync` veya kayıt işlemi olan `SetAsync` fonksiyonlarını doğrudan yazarsanız ve bir hata oluşursa, script tamamen çöker ve oyun bozulur. Bunu önlemek için Lua dilindeki `pcall` (Protected Call) yapısı kullanılır. Pcall, içine yazılan kodu çalıştırır; eğer kod başarıyla tamamlanırsa `success` değerini `true` döndürür, hata çıkarsa çökme yaşanmadan hatayı `errorMessage` olarak yakalamanızı sağlar. Veri okuma ve yazma işlemlerinin tamamı istisnasız olarak pcall bloğu içine sarılmalıdır.
SetAsync ve UpdateAsync Arasındaki Kritik Farklar
Oyuncunun verisini kaydetmek için iki ana fonksiyon vardır. `SetAsync(Key, Data)`, verdiğiniz anahtarın üzerine yeni veriyi doğrudan yazar. Eski veriyi umursamaz, tamamen ezer. Bu yöntem basittir ancak oyuncu aynı anda iki farklı sunucuya bağlanmaya çalışırsa veri çakışmalarına (Data Loss) yol açabilir. Çok daha güvenli olan yöntem ise `UpdateAsync(Key, CallbackFunction)` kullanmaktır. UpdateAsync, önce buluttaki mevcut veriyi çeker, sizin belirlediğiniz fonksiyona göre veriyi günceller ve üstüne yazar. Saniyede binlerce oyuncunun girip çıktığı büyük oyunlarda çakışmaları önlemek için her zaman UpdateAsync tercih edilmelidir.
PlayerRemoving Eventi ile Çıkışta Kayıt Alma
Verilerin Roblox bulutuna en çok gönderildiği an, oyuncunun oyundan çıktığı andır. `game.Players.PlayerRemoving:Connect(function(player))` eventi, oyuncu sunucudan koptuğu saniyede tetiklenir. Bu fonksiyonun içinde oyuncunun güncel parası, seviyesi ve eşyaları bir Lua tablosunda (Table) toplanır ve pcall ile sarılmış bir UpdateAsync fonksiyonuyla buluta iletilir. Çok fazla veriyi ayrı ayrı kaydetmek yerine, oyuncuya ait her şeyi tek bir Tablo objesi içinde gruplayıp JSON formatına benzer bir yapıyla tek seferde kaydetmek, API sınırlarını aşmamanızı sağlar.
API Sınırları ve Rate Limiting (Kota Yönetimi)
Roblox, DataStore kullanımını belirli kotalarla sınırlar. Bir sunucuda dakikada yapabileceğiniz kayıt işlemi oyuncu sayısına göre hesaplanır. Eğer oyuncunun verisini her para kazandığında (örneğin her saniye) buluta kaydetmeye çalışırsanız, \’Rate Limit Exceeded\’ hatası alırsınız ve veriler kaydedilmez. Doğru mimari; verileri oyuncu oyundayken sunucu belleğinde (Server Storage veya Modül scriptlerinde) tutmak, belirli aralıklarla (Örn: her 60 saniyede bir Auto-Save) ve oyuncu çıkarken buluta göndermektir.
Başlangıç Kontrol Listesi
- Studio ayarlarından \’Enable Studio Access to API Services\’ seçeneğini mutlaka aktif edin.
- Veri kaydetmek için oyuncunun ismini değil, değişmeyen `UserId` değerini anahtar (Key) olarak kullanın.
- Tüm `GetAsync` ve `UpdateAsync` çağrılarını `pcall` bloğu içine alarak hata kontrolü yapın.
- Verileri saniyede bir değil, sadece önemli olaylarda ve oyuncu çıkarken kaydedin.
- Test ederken Studio\’yu kapatmadan önce kaydın tamamlanması için `game:BindToClose` fonksiyonu ile sunucu kapanışını bekletin.
Sonuç
Roblox oyunlarında oyuncu tutundurmanın (Retention) en temel şartı, oyuncuların ilerlemesini güvenle koruyabilmektir. DataStoreService mimarisini pcall ile hatalara karşı korunaklı ve UpdateAsync ile veri çakışmalarına karşı dirençli bir şekilde kurmak, profesyonel Roblox oyun geliştiriciliğinin ilk adımıdır. SoftPusula görselinde Roblox Creator Hub üzerindeki DataStoreService dokümantasyon kodu veya Studio script arayüzü kullanılmalı; genel oyuncu avatarları kullanılmamalıdır.
Görüşünüz bize yol gösterir.
Tek dokunuşla değerlendirin. Kişisel bilgi toplanmaz.