Jump to content
Unity Insider Forum

Xenes' Blog

  • Einträge
    6
  • Kommentare
    46
  • Aufrufe
    51.640

Save/Load mit txt, 1: Speichern


Xenes

4.840 Aufrufe

Hallo,
ich beschäftige mich heute mit dem speichern in Unity mit einer Textdatei.
Textdatei? Das ist doch dieser Krampf, der nix kann!
Von wegen!

Zunächst einmal schauen wir uns eine beliebige Textdatei an, oder öffnen eine neue. Wie im Namen schon enthalten, kann eine Textdate nur Text enthalten, also Zahlen, Buchstaben und Zeichen.

Wie jetzt? Unsere drei Grundvariablen sind doch auch nur Buchstaben oder Zeichenketten!
Also Variablen in einer *.txt schreiben? Ja, ganz genau!

[quote]
Was ist mit Vector3, boolean, etc?
Ja, auch die könnten wir schreiben. Aber die einzige Schwierigkeit in einer txt ist das Lesen, nicht das Schreiben. Bei lesen aus einer txt wird nämlich alles aus String ausgegeben. Während wir Zahlen mit dem ParseInt oder ParsFloat wieder zurückkonvertieren können, wirds mit Vektoren oä schwierig.
[/quote]

Aber wie fangen wir jetzt an? Zunächst einmal bauen wir uns eine Szene mit einem FirstPersonController und einer Plane (nicht vergessen: Main Camera löschen)
Dann setzen wir den FPC auf die Plane und erstellen dann ein neues JavaScript, ich nenne es [b]SaveLoad.js[/b]

Dann öffnen wir das Script und haben folgendes:
[CODE]
#pragma strict
function Start () {
}
function Update () {
}
[/CODE]

Wie können wir nun aber ein File schreiben?
Dazu hilft der namespace [b]System.Io[/b]
Der MSDN sagt dazu:
[quote]
Der System.IO-Namespace enthält Typen, die das Lesen und Schreiben für Dateien und Datenstreams zulassen, sowie Typen, die grundlegende Unterstützung für Dateien und Verzeichnisse bieten.
[/quote]

Also nur diesen Namespace importiern und auf die Funktionen zugreifen? Ja, ganz genau!
Also fügen wir unter dem #pragma hinzu:

[CODE] import System.IO;[/CODE]

Danach löschen wir die Funktionen Update und Start und fügen folgende drei hinzu:
[CODE] #pragma strict
import System.IO;
function WriteFile () {
}
function ReadFile () {
}
function OnGUI() {
}[/CODE]

über das GUI wollen wir auf unsere Funktionen zugreifen, also machen wir zwei Buttons:
[CODE] function OnGUI() {
if(GUI.Button(Rect (0,0,150,50),"Save")){
WriteFile();
}
if(GUI.Button(Rect (0,50,150,50),"Load")){
ReadFile();
}
}[/CODE]

Ok, so weit, so einfach.
Jetzt überlegen wir, was wir speichern wollen.
Ich nehme hier jetzt einfach nur die Spielerposition.

Dafür brauchen wir den [url="http://msdn.microsoft.com/de-de/library/system.io.streamwriter.aspx"]StreamWriter[/url]
Mit ihm können wir eine txt mit einem Namen in einen von uns gewählten Pfad speichern.

Also schreiben wir folgendes:
[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 () {
}

function OnGUI() {
if(GUI.Button(Rect (0,0,150,50),"Save")){
WriteFile();
}
if(GUI.Button(Rect (0,50,150,50),"Load")){
ReadFile();
}
}
[/CODE]

Application Datapath ist der Pfad, wo unsere zukünftige *.exe ist.
Wenn wir das jetzt in unsere Szene hinzufügen und die variable Player assignen, dann auf Save klicken, wird eine neue txt importiert mit unseren drei Positionen.

Das war der erste Teil des Speichern und Ladens via txt.
Es folgt auf jeden Fall noch laden und später vielleicht noch verfeinern mit Ordnern und eigenen Namen des Savegames etc.

Bis dahin:
Hoffe, es war ein erstes gutes Tutorial und hat euch was gebracht!

Xenes

13 Kommentare


Recommended Comments

Ich hab schon die Fortsetzung:
[url="http://forum.unity-community.de/blog/17/entry-25-saveload-mit-txt-2-laden/"]http://forum.unity-c...it-txt-2-laden/[/url]

Was meinst du mit Szenen laden? Die einzelnen Levels?
Link zu diesem Kommentar
@CreativBase
Also das geht tatsächlicherweise auch...
Man speichert sein Level in ein int via loaded level...

Ich hab glaub ich einen Prototyp. Den kann ich ja im 3. Teil präsentieren...
Link zu diesem Kommentar
Sehr schönes Tutorial. Dankefein :)

Eine Anmerkung hätte ich.
(Application.dataPath +"/Savegame.txt")
Sollte man da nicht noch nen Ordner davorschalten? Also so:
(Application.dataPath +"/meineApp/Savegame.txt")
Im Applicationdata Ordner stecken ja auch sehr viele andere Programme.
Link zu diesem Kommentar
Doch, sollte man. Ich arbeite gerade an den dritten Teil, wo ich drauf eingehe.
Für ungeduldige: Man benutzt dafür System.IO.Directory.CreateDirectory(Application.dataPath +"/Savegames/Savegame.txt"), um einen ordner zu erstellen.
Dann kann man auch einfach darin speichern.
Link zu diesem Kommentar
Das Ganze jetzt auch in Teil 3:
[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]
Link zu diesem Kommentar
Danke.

Du musst die Dateien in einen Vector3 speichern, also:
player.position = new Vector3 (...,...,...);

Das ganze Script in C# findet sich hier:
[url="http://forum.unity-community.de/blog/17/entry-31-saveload-mit-txt-4-buntes-allerlei/"]http://forum.unity-c...untes-allerlei/[/url]
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...