Unity oyununda oyuncunun ilerlemesini kaydetme


22

Unity oyun motorunu kullanarak bir oyun yapıyorum. Seviyeyi, tecrübe puanlarını, seçili karakteri vb. İçeren oyuncunun ilerlemesini kaydetmek istiyorum. Halen playerprefs kullanıyorum ama bunun bu oyunu mobil cihazlarında (Android / iOS) çalıştıracak oyuncular için işe yarayıp yaramayacağını bilmek istiyorum. masaüstü olarak (OSX / PC)? Değilse, o zaman bu bilgiyi nasıl kaydetmeliyim? Her aşamayı temizledikten sonra oyuncunun ilerlemesini otomatik kaydetmek istiyorum.

Yanıtlar:


30

PlayerPrefs çapraz platform çalışacaktır, ancak oluyor değil bu dosyalar oyun ilerleme için önerilen bu güvensiz olduğu içindir. Düz metin dosyası olarak, bir oynatıcı kolayca açabilir ve içeriğini aldatmak için değiştirebilir veya oyununuzun tahmin edilemez şekilde davranmasını sağlayabilir. Ayrıca etrafta kalacağı da garanti değil.

PlayerPrefs , kontrol eşleme veya müzik / sfx ayarları gibi temel olmayan tercih bilgileri için tasarlanmıştır - oynatıcının yine de serbestçe değiştirebileceği şeyler (ve örneğin Windows'ta) bir sistem geri yükleme noktası kullanıyor ve kaybederlerse korkunç derecede özlemeyecekleri şeyler kayıt bilgilerinin bir kısmı. Bu yüksek puanlarını veya kampanyadaki ilerlemesini kaybetmiş olsaydı, oyuncular haklı olarak üzülürdü!

Bunun yerine, oyun ilerlemesini kendi dosyanıza kaydetmeniz önerilir (değişiklik yapmayı zorlaştırmak istiyorsanız genellikle ikili, muhtemelen şifrelenmiş veya imzalanmış, ancak Philipp'in bu konudaki yorumuna bakınız).

Her platformda güvenilir bir kaydetme konumu elde etmek için Application.persistentDataPath'i kullanabilirsiniz . Bu, tipik olarak yukarıdaki örnekteki gibi durumlarda silinmeyecek bir kullanıcı veri klasöründedir.

Kaydedilecek bir yolunuz olduğunda, dosyanızı oluşturmak, yazmak ve okumak için normal C # IO yöntemlerini kullanabilirsiniz. Ayrıntılar, dosya kaydetme biçiminize ve yapınıza bağlı olarak çok fazla değişiklik gösterir; bu nedenle sorunla karşılaşırsanız, ne yapmaya çalıştığınızı ve nerede kaldığınızı ayrıntılarıyla gösteren yeni bir soru sormak en iyisidir.


30
Bence, savegame dosyalarınızı şifrelemek ve imzalamak sadece yılan gibi. Güvenli değil çünkü anahtarlarınızı ve algoritmalarınızı, yetenekli bir bilgisayar korsanının erişebileceği, oyununuzdaki yürütülebilir dosyada saklamak zorundasınız. Aynı zamanda anlamsız. Tek oyunculu bir oyun olduğunda: Neden rahatsız ettin? Oyuncu istediği şekilde oyunun tadını çıkarsın. Çok oyunculu bir oyun olduğunda, her şeyi sunucuda manipülasyondan güvenli olduğu yerde saklamanız gerekir.
Philipp,

5
@ SamedTarıkÇETİN Veri yolu (oyununuzun yüklendiği yer) ve kalıcı veri yolu (yeni veri kaydetmek için güvenilir bir yer ) arasında önemli bir fark vardır . Bazı platformlarda, yerleşik bir oyun yüklü veri yoluna yazamaz, bu nedenle kalıcı veri yolu konumuna kaydetmenin genel bir kural olarak kullanılması önerilir.
DMGregory

2
@Philipp ile müşteri tarafı depolamanın hiçbir zaman gerçekten güvenli olmadığı ve çoğu durumda tek oyunculu oyunların güvenliğini sağlama konusunda çok fazla elimizde olmamız gerekmediği konusunda hemfikir olmama rağmen, sonuç olarak bir seçenek Her yaratıcının kendileri için yapması gerekir. Bu cevapla, sadece oyun sahibine, oyunlarına neyin uygun olduğu hakkında bilinçli bir seçim yapması için bilgi vermek istiyorum.
DMGregory

1
Bir yandan, @Philipp ile aynı fikirdeyim ama aynı zamanda bir metin editöründe çalışmak için tamamen okunaksız olan seri hale getirilmiş bir kayıt dosyası gördüm / çalıştım. Evet, muhtemelen nasıl gireceğimi ve bir miktar değişiklik veya başka bir şey yapabileceğimi çözebilirdim, ancak dosya 2 hektar ham onaltılık gibi göründüğü için anlamayacak bir iş olurdu. Bu gibi durumlarda, sadece en fazla insan ölümü onu sökmeye çalışacak ve sonuçlar oyundaki o noktaya özgü olacaktır (kaydetmeye bir birim daha eklenmesi tüm sonraki verileri aşağı akışa iter). Sonra tekrar, güvenli olması amaçlanmamıştı .
Draco18,

2
@ShantanuSingh, PlayerPrefs'te saklamayın. Bu tür bilgiler uzak bir veritabanında saklanmalı ve uygulama başlangıcında istenmelidir. İnternet bağlantısı olmadığında uyumluluk için yerel, güvenli bir dosyaya geri dönün (yani: şifreli). Varsa, veritabanı değerleri yerel değerlerin üzerine yazılmalıdır. Diğer davranışlardaki şeyleri de işleyen uygulama içi satın alma eklentileri olabilir, ancak muhtemelen "internet gerekli", bilgisayar korsanlığı (şifreli bir dosya bile% 100 güvenli değildir) veya bu yorum ayrıntıları gibi olacaktır.
Draco18,


-1

PlayerPrefs, hangi platformda olursanız olun "sadece çalışmak" için tasarlanmış bir K / V mağazasıdır. Diyelim ki zorlayıcı bir nedeniniz olmadığı sürece kullanmaya devam edin.


PlayerPrefs'i kullanmamak için zorlayıcı nedenler varsa , sorunun oldukça fazla olduğunu düşünüyorum (evet, var). Gibi ben bu cevabı reddetti çünkü soruyu cevaplamadı.
Peter - Unban Robert Harvey

-1

Yani en iyi yol sunucu tarafı tasarruf mu? Gerekli tüm bilgileri json string'e çevirip kendi mysql sunucusuna string data olarak saklayın ve ne zaman yüklenmeli, sunucuya bağlanmalı ve geri yüklemeli mi?


4
Bu sorunun cevabı değil. Bir sorunuz varsa, yeni bir soru olarak sorun .
Sourav Paul,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.