Jump to content
Unity Insider Forum

Xenes' Blog

  • Einträge
    6
  • Kommentare
    46
  • Aufrufe
    51.638

Save/Load mit txt, 2: Laden


Xenes

2.326 Aufrufe

Hallo nochmal,
dies ist hier gleich der zweite teil zu meinem Tutorial zum speichern und laden via Textdatei.
Jetzt geht es ums Laden.

Wer das vorige Tutorial mitgemacht hat, der öffnet jetzt seine savegame.txt und hat so was in der Art vorliegen:

[quote]2.54939
1.05
1.030781[/quote]

Jetzt müssen wir das ganze aber noch wieder einlesen und laden.
Wie geht jetzt das?

Dazu stöbern wir bei [url="http://msdn.microsoft.com/de-de/library/29kt2zfk(v=vs.80).aspx"]System.IO[/url] im msdn rum und entdecken folgende Klasse:
den [url="http://msdn.microsoft.com/de-de/library/system.io.streamreader(v=vs.80).aspx"]StreamReader[/url], also dem Gegenstück zum StreamWriter?

Ja, ganz genau.
Also öffnen wir unser Script und gehen zu unserer Funktion ReadFile() und fügen folgendes hinzu:

[CODE]function ReadFile () {
//wir öffnen einen neuen StreamReader
var sr = new StreamReader(Application.dataPath +"/Savegame.txt");
//Lese zeilen aus...
Player.position.x = parseFloat(sr.ReadLine()); //parse Float, weil es als String gelesen wird
Player.position.y = parseFloat(sr.ReadLine());
Player.position.z = parseFloat(sr.ReadLine());

sr.Close(); //damit schließen wir unseren StreamReader
}[/CODE]

Wir brauchen das parseFloat, um die Umwandlung von String zu Float wieder vorzunehmen Alles andere erklärt sich von selbst.

Wie,das wars?
Ja, das wars.

Jetzt nochmal das ganze Script:

[CODE] #pragma strict

import System.IO;
var Player: Transform;

function WriteFile () {
//wir öffnen einen neuen StreamWriter
var sw : StreamWriter = new StreamWriter(Application.dataPath +"/Savegame.txt");
//drei Zeilenschreiben: position x,y,z
sw.WriteLine(Player.position.x);
sw.WriteLine(Player.position.y);
sw.WriteLine(Player.position.z);

sw.Flush();
sw.Close(); //damit schliessen wir den StreamWriter
}

function ReadFile () {
//wir öffnen einen neuen StreamReader
var sr = new StreamReader(Application.dataPath +"/Savegame.txt");
//Lese zeilen aus...
Player.position.x = parseFloat(sr.ReadLine()); //parse Float, weil es als String gelesen wird
Player.position.y = parseFloat(sr.ReadLine());
Player.position.z = parseFloat(sr.ReadLine());

sr.Close(); //damit schließen wir unseren StreamReader
}

function OnGUI() {
if(GUI.Button(Rect (0,0,150,50),"Save")){
WriteFile();
}

if(GUI.Button(Rect (0,50,150,50),"Load")){
ReadFile();
}
}[/CODE]
Es gibt aber noch viel viel coolere Techniken!

Aber dafür gibts dann einen dritten Tutorialteil.

Bis dahin:
Viel Spass beim experimentiern mit txt Dateien!

Xenes

8 Kommentare


Recommended Comments

Hi,
also erstmal gut gemachtes Tutorial, schön geschrieben und sicher Hilfreich bei kleinen Sachen die man abspeichern möchte!
Aber wie würdest du es mit dieser Methode lösen wenn du eine wirklich große Datei hast in der du nicht zwingend weisst in welcher Zeile welcher Wert steht?
Beispielsweise mehrer Figuren mit Positionen und Attributen, Landschaftsveränderungen, gebauten gebäuden oder gelösten Quests, gefundene Gegenstände etc?
Link zu diesem Kommentar
Ja, das ist natürlich so eine Sache. Es gibt noch bessere Möglichkeiten, das auszulesen (->Teil 3).
Aber ich glaube, das sinnvollste ist es, mehrere Dateien zu machen. Also eine Attribute.txt, Quests.txt oder irgendwie so.
Oder noch besser: Jedes Objekt kriegt eine txt und die wird dann wieder geladen. Speicheraufwand ist eh <0.

Aber danke für dein Lob.
Link zu diesem Kommentar
naja gut ich denke wenn du irgendwann mal 1000 txt datein hast wirds nicht mehr so lustig, vor allem weil das öffnen jeder Datei zeit in anspruch nimmt und außerdem wird der Speicher dann doch irgendwann volgemüllt, eine Datei wäre dann denke ich schon besser... ich geh halt auch immer vom mobile Standpunkt aus da kann man nicht einfach mal hunderte oder tausende datein anlegen... zudem ist es mit einer doch übersichtlicher und ich denke insgesamt auch die bessere Lösung!
Link zu diesem Kommentar
Ich glaube mal etwas von komprimierung gelesen zu haben...
Ich recherchier da mal.
Aber eins wahr: Du musst wissen, wo was gespeichert steht.
Das ist unerlässlich.
Vielleicht gibts auch andere Möglichkeiten...
Für den dritten Teil werde ich mich mal bisschen umsehen.
Link zu diesem Kommentar
Naja du könntest dir nen gescheiten Parser schreiben der dir Zeile für Zeile ausliest und anschließend zugriff auf alle ausgelesenen Objekte mit deren zusätzlichen Eigenschaften gibt!
Also ich glaube du musst nicht unbedingt wissen wo was steht wenn mans richtig angeht.

Versteh mich nicht falsch find dein Tutorial super und das ist auch keine Kritik :) will nur für paar denkanstöße sorgen und wie man das ganze etwas flexibler machen könnte :P
Link zu diesem Kommentar
Jo, schönes Tutorial.:)
Hat schon mal jemand getestet, ob iOS den Speicherpfad mit macht?
Für Standallone auf PC oder MAC ist das schön und auch genauso machbar wie XML. Nur eben dieses verflixte iOS ist für mich ein Rätsel.
Ich muss wohl mal einige Testreihen fahren. ;)
Link zu diesem Kommentar
Danke! Ich hab auch schon den 3. Teil fertig:
[url="http://forum.unity-community.de/blog/17/entry-26-saveload-mit-txt-3-weitere-techniken/"]http://forum.unity-community.de/blog/17/entry-26-saveload-mit-txt-3-weitere-techniken/[/url]

Also ich habs mit iOS nie ausprobiert... Ist ja nicht auf windows unterstützt.
Wäre aber interessant zu wissen, ob das geht..
Link zu diesem Kommentar
Gast
Kommentar schreiben...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...