cacysunlee Geschrieben 30. Januar 2012 Melden Share Geschrieben 30. Januar 2012 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hendrik Geschrieben 30. Januar 2012 Melden Share Geschrieben 30. Januar 2012 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 More sharing options...
Panda Geschrieben 30. Januar 2012 Melden Share Geschrieben 30. Januar 2012 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 More sharing options...
cacysunlee Geschrieben 31. Januar 2012 Autor Melden Share Geschrieben 31. Januar 2012 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 More sharing options...
cacysunlee Geschrieben 31. Januar 2012 Autor Melden Share Geschrieben 31. Januar 2012 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 More sharing options...
Irgantox Geschrieben 31. Januar 2012 Melden Share Geschrieben 31. Januar 2012 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 More sharing options...
cacysunlee Geschrieben 31. Januar 2012 Autor Melden Share Geschrieben 31. Januar 2012 Vielen Dank Caldrak, kompiliert wird es schon mal, nur sind alle würfel rot, ich muss nochmal in ruhe durchgehen. Edit: Mit dem String und case muss ich nochmal schauen wie das richtig zugeordnet wird dem x und o. Edit 2 : siehe nächsten Post. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
cacysunlee Geschrieben 31. Januar 2012 Autor Melden Share Geschrieben 31. Januar 2012 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 More sharing options...
Irgantox Geschrieben 31. Januar 2012 Melden Share Geschrieben 31. Januar 2012 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 More sharing options...
Hendrik Geschrieben 31. Januar 2012 Melden Share Geschrieben 31. Januar 2012 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 More sharing options...
cacysunlee Geschrieben 31. Januar 2012 Autor Melden Share Geschrieben 31. Januar 2012 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; } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
cacysunlee Geschrieben 31. Januar 2012 Autor Melden Share Geschrieben 31. Januar 2012 Hallo bLame, vielen Dank für deine Mühe, dein erster Post war schon sehr hilfreich für mich. Natürlich auch interessant wie deine Lösung in C# mit If-Anweisung aussieht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
cacysunlee Geschrieben 1. Februar 2012 Autor Melden Share Geschrieben 1. Februar 2012 So, die roten Würfel sind nun auch weg. Lösung war ganz einfach : Beim default case einfach das instantiate raus nehmen ^^ Thema erledigt, vielen Dank an alle Supporter ! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.