Kalıcı verileri kullanarak oyun oturumları arasında her bir oyuncuya dair verileri takip edebilir ve kaydedebilirsin. Bu özellik, oyuncuların oyundan ayrılıp daha sonra geri döndüklerinde hedeflerinde ilerlemeye devam edebilecekleri veya oyundan ayrıldıkları sıradaki oyun durumunun aynısını görebilecekleri çeşitli ilerlemeye ilişkin oyun modlarının açılmasını sağlar.
Kalıcı veriler, her bir oyuncunun profili veya istatistikleri gibi verilerinin Verse’te depolanmasıyla çalışır. Bu veriler daha sonra verilerin değeri her değiştiğinde güncellenebilir. Bu veriler kalıcı olduğundan oyun oturumları genelinde kalıcı olacak ve oyuncu oyunda çevrimiçi olduğunda kullanılabilir olacaktır.
Hayatta Kalma, Tycoon, RYO ve Roguelite modları kalıcı verilerin kullanıldığı oyun modlarına örnek olarak verilebilir. Bu tür oyun modları, oyuncuların oynanışı ilerleten uzun vadeli hedefleri karşılayan eşyalar biriktirmesini gerektirir.
Verse kodlarında, modül ve oyuncu başına kaydedilen bilgileri depolamak için kalıcı veriler kullan. Sürekli ilerlemeyi teşvik ederek oyuncuların oyunda kalmasını istediğin oyun modlarında kalıcı veriler uygula.
Süreklilik uygulamayı denemek için Kalıcı Oyuncu İstatistikleri Eğitimi'ne göz at.
Verse’te kalıcı veriler oluşturulup kullanılabilse de kalıcı verileri destekleyen temel işlevselliğe sahip Kreatif cihazları da mevcuttur. Daha fazla bilgi için Süreklilik Cihazları konusuna bak.
Verse’te Sürekliliğin Anlamı
Verse’te bir modülde tanımlanmış olan bir değişken, o değişkenin kapsam dahilinde olduğu durumlarda çalışmakta olan tüm oyun örnekleri için globaldir. Modül kapsamındaki değişkenler, oturum ile ilişkili olanlar haricinde süreklilik gerektirir; bu durumda verilerin geçerli oyunla sınırlı olmayacak şekilde depolanması gerekir. Bu nedenle modül kapsamında hangi türlerin kullanılabileceği konusunda kısıtlamalar vardır.
Şu anda modül kapsamında aşağıdaki türleri kullanabilirsin:
| İzin Verilen Modül Kapsamı Türleri | Açıklama | Kısıtlamalar |
|---|---|---|
|
| Veriler, yalnızca geçerli oturum süresince depolanır ve sonraki rauntlarda kalıcı olmaz. |
| Kalıcı | Oyuncunun kalıcı verilerine erişilmesine yalnızca oyuncu geçerli oyunda olduğunda izin verilir. |
Bir oyuncu bir oyundan ayrılırsa veya geçerli oturumda bulunmuyorsa artık o oyun oturumunda onun verilerini depolayamazsın veya bu verilere erişemezsin. Oyuncu geri dönerse veya aynı oyunu oynarsa onun verilerine erişebilir ve bu verileri güncelleyebilirsin.
Verse’te Kalıcı Veriler Oluşturmak
Oyuncuların oyuna tekrar katıldığı her durumda her oyuncu için sürekli olarak güncellenebilen, depolanabilen ve geri çağrılabilen kendi kalıcı verilerini oluşturabilirsin. Eşleştirme sırasında oyun, yeni oyuncuya ilişkin kalıcı veri olup olmadığını kontrol edecektir. Oyuncunun kullanılabilir kalıcı verileri varsa veriler yüklenir ve Verse kodları için kullanılabilir hale getirilir.
Oyuncunun bir ada için kalıcı verileri varsa ve veri yüklemesi başarısız olursa oyuncu adaya katılamaz. Bu, bir veri yükleme hatası olması halinde kalıcı verilerin üzerine yazılmasını önleyecek koruyucu bir önlemdir.
Verse kodunda kalıcı veriler oluşturmak için anahtar olarak player türünü, değer olarak ise kalıcı bir türü kullanan global bir weak_map değişkeni tanımla. Kalıcı olabilecek türlerin tam listesi için Kalıcı Türler konusuna bak.
Aşağıdaki örnekte, global “weak_map” değişkeni MySavedPlayerData, anahtar olarak oyuncu türünü, değer olarak ise bir tamsayıyı kullanır. Bu değişkende bir oyuncu için tamsayı değerinin depolanması, verilerin oyun oturumları genelinde kalıcı olacağı ve oyuncu oyundayken herhangi bir zamanda bu verilere erişilebileceği ve bunların güncellenebileceği anlamına gelir.
var MySavedPlayerData:weak_map(player, int) = map{}
Kalıcı verilerini tanımladıktan sonra her oyuncu için verileri başlatman gerekir. Bunu, söz konusu oyuncu için zaten depolanmış veri olup olmadığını kontrol edip ardından weak_map'e oyuncuyu ve başlangıç değerini ekleyerek yapabilirsin.
# Runs when the device is started in a running game
OnBegin<override>()<suspends>:void =
InitialSavedPlayerData:int = 0
Players := GetPlayspace().GetPlayers()
for (Player : Players):
if:
not MySavedPlayerData[Player]
set MySavedPlayerData[Player] = InitialSavedPlayerDataÖnceki örnekte yalnızca bir tamsayı değeri depolanmıştır ancak weak_map’te her oyuncu için daha fazla veri depolamak amacıyla sınıf ve dizi gibi başka türler kullanabilirsin. Kullanabileceğin türlerin tam listesi için Kalıcı Türler konusuna bak.
Aşağıdaki Verse örneği, bir oyuncu için depolanabilecek, güncellenebilecek ve daha sonra erişilebilecek özel bir oyuncu profilini bir sınıfta nasıl tanımlayabileceğini gösterir. player_profile_data sınıfı, bir oyuncunun kazandığı TP, sıralaması ve tamamladığı görevler gibi bilgileri depolar.
player_profile_data := class<final><persistable>:
Version:int = 0
Class:player_class = player_class.Villager
XP:int = 0
Rank:int = 0
CompletedQuestCount:int = 0
QuestHistory:[]string = array{}
var PlayerProfileDataMap:weak_map(player, player_profile_data) = map{}Her oyuncu ve ada için depolayabileceğin veri miktarının bir sınırı vardır. Her veri kaydettiğinde güncellemelerinin toplam boyutu nasıl etkilediğini “FitsInPlayerMap” fonksiyonunu kullanarak kontrol etmeni öneririz. Daha ayrıntılı bilgi için Kalıcı Verilerin Sınırlar Dahilinde Olduğunu Test Etmek konusuna göz at.
Artık kendi kalıcı verilerini nasıl oluşturacağını ve her oyuncu için nasıl başlatacağını öğrendiğine göre Verse’te kalıcı verilerle çalışma konusunda önerilen yöntemler için Örnek Uygulamalar bölümünü incelediğinden emin ol!
Adanın Yayınlanmış Sürümleri Arasında Veri Değiştirme
Adanın geçerli sürümünü yayınladıktan sonra kalıcı verilerde güncellemeler yaparsan adanın önceki sürümünde depolanan tüm veriler adanın sonraki sürümlerinde desteklenmelidir.
Bunu sağlamak için UEFN’de geriye uyumluluk denetimi yapılır ve Verse kodu halihazırda yayınlanmış olan sürümle artık uyumlu değilse derleme hatası oluşur. Bu geriye uyumluluk denetimi aşağıdakileri her yaptığında çalıştırılır:
UEFN araç çubuğunda Oturumu Başlat düğmesine tıkla.
UEFN araç çubuğunda Değişiklikleri Gönder veya Verse Değişikliklerini Gönder düğmesine tıkla
Adanın herkese açık yeni sürümünü etkinleştirmek.
Bu geriye uyumluluk denetimi temel olarak, modül kapsamındaki weak_map değişkeninin değer türüne ilişkin olarak gerçekleştirilen bir tür kontrolüdür. Tamsayılar gibi basit türlerde ada yayınlandıktan sonra tür değiştirilemeyebilir. Bu gibi türler arasında, ada yayınlandıktan sonra yapı tanımını değiştiremeyeceğin structs da yer almaktadır.
Şu anda, adanı yayınladıktan sonra daha fazla veri ekleyebileceğin tek kalıcı tür, yeni alanların varsayılan değerlere sahip olması koşuluyla sınıf türüdür. Yeni alanların varsayılan değerlere sahip olması, önceki sürümde yer alan kaydedilen veriler yüklenirken yeni alanlar ile bunların varsayılan değerlerinin de yükleneceği anlamına gelir. Daha ayrıntılı bilgi için kalıcı veri olarak sınıfların kullanılmasına ilişkin örnek uygulamaya göz at.
Adan İçin Kalıcı Verileri Sıfırlama
Adan için kalıcı verilerin sıfırlanmasını zorlaman gerekirse bunu Verse’te, oyuncu adaya katıldığında ona ilişkin weak_map’e kalıcı veriler için varsayılan bir değer atayarak yapabilirsin.
Oyuncunun verilerinin zaten sıfırlanmış olup olmadığını öğrenmek için sınıfın için bir Sürüm değeri ekleyebilir ve bunu, kalıcı verilerinin bir parçası olarak yeni değişikliklerle güncelleyebilirsin. Bu, aşağıda listelenen örnek uygulamalardan yalnızca biridir, bu nedenle diğerlerine de göz atmayı unutma!
Verse'te Kalıcı Türler
Modül kapsamındaki weak_map değişkeninde kullanabileceğin kalıcı türler şunlardır:
| Tür | Açıklama |
|---|---|
Dizi | Bir dizi, o dizideki öğelerin türleri kalıcıysa kalıcıdır. |
char32 | Karakter değerleri kalıcıdır. |
char8 | Karakter değerleri kalıcıdır. |
Sınıf | Bir sınıf aşağıdaki durumlarda kalıcıdır:
|
Renk değerleri kalıcıdır. | |
Enum | Bir enum, kalıcı belirleyici ile tanımlandığında kalıcıdır. |
Kayan değer | Kayan noktalı değerler kalıcıdır. |
Tamsayı | Tamsayı değerleri kalıcıdır. |
Mantık | Mantık değerleri kalıcıdır. |
Harita | Bir harita, hem anahtar hem de değer türleri kalıcıysa kalıcıdır. |
Seçenek | Bir seçeneğin değeri kalıcı ise o seçenek kalıcıdır. |
Yapı | Bir yapı aşağıdaki durumlarda kalıcıdır:
Adanı yayınladıktan sonra kalıcı bir yapıyı değiştiremezsin. Bu nedenle, yalnızca şemanın sabit olduğu bilindiğinde kalıcı yapıların kullanılmasını öneririz. demet |
Demet | Bir demet, her öğe türü kalıcı ise kalıcıdır. |
Vector2 değerleri kalıcıdır. | |
Vector2i değerleri kalıcıdır. | |
Vector3 değerleri kalıcıdır. |
Kalıcı Verilerle Test Yapmak
Adanın en son sürümünü yayınlamadan önce kalıcı veri davranışını test etmek istersen Ada Ayarları cihazında hem Süreklilik Davranışı: Oynanış Testi Oturumu ayarı hem de Süreklilik Davranışı: Düzenleme Oturumu ayarı için aşağıdaki davranışı ayarlayabilirsin:
| Kalıcı Veri Davranışı | Açıklama |
|---|---|
Canlıdan İçe Aktar | Canlı veriler kullanılabilir durumdaysa oturum verilerini canlı verilerden içe aktar. Bunun için adanın canlı olarak yayınlanmış olması ve oyuncunun adanın canlı sürümünde oynamış olması gerekir. Canlı veriler kullanılabilir durumdaysa oynanış testi oturumu verileri canlı verilerin bir kopyasıyla doldurulur. Bu, ada mantığındaki değişikliklerle ilişkili kalıcı verilere dair sorunları test etmek için çok yararlı olabilir. |
Yeni Kullanıcı Simüle Et | Oyuncuyu, o oyuncu adada ilk kez oynuyormuş gibi yeni kalıcı verilerle başlatır. |
Takip/Parça Canlıdan İçe Aktar hem de Yeni Kullanıcı Simüle Et davranışları, hem Verse sürekliliği hem de Kayıt Noktası ile Takip cihazları gibi süreklilik cihazları için çalışır. Yeni Kullanıcı Simüle Et davranışı, oturumu, hem Verse sürekliliği hem de süreklilik cihazları için canlı verileri değiştirmeden boş verilerle çalıştıracak, Canlıdan İçe Aktar ise canlı veriler kullanılabilir durumdaysa her ikisinden de kalıcı veriler yükleyecektir.
Süreklilik verileri davranış ayarları, oynanış testi yaptığında uygulanır. Kalıcı verilerle test yapabileceğin iki farklı senaryo vardır:
Düzenleme Oturumu: UEFN’den bir oturum başlattığında süreklilik verileri davranış ayarları uygulanır. Bu, kalıcı verilerin tek bir oturumda birden fazla oyunda kalıcı olabileceği anlamına gelir. Oturumu kapatıp yeni bir oturum başlatırsan kalıcı veriler sıfırlanır ve süreklilik verileri davranış ayarları yeniden uygulanır.
Oynanış Testi Oturumu: İçerik Üreticisi Portalı’nda bir oynanış testi oluşturduğunda ve bir test oyuncusu, bir oynanış test kodu veya özel bir bağlantı kodu ile bu teste katıldığında süreklilik verileri davranış ayarları uygulanır. Süreklilik verileri davranış ayarları, yalnızca oyuncu teste ilk katıldığı zaman uygulanır. Oyuncu, oynanış testinden ayrılıp teste tekrar katıldığında, oyuncunun verileri oturumlar genelinde kalıcı olacak ve süreklilik verileri davranış ayarları yeniden uygulanmayacaktır. Kalıcı verileri sıfırlamak için yeni bir oynanış testi bağlantı kodu oluşturman gerekir.
Kalıcı verilerin nasıl yönetildiğini ve güncellendiğini etkileyen ada güncellemelerinde, hem UEFN’de hem de bir bağlantı kodu kullanan bir oynanış testinde bir oturum başlatarak her iki senaryoda da test yapmanızı öneririz. Kalıcı verilerde yaptığın değişiklikleri hem canlı verilerle hem de simüle edilmiş yeni kullanıcı verileriyle test ettiğinden emin ol. Böylece güncellemelerinin hem adandaki geçerli oyuncular hem de yeni oyuncular için çalışıyor olmasını sağlayabilmen mümkün olacaktır.
Adanın Yeni Sürümlerini Yayınlamanın Etkileri
Adan yayınlandıktan sonra oyuncuların verileri weak_map’te depolandığında oyuncular için kalıcı bir kayıt oluşturulur. Sonrasında bu veriler depolanacak ve adana yapılacak sonraki ziyaretlerde yüklenecektir.
Adanın yeni sürümleri yayınlanırsa kalıcı veriler otomatik olarak yeni sürümde birleştirilecektir. Daha fazla bilgi için Adanın Yayınlanmış Sürümleri Arasında Veri Değiştirme bölümüne bakabilirsin.
Yayınlanmış Adanı Geri Almanın Etkileri
Adanı İçerik Üreticisi Portalı üzerinden önceki bir sürüme geri alırsan tüm kullanıcılara ait kalıcı veriler sıfırlanacaktır.
Şu anda oyunculara, verilerinin bir geri alma işleminden etkilendiğine dair bildirimde bulunulmasına yönelik bir destek bulunmamaktadır.
Geri alma işlemi, en son oyuncu verisi güncellemelerinin kaybedilmesine neden olabileceği gibi oyuncu verilerinin tamamen sıfırlanmasına dahi yol açabilecektir. Bu etkiler, geri alma işleminin kalıcı verileri etkileyecek mantık değişikliklerini dahili olarak içermediği durumlarda dahi geçerlidir.
Geri alma özelliğinin kalıcı veriler üzerindeki etkisi nedeniyle bu özelliği mecbur kalmadıkça kullanmamanı öneririz.
Sınırlamalar
Aşağıda Verse’te kalıcı verilerle çalışılmasına ilişkin kısıtlamalar yer almaktadır.
Maksimum Kalıcı Obje Boyutu
Bir weak_map’te oyuncu başına depolanabilecek veri miktarının bir sınırı vardır.
weak_map kaydı, tek bir weak_map öğesiyle ilişkili toplam veri miktarıdır. Tek bir weak_map kaydının her oyuncu için maksimum veri boyutu 256 kilobayttır (KB).
Bir “weak_map” değeri kaydedildiğinde, verileri kaydetmek için gereken toplam bellek miktarı hesaplanır.
Aşağıda 256 KB sınırını zorlayacak bazı veri örnekleri verilmiştir:
Yaklaşık 24.000 adet
kayan sayıveyatamsayıdeğeri.Yaklaşık 200.000 karakterlik metin. Bu, ortalama bir romanda yaklaşık 60 sayfa metne denk gelir.
Bir oyuncu kaydı için boyutu 256 KB’den büyük olan veriler kaydetmeye çalışırsan kaydetme işlemi başarısız olur ve Verse çalışma zamanı hatası alırsın.
FitsInPlayerMap Verse yardımcı fonksiyonunu kullanarak kaydetme hatalarını önleyebilirsin. FitsInPlayerMap fonksiyonu kaydetmek istediğin kaydın bir kopyasını alır ve boyutunu kontrol eder. Kayıt kaydedilebiliyorsa fonksiyon çağrısı başarılı olur; aksi takdirde kayıt çok büyükse çağrı başarısız olur.
FitsInPlayerMap fonksiyonu özellikle dinamik bir veri dizisi veya haritası ile çalışılırken ve bunlara yeni öğeler eklenirken oldukça kullanışlıdır. Daha önce kalıcı kayıtta bulunan bir int, float veya logic’in güncellenmesi kalıcı kaydın boyutunu değiştirmeyecektir.
Ada Başına Maksimum Kalıcı Oyuncu Zayıf Haritası
Tek bir adada en fazla dört kalıcı değişken, yani anahtar türü oyuncu olan dört weak_map değişkeni bulunabilir. Bu gereksinim, Verse derleyicisi tarafından zorunlu kılınmıştır.
Sınıf Türü İçeren Zayıf Harita Gereksinimi
Maksimum kalıcı değişken sınırına ulaşılmışsa en az bir kalıcı değişkenin weak_map değeri bir sınıf olmalıdır. Bu gereksinimin amacı, değişkenlere sonradan daha fazla veri eklenirken müteakip ada yayınlama işlemleri sonrasında geriye uyumluluğun sağlanmasıdır.