Oyun durumunu nasıl kurtarıyorsunuz?


27

Oyun durumunu kaydetmek ve devam ettirmek için oyun programcılarının izlediği prosedür nedir? dosyalar / eşlemeler gibi. Kule savunma oyunu için saklamak istiyorum ve unity3D oyun motorunu kullanıyorum.

Yanıtlar:


16

Genellikle bellek görüntüsü olarak düşünmüyorum, ancak oturumlar arasında hangi değerlerin kaydedilmesi gerektiğini ve bu değerleri harici bir dosyaya kaydetmesi gerekenlerin bir listesini yapıyorum.

Bu elbette kendi oyununun ihtiyaçlarına bağlı, ama genellikle şu anki seviyenin durumunu (yani tüm düşmanların nerede olduğu, sağlıklarının ne olduğu vb.) Ve oyuncu seviyelerini yükselten gibi yüksek seviyeli durumlardan kurtardım. çoktan tamamladı


3
+1 İşte böyle yapıyorum. İkili bir dosyaya ihtiyacım olanı yazıyorum. Ve yeni bir şey eklemem gerekirse, sonuna kadar ekliyorum ki eski dosyaları saklamam.
kaosTeknoloji Uzmanı

Bu, eski kaydetme dosyalarını kırmama konusunda iyi bir ipucu, buna rağmen sonuna veri eklemek, verileri nasıl kaydettiğim ile ilgili değil. Bir Sözlüğü seri hale getirerek / seri hale getirerek yapıyorum ve o veri yapısında düzen önemsiz.
Aralık'ta

(temelde, jonas 'kodundaki kod,
Nesnem

10

Bu cevap Unity3d'ye özeldir .
Unity'de, çoğu sınıf serileştirilebilirdir, bu, Unity nesnelerinin tamamını diske aktarabileceğiniz anlamına gelir. Follwing UnityScript-Code, bir nesneyi seri hale getirmenin, onu tekrar diske kaydetmenin bir yoludur (yükledikten sonra nesneyi kullanmanız gerekir):

import System;
import System.IO;
import System.IO.Stream;
import System.Runtime.Serialization;
import System.Runtime.Serialization.Formatters.Binary;

class SaveLoad {
        public static function SaveFile(filename:String, obj:Object):void {
                try {
                        Debug.Log("Writing Stream to Disk.", SaveLoad);
                        var fileStream:Stream = File.Open(filename, FileMode.Create);
                        var formatter:BinaryFormatter = new BinaryFormatter();
                        formatter.Serialize(fileStream, obj);
                        fileStream.Close();
                } catch(e:Exception) {
                        Debug.LogWarning("Save.SaveFile(): Failed to serialize object to a file " + filename + " (Reason: " + e.ToString() + ")");
                }
        }

        public static function LoadFile(filename:String):Object {
                try {
                        Debug.Log("Reading Stream from Disk.", SaveLoad);
                        var fileStream:Stream = File.Open(filename, FileMode.Open, FileAccess.Read);
                        var formatter:BinaryFormatter = new BinaryFormatter();
                        var obj:Object= formatter.Deserialize(fileStream);
                        fileStream.Close();
                        return obj;
                } catch(e:Exception) {
                        Debug.LogWarning("SaveLoad.LoadFile(): Failed to deserialize a file " + filename + " (Reason: " + e.ToString() + ")");
                        return null;
                }       
        }
}

2
C # kullanmanın yanı sıra, PlayerPrefs'i de kullanmak istersiniz. Onlar çapraz platform, Web / iOS / Android'de IO yapamazsınız. unity3d.com/support/documentation/ScriptReference/… (Güzel bir örnek olsa da!)
TJHeuvel

PlayerPrefs, daha az esnek, platformlar arası ve tekil veya alakasız değerleri saklamak için mükemmel. Ancak Windows PlayerPrefs kayıt defterinde, plaintext olarak saklanır.
jonas

7
Zaten serileştiriyorsanız, neden bir String dizisine serilediğiniz ve PlayerPrefs'te saklayamadığınız. Daha az esnek olduğundan emin olun, ancak hemen hemen bir crossplatform oyunu için tek çözüm.
TJHeuvel

2
PlayerPrefs, ayarlar gibi küçük verileri depolamak için mükemmeldir, ancak tüm kayıt oyunları
jhocking

2
@TJHeuvel: "Web'de / iOS / Android'de IO yapamazsınız" Kesinlikle
mobilde

2

Bir TD için muhtemelen sadece dalgalar arasında tasarruf yapacağım. Tüm düşünmeniz gereken bu şekilde kuleler. Bazı otomatik kaydetme noktalarını seviyelere yerleştirin, aralarında en fazla 10 dakika, ancak daha az olasılıkla tercih edilir.

Tabii ki seviyeleriniz yeterince kısaysa kampanya durumundan başka hiçbir şeyi kurtaramazsınız.


1

Oyunun şu anki durumuna atıfta bulunduğumda, kaydettiğim andaki hafıza görüntüsüne bakıyorum. Bunu, HDD’nizde depolayacağınız verilerden yeniden oluşturabilmeniz gerekir.

Temelde bir bellek dökümü yapmak için kalıcı olması ve HDD'ye atılması gereken verileri içeren tüm sınıfları serileştirmek en kolayıdır. Bununla ilgili sorun, sınıfları değiştirmenin, serileştirilmiş değerlerin sayısını / türlerini değiştirmesi ve eski tasarrufları kırmasıdır. Ayrıca her şeyi kaydettiğiniz için yükleme sürelerini arttırır. Şimdiki "bellek görüntüsünü" yeniden düzenlemek için gerekli olan bireysel alanları işaretlemek daha verimlidir. Sonra kaydedilen verilerden "hafıza anlık görüntüsünü" yeniden oluşturun.

Ayrıca Birlik'i daha önce hiç kullanmadım, bu yüzden içinde yerleşik bir şey olabilir. Ancak, bu tipik bir yaklaşımdır.


devletlerimi bir dosyada saklamak zorunda mıyım?
Syed

1
@Syed evet, günün sonunda uygulama durumu hafızasına kaydedilmeyeceğinden bir tür dosyaya yazılmalıdır. Unity ile, tüm dosya okuma / yazma işleminden kaçınmak istiyorsanız, PlayerPrefs sınıfını (aslında Windows'ta kayıt defterinde bulunan şeyleri sakladığını düşünüyorum) kullanabilirsiniz.
Tetrad
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.