Willy_Wonder Geschrieben 26. April 2017 Melden Share Geschrieben 26. April 2017 Hallo, ihr netten Menschen! es ist nun meine zweite Frage hier im Forum nachdem ich sehr erfolgreich eure Hilfe umsetzen konnte, kommt nun eine weitere frage, für die ich einen Ansatz brauche. ich bin immer noch ein noob, was scripting angeht...:D es geht um folgendes: ich habe eine szene mit mehreren Objekten. Jetzt ist es so, dass ich die Zustände für die jeweiligen Anlagen aus einer Excel Tabelle ziehen möchte. zB wenn es in der Tabelle steht : "Anlage in Ordnung" soll meiner Anlage eine Farbe zugeordnet werden. Wenn der Zustand in der Tabelle geändert wird, ändert die Anlage wieder die Farbe. Ist es möglich? und wenn ja, könnte mir vielleicht bitte jemand einen Denkanstoß geben? :3 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mabenan Geschrieben 26. April 2017 Melden Share Geschrieben 26. April 2017 Wenn es Excel dateien sein müssen würde ich nach einer .NET lib suchen die das einlesen übernimmt. Falls du CSV nehmen kannst wird das ganze einfacher dann musst du nur parsen. Angenommen deine CSV hat folgende Einstellung (new Column (;) new Line (\n)) dann würde ein parsing für deinen Fall ungefähr so aus sehen. private Dictionary < string, bool > GetAnlagenStatus(string csvString) { string[] csvLines = csvString.Split("\n"); Dictionary < string, bool > anlagenStatus = new Dictionary < string, bool > (); foreach(string csvLine in csvLines) { string anlagenName = csvLine.Split(";")[0]; string active = csvLine.Split(";")[1]; if (active == "1") { anlagenStatus.Add(anlagenName, true); } else { anlagenStatus.Add(anlagenName, false); } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Willy_Wonder Geschrieben 26. April 2017 Autor Melden Share Geschrieben 26. April 2017 habe mich gerade ein bisschen belesen, es scheint generell nicht so einfach zu gehen, exceldaten zu übermitteln. wäre es einfacher, eine Notepad Liste zu erstellen und dann daraus die Zustände ablesen? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mabenan Geschrieben 26. April 2017 Melden Share Geschrieben 26. April 2017 Naja pflegen kann man es schon in excel man sollte es halt as csv datei exportieren https://de.wikipedia.org/wiki/CSV_(Dateiformat) Bei dir könnte dann eine CSV datei dann z.B so aussehen Anlage1;1 Anlage2;0 Anlage3;1 In Excel wären das zwei Spalten in denen dann die Werte stehen Mit dem oben eingefügten script kannst du das dann auslesen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mabenan Geschrieben 26. April 2017 Melden Share Geschrieben 26. April 2017 Hier gibt es auch nochmal ein script ausem wiki http://wiki.unity3d.com/index.php?title=CSVReader Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Willy_Wonder Geschrieben 26. April 2017 Autor Melden Share Geschrieben 26. April 2017 ich stehe gerade wegen diesem CSV aufm schlauch es ist ja im endeffekt eine Excel datei? habe jetzt eine beispieldatei: 3 spheres. ich habe 2 spalten im excel erstellt, sehen so aus: Sphere (1) 1 Sphere (2) 0 Sphere (3) 1 ich speichere diese als CSV Trennzeichen (?) angenommen, 1 ist rot, 0 ist blau. Wie soll denn unity das jetzt nachvollziehen? ich werde aus deinem script leider auch nicht schlau Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 26. April 2017 Melden Share Geschrieben 26. April 2017 Du erzeugst eine CSV Datei aus deiner Excel Datei, die würde dann so aussehen: Sphere (1),1 Sphere (2),0 Sphere (3),1 Über das Skript - das Mabenan erwähnt hat - liesst du diese Datei dann ein: 1) Die Datei schiebst du in den Projektfolder von Unity. 2) Du erzeugst ein leeres GameObjekt und benennst es z.b. nach "CSVReader" um. 3) Erzeugst das Skript "CSVReader.c"s (Rechte Maustaste im Projektfolder "Create #C Skript" und den Inhalt hineinkopieren) 4) Du ziehst das Skript CSVReader.cs auf das GameObject "CSVReader" (in den Slot "csvFile") 5) Nachdem du Unity startest, solltest du nun eine Ausgabe in der Unityconsole sehen mit dem Inhalt deiner CSV Datei. => Deine Daten können nun über ein Unityskript weiterverarbeitet werden. Die Daten sind in einem 2-dimensionalen Array abgelegt das wie folgt aussieht: grid[2,3] => 0 1 ================== 0 Sphere (1) 1 1 Sphere (2) 0 2 Sphere (3) 1 Zitat Wie soll denn unity das jetzt nachvollziehen? ich werde aus deinem script leider auch nicht schlau Du kommst leider um eigenen Code hier nicht herum, eine Weiterverarbeitung könnte z.b. wie folgt aussehen: for (int x = 0; x < grid.GetUpperBound(0); x++) { for (int y = 0; y < grid.GetUpperBound(1); y++) { // Ich hole mir hier nun alle Spalten der Zeile 1, y = 0 Zeile 1 ist! // Leerzeichen nicht mit ausgeben if (grid[x, y] != "" && (y == 0)) { Debug.Log("Zeile 1: " + grid[x, 0]); // Der Inhalt von grid[x, 0] ist hier "Sphere (1)" if (x == 1) // Wert für die 2. Spalte auslesen { if (grid[x, y] == "1") // Wenn der Wert für die 2. Spalte = "1" ist { // Hier habe ich nun erkannt, daß für Sphere(1) eine "1" gesetzt ist Debug.Log("Für Objekt " + grid[x, 0] + " wurde eine "+ grid[x, y] + " gesetzt!"); // Nun weiss ich, daß ich für Sphere(1) ein rotes Material setzen muss, wenn 1 = rot bedeutete! // MeshRenderer mesh = gameObjectSphere1.GetComponent<MeshRenderer>(); // mesh.material = myRedMaterial; // } } } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mabenan Geschrieben 26. April 2017 Melden Share Geschrieben 26. April 2017 Hier ist auchnochmal beschrieben wie du für Excel dein Trennzeichen ändern kannst http://www.anleitung24.com/anleitung-csv-datei-mit-excel-erstellen-trennzeichen-selbst-bestimmen.html Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Willy_Wonder Geschrieben 26. April 2017 Autor Melden Share Geschrieben 26. April 2017 nun kommt folgendes in der konsole raus >.> außerdem ist mir nun schleierhaft, wie ich dann die farben mit einbeziehen soll ._. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 26. April 2017 Melden Share Geschrieben 26. April 2017 Du musst in deiner CSV-Datei ein "," als Separator verwenden! Das kann man in Excel beim Export einstellen. ";" Kann das Skript leider nicht verarbeiten. Deine Ausgabe muss dann so aussehen: Sphere (1)|1|| Sphere (2)|0|| Sphere (3)|1|| ||| Schau dir den Code oben an, viel einfacher wird es leider nicht mehr. Du musst den ausgelesenen Zahlen (je Objekt) nun Materialien in Unity zuordnen und dann dem Meshrenderer des jeweiligen Objektes zuweisen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Willy_Wonder Geschrieben 27. April 2017 Autor Melden Share Geschrieben 27. April 2017 vor 15 Stunden schrieb Zer0Cool: Du musst in deiner CSV-Datei ein "," als Separator verwenden! Das kann man in Excel beim Export einstellen. ";" Kann das Skript leider nicht verarbeiten. Deine Ausgabe muss dann so aussehen: Sphere (1)|1|| Sphere (2)|0|| Sphere (3)|1|| ||| Schau dir den Code oben an, viel einfacher wird es leider nicht mehr. Du musst den ausgelesenen Zahlen (je Objekt) nun Materialien in Unity zuordnen und dann dem Meshrenderer des jeweiligen Objektes zuweisen. vielen dank für deine geduld mit mir ! :> ich werde das gleich ausprobieren und berichte dann, was dabei rausgekommen ist Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Willy_Wonder Geschrieben 27. April 2017 Autor Melden Share Geschrieben 27. April 2017 aus irgendeinem Grund speichert excel meine csv datein immer noch mit einem ";" als separator ._. hab es schon in den systemeinstellungen geändert, funktioniert trotzdem nicht Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mabenan Geschrieben 27. April 2017 Melden Share Geschrieben 27. April 2017 Computer neu gestartet Microsoft Programme übernehmen Systemeinstellungen mit Vorliebe nur nach einem Neustart. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hrungdak Geschrieben 27. April 2017 Melden Share Geschrieben 27. April 2017 Warum kannst du nicht das Standardtrennzeichen ";" verwenden? Gut, das Regex im Beispiel ist nicht gerade übersichtlich, ebenso ist das Beispiel aus dem WIKI hoffnungslos überdimensioniert. Wie soll da ein Einsteiger durchblicken? Hier ist ein Link zu Stackoverflow mit einer kleinen und brauchbaren Lösung: using System.IO; static void Main(string[] args) { using(var fs = File.OpenRead(@"C:\test.csv")) using(var reader = new StreamReader(fs)) { List<string> listA = new List<string>(); List<string> listB = new List<string>(); while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(';'); listA.Add(values[0]); listB.Add(values[1]); } } } Hab ich in Unity nicht getestet, aber ich denke, das macht, was es soll. Aber du solltest dir nochmal überlegen: - den Status der Anlagen in Excel ändern - csv-Datei daraus machen - in Unity einlesen Warum nicht gleich den Status in der csv-Datei ändern? Spart dir einen Schritt. Oder die Excel-Tabelle direkt auslesen, dafür gibt es auch massig Beispiele. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Willy_Wonder Geschrieben 27. April 2017 Autor Melden Share Geschrieben 27. April 2017 vor 17 Minuten schrieb Hrungdak: Warum kannst du nicht das Standardtrennzeichen ";" verwenden? Gut, das Regex im Beispiel ist nicht gerade übersichtlich, ebenso ist das Beispiel aus dem WIKI hoffnungslos überdimensioniert. Wie soll da ein Einsteiger durchblicken? haha, danke für dein verständis genau das ist gerade das problem - ich kann mir diese skripte nicht besonders gut auseinander pflücken um dahinterzusteigen... deins ausm beispiel sieht ziemlich übersichtlich aus, mal sehen ob es klappt! noch eine kleine frage: listA.Add(values[0]); listB.Add(values[1]); das sind meine Zustände dann qausi? und wenn meine anlagen die farben ändern sollen, wenn die zustände in der liste geändert werden, so muss ich diesen skript einfach mit einer if funktion erweitern, in der diese farbänderung festgehalten ist, richtig? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Noob Geschrieben 27. April 2017 Melden Share Geschrieben 27. April 2017 Entweder mit if, wenns nur 2 Zustände sind, oder switch wenns mehrere sind. So würds ich machen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Willy_Wonder Geschrieben 27. April 2017 Autor Melden Share Geschrieben 27. April 2017 vor 2 Minuten schrieb Noob: Entweder mit if, wenns nur 2 Zustände sind, oder switch wenns mehrere sind. So würds ich machen ich meinem Projekt sind es insgesamt 3 zustände mit 3 unterschieldichen farben.. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Noob Geschrieben 27. April 2017 Melden Share Geschrieben 27. April 2017 vor 8 Minuten schrieb Willy_Wonder: ich meinem Projekt sind es insgesamt 3 zustände mit 3 unterschieldichen farben.. da würde ich einfach ausprobieren was schöner ist. Bei 3 bleiben wohl beide Varianten übersichtlich Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Willy_Wonder Geschrieben 27. April 2017 Autor Melden Share Geschrieben 27. April 2017 ich habe gerade diesen Tutorial hier ausprobiert: hat funktioniert, ich habe einfach die csv datei nochmal im notepad+ per hand bearbeitet (also, die ; durch , ersetzt) jetzt überlege ich, ob man diese ganzen ansätze in mein projekt integrieren kann Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. April 2017 Melden Share Geschrieben 27. April 2017 Wenn du Split[','] durch Split[';'] ersetzt, kannst du auch deine Datei mit ";" verwenden! So, dann hier mal eine stark vereinfachte und verständlichere Variante, beim Code aus dem Video wird die Zeile 1 und Spalte 1 immer übersprungen. /* CSVReader by zer0f0rce. (27/4/2017) */ using UnityEngine; public class SimpleCSVReader : MonoBehaviour { public TextAsset csvFile; public void Start() { string[] Zeilen = csvFile.text.Split('\n'); int aktuelleZeile = 0; foreach (string Zeile in Zeilen) { int aktuelleSpalte = 0; aktuelleZeile += 1; string[] Spalten = Zeile.Split(','); // Wenn du hier wieder Zeile.Split(';') nimmst liest er wieder eine Datei mit Semikolons! foreach (string Spalte in Spalten) { aktuelleSpalte += 1; Debug.Log("Zeile " + aktuelleZeile + " Spalte " + aktuelleSpalte + " = " + Spalte); } } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Willy_Wonder Geschrieben 27. April 2017 Autor Melden Share Geschrieben 27. April 2017 using System.Collections;using UnityEngine;using UnityEngine.UI;using System.IO;public class Zustandsaenderung : MonoBehaviour { public TextAsset csvFile; void Start () { readCSV (); } void readCSV () { string[] records = csvFile.text.Split ('\n'); for (int i = 1; i < records.Length; i++) { string[] fields = records [i].Split (','); if (float.Parse (fields [1]) == 1) { GetComponent<Renderer> ().materials [0].color = Color.red; } } }} das hab ich jetzt bei einer Testdatei zusammengebastelt, aber er übernimmt trotzdem nicht die rote farbe .. zumal im video das skript auf die kamera geworfen wird Oo ich habe jetzt einfach cubeTest als GameObject rausgenommen, weil es für mich keinen sinn ergeben hat. das wäre meine Liste: Anlage,Zustand Cube1,1 Cube2,2 Cube3,1 man, das ist so dermaßen deprimierend Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. April 2017 Melden Share Geschrieben 27. April 2017 Lies mal meinen Post genau durch ... und verwende ggf. mein Skript. Wenn du bei GetComponent() mal ein Debug() hinzufügst, dann wirst du sehen, daß er gar nicht zu dieser Zeile hinkommt. Wie ich bereits sagte, das Skript welches du verwendest überspringt die 1. Zeile und die 1. Spalte und damit fängt er direkt bei Sphere (2) an! Ansonsten korrigiert sehe es so aus (ist aber komplett ungetestet): using System.Collections; using UnityEngine; using UnityEngine.UI; using System.IO; public class Zustandsaenderung : MonoBehaviour { public GameObject cubeTest; public TextAsset csvFile; void Start () { readCSV (); } void readCSV () { string[] records = csvFile.text.Split ('\n'); for (int i = 0; i < records.Length; i++) { string[] fields = records [i].Split (','); if (float.Parse (fields [1]) == 1) { GetComponent<Renderer> ().materials [0].color = Color.red; } } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Willy_Wonder Geschrieben 27. April 2017 Autor Melden Share Geschrieben 27. April 2017 vor 7 Minuten schrieb Zer0Cool: Lies mal meinen Post genau durch ... und verwende ggf. mein Skript. Wenn du bei GetComponent() mal ein Debug() hinzufügst, dann wirst du sehen, daß er gar nicht zu dieser Zeile hinkommt. Wie ich bereits sagte, das Skript welches du verwendest überspringt die 1. Zeile und die 1. Spalte und damit fängt er direkt bei Sphere (2) an! Ansonsten korrigiert sehe es so aus (ist aber komplett ungetestet): using System.Collections; using UnityEngine; using UnityEngine.UI; using System.IO; public class Zustandsaenderung : MonoBehaviour { public GameObject cubeTest; public TextAsset csvFile; void Start () { readCSV (); } void readCSV () { string[] records = csvFile.text.Split ('\n'); for (int i = 0; i < records.Length; i++) { string[] fields = records [i].Split (','); if (float.Parse (fields [1]) == 1) { GetComponent<Renderer> ().materials [0].color = Color.red; } } } } auf deine korrigierte version bin ich mittlerweile auch gekommen, funktioniert leider immer noch nicht... vor 40 Minuten schrieb Zer0Cool: Wenn du Split[','] durch Split[';'] ersetzt, kannst du auch deine Datei mit ";" verwenden! So, dann hier mal eine stark vereinfachte und verständlichere Variante, beim Code aus dem Video wird die Zeile 1 und Spalte 1 immer übersprungen. /* CSVReader by zer0f0rce. (27/4/2017) */ using UnityEngine; public class SimpleCSVReader : MonoBehaviour { public TextAsset csvFile; public void Start() { string[] Zeilen = csvFile.text.Split('\n'); int aktuelleZeile = 0; foreach (string Zeile in Zeilen) { int aktuelleSpalte = 0; aktuelleZeile += 1; string[] Spalten = Zeile.Split(','); // Wenn du hier wieder Zeile.Split(';') nimmst liest er wieder eine Datei mit Semikolons! foreach (string Spalte in Spalten) { aktuelleSpalte += 1; Debug.Log("Zeile " + aktuelleZeile + " Spalte " + aktuelleSpalte + " = " + Spalte); } } } } meinst du diesen skript, den ich ausprobieren soll? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. April 2017 Melden Share Geschrieben 27. April 2017 Ja, und lass dir immer die aktuelle Zeile und Spalte und den Inhalt (=Spalte) mit ausgeben, wie ich es dort gemacht habe. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Willy_Wonder Geschrieben 27. April 2017 Autor Melden Share Geschrieben 27. April 2017 das kommt nun dabei raus, ich schätze, das ist richtig? jetzt muss ich für diesen testcube den ich habe eine if funktion einbauen, sodass diesem eine farbe zugeordnet wird, wenn in der spalte "Zustand" eine 1 steht, ja? 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.