Jump to content
Unity Insider Forum

txt oder xml Zeilen auslesen


cacysunlee

Recommended Posts

Hallo zusammen,

 

ich bräuchte ein paar Tipps wie man am besten eine txt oder xml Datei ausliest.

Dieses soll dann als einfache Würfel auf Grid projiziert werden.

Wobei das Script für x einen schwarzen und für 0 einen grünen Würfel erstellt.

 

Also die txt sieht z.B. so aus :

 

xxxxx

xx0xx

x00xx

xx0xx

xxxxx

 

Ich brauche natürlich hier nicht gleich das ganze Script, sondern nur ein paar Tipps wie ich da am besten rangehen soll und mit welchen Funktionen.

post-411-0-41398700-1327921537_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Für sowas ist eine XML ein Overkill. Ich habe selbst schon solch ein System gebastelt.

 

Grundlegend ist deine Anlaufstelle der TextReader (http://msdn.microsoft.com/de-de/library/system.io.textreader.readtoend.aspx).

Mit dem Mapformat, das du gepostet hast ist das ziemlich einfach. Du benutzt ReadToEnd um die komplette Txt einzulesen. Danach Regex.Split ( http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.split.aspx) mit "\n" benutzen um den erhaltenen String an den Zeilenumbrüchen zu teilen. Dann mit 2 Verschachtelten Schleifen jeweils das String-Array durchlaufen und die Würfel setzten.

Ich hoffe ich hab mich verständlich ausgedrückt, ansonsten einfach Fragen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab sowas ähnliches mal gebraucht und kam dann auf folgende Lösung (kleiner CodeSnippet für c# und txt):

 

string path = Application.dataPath;
string fileName = "hierDeinDateiName";
using(StreamReader reader = new StreamReader(path + fileName))
{
  string line;
  while((line = reader.ReadLine()) != null)
  {
   	 line = line.Trim();
	 //Hier Line für Line bearbeiten. z.B. string[] gameParts = line.Split(',');
  }
}

 

Kann sein, dass XML genauso behandelt wird oder mit einem XML-Parser, aber da musste einfach nochmal suchen. Bin bLames Meinung, das XML normalerweise zu mächtig für sowas ist.

 

Viel Spaß damit!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aha, TextReader war das Stichwort. :)

Ich kann C# leider nicht so gut, aber mit JavaScript kann ich schon mal den Text auslesen und Inhalt wieder geben.

 

 

var dateiName = "test.txt";
var qubusSchwarz : GameObject;
var qubusRot   : GameObject;

function Start () {
var inhalt = new StreamReader(Application.dataPath + "/" + dateiName);  //setze Variable fuer inhalt
var dateiInhalt = inhalt.ReadToEnd(); //lese die datei zum bis zum ende und uebergebe dateiInhalt in inhalt variable
inhalt.Close(); // lesevorgang beenden

var zeilen = dateiInhalt.Split("\n"[0]); //teile dateiInhalt in Zeilenumbrueche
for (zeile in zeilen) {  //schleife fuer jede zeile
 plaziereWuerfel();   // funktion fuer wuerfel plazieren
	print (zeile); //debuge jede zeile einzeln aus
}
}

Das funktioniert schon mal gut.

Muss jetzt zur Arbeit, später versuche ich dann den zweiten teil.

Danke euch schon mal soweit. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

So, jetzt muss ich nur noch einen Weg finden das für x ein schwarzer und für O ein roter Würfel gesetzt wird.

Und das als verschachtelte Schleife, da bräuchte ich noch ein Tip wie ich das am besten abfrage/erkenne.

 

Mein Code bis jetzt :

 

 

import System.IO;

var dateiName = "test.txt";
var qubusSchwarz : GameObject;
var qubusRot   : GameObject;

function Start () {
var inhalt = new StreamReader(Application.dataPath + "/" + dateiName);  // setze Variable fuer inhalt
var dateiInhalt = inhalt.ReadToEnd(); // lese die datei zum bis zum ende und uebergebe dateiInhalt in inhalt variable
inhalt.Close(); // lesevorgang beenden

var zeilen = dateiInhalt.Split("\n"[0]);// teile dateiInhalt in Zeilenumbrueche
for (zeile in zeilen) {   // schleife fuer jede zeile
 plaziereWuerfel();	// funktion fuer wuerfel plazieren
 y = y-2;  // naechste reihe eine zeile tiefer
	print (zeile);  // debuge jede zeile einzeln aus
}
}

var y : int = 0; // position von y
function plaziereWuerfel() {	

  for (var i : int = 0;i < 5; i++) {
Instantiate (qubusSchwarz, Vector3(i * 2.0, y, 0), Quaternion.identity); // hier fehlt erkennung
Instantiate (qubusRot, Vector3(i * 2.0, y, 0), Quaternion.identity); // hier fehlt erkennung

print("plaziereWuerfel " +i); // debug
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

in C# würde das ganze in etwa so aussehen:

 

// Jede Zeile durchgehen
foreach (string zeile in zeilen)
{
 // jeden Char der Zeile durchgehen
 for (int i = 0; i < zeile.Length; i++)
 {
  plaziereWuerfel(s[i], i);		
 }
 y = y-2;  // naechste reihe eine zeile tiefer
}

void plaziereWuerfel(char c, int i)
{		  
  switch (c)
  {
  case 'x':
  {
	  // bei kleinem x Schwarzen Würfel setzen
	 Instantiate (qubusSchwarz, Vector3(i * 2.0, y, 0), Quaternion.identity);
	 break;
  }
  case 'o':
  {
	  // bei kleinem o Roten Würfel setzen
	  Instantiate (qubusRot, Vector3(i * 2.0, y, 0), Quaternion.identity);
	  break;
  }
  case default:
  {
	  // bei allen anderen Zeichen was setzen?
	  Instantiate (qubusRot, Vector3(i * 2.0, y, 0), Quaternion.identity);
	  break;
  }
  }
}

 

Der Code ist jetzt mal soweit ungetestet da ich noch in der Arbeit sitze aber so sollte es wie gesagt unter C# funktionieren.

 

Edit: Habe das durchgehen der Zeile in eine for-Schleife geändert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe versucht jetzt mit einem Substring zu arbeiten, das sieht nun so aus :

 

 

import System.IO;

var dateiName = "test.txt";
var qubusSchwarz : GameObject;
var qubusRot   : GameObject;

function Start () {
var inhalt = new StreamReader(Application.dataPath + "/" + dateiName);  // setze Variable fuer inhalt
var dateiInhalt = inhalt.ReadToEnd(); // lese die datei zum bis zum ende und uebergebe dateiInhalt in inhalt variable
inhalt.Close(); // lesevorgang beenden

var zeilen = dateiInhalt.Split("\n"[0]);// teile dateiInhalt in Zeilenumbrueche

for (zeile in zeilen)
{
// jeden Buchstaben der Zeile durchgehen
for (var i : int = 0; i < zeile.Length; i++)
{
var currentString = zeile.Substring(0, i);
plaziereWuerfel(currentString, i);
print ("aktueller Buchstabe " + currentString);
}
y = y-2;  // naechste reihe eine zeile tiefer
}
}

var y : int = 0; // position von y
function plaziereWuerfel (currentString,i) {
switch (currentString)
  {
case "x":
Instantiate (qubusSchwarz, Vector3(i * 2.0, y, 0), Quaternion.identity);
print ("fuer x " + i);
break;

case "o":
Instantiate (qubusRot, Vector3(i * 2.0, y, 0), Quaternion.identity);
print ("fuer o " + i);
break;

default:
Instantiate (qubusRot, Vector3(i * 2.0, y, 0), Quaternion.identity);
print ("default " + i);
break;
  }
}

 

Beim debuggen stelle ich nun sowas fest

aktueller Buchstabe x

aktueller Buchstabe xx

aktueller Buchstabe xxx

...

Nur die erste "Ausgabe" wird als x erkannt und auch das richtige case verwendet, bei den nächsten nimmt er natürlich das default-case. ^^

Ich bin nah dran und versuche es weiter. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem ist folgendes in diesem Fall:

 

for (var i : int = 0; i < zeile.Length; i++)
{
var currentString = zeile.Substring(0, i);
plaziereWuerfel(currentString, i);
print ("aktueller Buchstabe " + currentString);
}

 

Bei:

 

zeile.Substring(0,i)

 

ist der erste Parameter der Startindex. Der zweite die Länge. Somit werden dir bei jedem Durchlauf,

da i ja jedesmal um 1 erhöht wird, eben erst ein Zeichen, dann zwei usw. zurückgegeben.

 

Um immer um eins "vorzurücken" musst du es ändern in:

 

zeile.Substring(i,0);

Link zu diesem Kommentar
Auf anderen Seiten teilen

Falls du willst: Ich hab hier mal meine sache umgeschrieben auf dich. Funktioniert mit

 

x/x/x/x/
x/o/o/x/
x/o/o/x/
x/x/x/x/

super. Überall, wo ein "/" ist, habe ich ein Leerzeichen eingefÜgt.

Der Code:

 

 

 

using UnityEngine;
using System.Collections;
using System.IO;
using System.Text.RegularExpressions;

public class loadFromTXT : MonoBehaviour
{
 public GameObject qubusSchwarz;
 public GameObject qubusRot;

 public string dateiName;

 [HideInInspector]
 public GameObject[,] mapData;

void Start()
{
 LoadMap(dateiName);
}

void LoadMap(string fileName)
{
 StreamReader strm = new StreamReader(Application.dataPath + "/" + fileName);
 string wholeMap = strm.ReadToEnd();
 strm.Close();
 Regex regex = new Regex("\n");
 string[] mapLines = regex.Split(wholeMap);

 mapData = new GameObject[mapLines.Length,mapLines[0].Length];
 regex = new Regex(" ");

 for(int x = 0; x < mapLines.Length; x++)
 {
string[] mapLine = regex.Split(mapLines[x]);

for(int y = 0; y < mapLine.Length; y++)
{
  if(mapLine[y].Equals("x"))
  {
	mapData[x,y] = (GameObject)Instantiate(qubusSchwarz, new Vector3(x, 0, y), Quaternion.identity);
  }
  else if(mapLine[y].Equals("o"))
  {
	mapData[x,y] = (GameObject)Instantiate(qubusRot, new Vector3(x, 1, y), Quaternion.identity);
  }
  else
  {
	//Was du bei anderen Dingen machen willst
  }
}
 }
}
}

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Caldrak,

vielen Dank für deinen Tipp, das funktioniert gut :) (siehe Bild unten)

Da wird noch ein Default-Würfel(rot) zuviel erzeugt, aber da komme ich noch dahinter.

 

import System.IO;

var dateiName = "test.txt";
var qubusSchwarz : GameObject;
var qubusGruen   : GameObject;
var qubusRot   : GameObject;

function Start () {
   var inhalt = new StreamReader(Application.dataPath + "/" + dateiName);  // setze Variable fuer inhalt
   var dateiInhalt = inhalt.ReadToEnd(); // lese die datei zum bis zum ende und uebergebe dateiInhalt in inhalt variable
   inhalt.Close(); // lesevorgang beenden

   var zeilen = dateiInhalt.Split("\n"[0]);// teile dateiInhalt in Zeilenumbrueche

   for (zeile in zeilen) 
{
// jeden Buchstaben der Zeile durchgehen
for (var i : int = 0; i < zeile.Length; i++)
{
var currentString = zeile.Substring(i, 1);
plaziereWuerfel(currentString, i);
print ("aktueller Buchstabe " + currentString); //debug      
}
y = y-2;  // naechste reihe eine zeile tiefer
}
}

var y : int = 0; // position von y
function plaziereWuerfel (currentString,i) {

switch (currentString)
  {
   case "x":
   Instantiate (qubusSchwarz, Vector3(i * 2.0, y, 0), Quaternion.identity);
   print ("fuer x " + i); //debug
   break;

   case "o":
   Instantiate (qubusGruen, Vector3(i * 2.0, y, 0), Quaternion.identity);
   print ("fuer o " + i); //debug
   break;

   default: // rote Wuerfel fuer default
   Instantiate (qubusRot, Vector3(i * 2.0, y, 0), Quaternion.identity);
   print ("default " + i); //debug
   break;
  }
}

 

oplxi.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...