Jump to content
Unity Insider Forum

Excel Tabelle in Unity einbinden


Willy_Wonder

Recommended Posts

PS:
Bei meinem letzten Codebeispiel "Spalten" verwenden und nicht "Zeile" (schon geändert im Thread).

rufeMethodeX ? rufeMethodeY? Sind einfach irgendwelche Methode, die du in deinen 3 Skripten definiert hast...

Zum Build:
Deine CSV-Datei wird vermutlich beim Build in den Datenfolder "xxx_Data" verschoben, hier musst du deine CSV-Datei suchen und dort ändern! Es kann aber sein, das Unity deine Textdatei in die *.assets-Dateien steckt/verpackt, dann siehe Mabenans Lösung.

Das du deine Skripte wie die Farben in eine Liste stecken kannst geht leider nicht.
Ich weis halt nicht genau was du machen willst, ich biete dir hier nur Varianten an, du kannst auch anstatt Daten an die bereits angehängten Skripte zu übergeben, deine Skripte an die entsprechenden Objekte dranhängen:
 

aktuellesObjekt.GetComponent<Renderer>().materials[0].color = meineFarben[int.Parse(Spalte)];
if (Spalten[1]=="0") { // Wenn in der 2. Spalte eine "0" steht
  aktuellesObjekt.AddComponent("MeinSkript1");
}
if (Spalten[1]=="1") { // Wenn in der 2. Spalte eine "1" steht
  aktuellesObjekt.AddComponent("MeinSkript2");
}
  

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Antworten 59
  • Created
  • Letzte Antwort

Damit Dateien automatisch verschoben werden müssen Sie unterhalb des Hauptfolders „StreamingAssets“ liegen.

Siehe hier https://docs.unity3d.com/Manual/StreamingAssets.html.

Wenn du die Dateien jedoch nicht schon beim Build mit auslieferst, kannst du natürlich die Dateien auch aus jeden anderen Ordner auf dem Rechner auslesen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen! heute mache ich nun endlich weiter :) habe jetzt versucht meinen skript anzupassen, mit der 2. variante von @Zer0Cool, die erschien mir irgendwie logischer ^^

 

			aktuellesObjekt = null; // Noch kein zu bearbeitendes Objekt gefunden
			foreach (string Spalte in Spalten) // Gehe alle Spalten der jeweiligen Zeile durch
			{
				aktuelleSpalte += 1;
				Debug.Log("Zeile " + aktuelleZeile + " Spalte " + aktuelleSpalte + " = " + Spalte);

				if (aktuelleSpalte == 2) // wenn wir uns in der 1. Spalte befinden (hier stehen die Objektnamen)
				{
					aktuellesObjekt = SuchePassendesObjekt(Spalte); // Sucht das passende Objekt zum Namen der in der Spalte enthalten ist
				}

				if (aktuellesObjekt != null && aktuelleSpalte == 3) // Falls Objekt gefunden wurde und wenn wir uns in der 2. Spalte befinden (hier stehen die Farben)
				{
					aktuellesObjekt.GetComponent<Renderer>().materials[0].color = meineFarben[int.Parse(Spalte)];
					if (Spalten[1]=="0") {
						aktuellesObjekt.AddComponent<ButtonIO>;
					}
					if (Spalten[1]=="1") { 
						aktuellesObjekt.AddComponent<ButtonWartung>;
					}
					if (Spalten[1]=="2") { 
						aktuellesObjekt.AddComponent<ButtonAlarm>;
					}
				}

			}
		}
	}

leider kommt dabei ein fehler raus :/

 

Am 28.4.2017 um 14:23 schrieb Mabenan:

Damit Dateien automatisch verschoben werden müssen Sie unterhalb des Hauptfolders „StreamingAssets“ liegen.

Siehe hier https://docs.unity3d.com/Manual/StreamingAssets.html.

Wenn du die Dateien jedoch nicht schon beim Build mit auslieferst, kannst du natürlich die Dateien auch aus jeden anderen Ordner auf dem Rechner auslesen.

danke! das werde ich gleich ausprobieren !

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 28.4.2017 um 14:23 schrieb Mabenan:

Damit Dateien automatisch verschoben werden müssen Sie unterhalb des Hauptfolders „StreamingAssets“ liegen.

Siehe hier https://docs.unity3d.com/Manual/StreamingAssets.html.

Wenn du die Dateien jedoch nicht schon beim Build mit auslieferst, kannst du natürlich die Dateien auch aus jeden anderen Ordner auf dem Rechner auslesen.

ich habe jetzt folgenden Skript auf mein GameObject (eigentlich ein leeres Objekt) geworfen.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PathFinder : MonoBehaviour {

	public string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "!/assets/StreamingAssets/Zustand.csv");
		
		IEnumerator Example() {
			if (filePath.Contains("://")) {
			WWW www = new WWW(filePath);
				yield return www;
				
			} 
	}
}

Builden funktioniert, die Farbänderung nicht :/

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich behaupte mal das der Code nicht funktioniert.
Application.streamingAssetsPath zeigt schon auf den StreamingAssets Folder.

Dann solltest du auch noch einen else Pfad programmieren weil so aktuell nur was geladen wird wenn du es als Webplayer laufen lässt.

Mit diesem Code sollte dein Datei Inhalt nun geladen werden.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PathFinder : MonoBehaviour {

	public string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "Zustand.csv");
		
    public string result = "";
		IEnumerator Example() {
			if (filePath.Contains("://")) {
			WWW www = new WWW(filePath);
				yield return www;
				result = www.text;
			} else{
            result = System.IO.File.ReadAllText(filePath);
			}
	}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Mabenan

habe deinen Code jetzt übernommen, funktioniert dennoch nicht :/

 

ich schmeiße ja den script auf ein leeres GameObject, richtig? Builde dann das "Spiel" - es entshteht eine .exe Datei und ein Ordner der sich "data" nennt. meine CSV datei ist da aber nirgendwo drin. wenn ich aber meine ursprüngliche CSV datein (aus der asset mappe in meinem unity projekt) ändere, tut sich gar nichts im spiel ..

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich habe nun erstmal mit den Buttons weitergemacht, funktioniert leider immer noch nicht so ganz... skript weist keine fehler auf, aber nun färben sich die cubes auch nicht mehr ein, geschweige denn es passiert noch was beim Anklicken xD

	public TextAsset csvFile;
	public GameObject[] meineObjekte;
	public Color[] meineFarben;
	public void Start()
	{
		GameObject aktuellesObjekt; // Speichert das aktuell zu bearbeitende Objekt
		string[] Zeilen = csvFile.text.Split ('\n');
		int aktuelleZeile = 0;
		foreach (string Zeile in Zeilen) { // Gehe alle Zeilen in der CSV-Datei durch
			int aktuelleSpalte = 0;
			aktuelleZeile += 1;
			string[] Spalten = Zeile.Split (',');

			aktuellesObjekt = null; // Noch kein zu bearbeitendes Objekt gefunden
			foreach (string Spalte in Spalten) { // Gehe alle Spalten der jeweiligen Zeile durch
				aktuelleSpalte += 1;
				Debug.Log ("Zeile " + aktuelleZeile + " Spalte " + aktuelleSpalte + " = " + Spalte);

				if (aktuelleSpalte == 1) { // wenn wir uns in der 1. Spalte befinden (hier stehen die Objektnamen)
					aktuellesObjekt = SuchePassendesObjekt (Spalte); // Sucht das passende Objekt zum Namen der in der Spalte enthalten ist
				}

				if (aktuellesObjekt != null && aktuelleSpalte == 2) { // Falls Objekt gefunden wurde und wenn wir uns in der 2. Spalte befinden (hier stehen die Farben)
					aktuellesObjekt.GetComponent<Renderer> ().materials [0].color = meineFarben [int.Parse (Spalte)];
										}
				if (Spalten[2]=="0") { 
					aktuellesObjekt.AddComponent<ButtonIO>();

				}
				if (Spalten[2]=="1") { 
					aktuellesObjekt.AddComponent<ButtonWartung>();

				}
				if (Spalten[2]=="2") { 
					aktuellesObjekt.AddComponent<ButtonAlarm>();

				}

			
			}
		}
	}

	private GameObject SuchePassendesObjekt(string objektName)
	{
		GameObject gefundenesObjekt = null;
		foreach (GameObject objekt in meineObjekte) // Durchsuche alle meine Objekte
		{
			if (objekt.name == objektName) // Suche das Objekt mit dem Namen
			{
				// Entsprechende Objekt gefunden!
				gefundenesObjekt = objekt;
			}
		}
		return gefundenesObjekt;
	}
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Genau wie Mabenan es schreibt, die Datei muss dort liegen nach dem Build (und im Unityeditor auch).
Ich habe den Code auch noch einmal leicht umgeschrieben, die Textdatei wird nun von dort gelesen (funktioniert habe es getestet). "TextAssets" sind ungeeignet für das Laden von Textfiles zur Laufzeit.

Du musst bei deiner Klasse die Variable "public TextAsset csvFile" entfernen und dann folgende 3 Zeilen neu einfügen bzw. ändern (habs markiert):

/*
	CSVReader by zer0f0rce. (27/4/2017)
*/

using UnityEngine;

public class SimpleCSVReader : MonoBehaviour
{
    // LÖSCHEN public TextAsset csvFile;  LÖSCHEN
    public GameObject[] meineObjekte;
    public Color[] meineFarben;
    public void Start()
    {
        // NEU ANFANG
        string path = Application.dataPath + "/StreamingAssets/";
        string csvFile = System.IO.File.ReadAllText(path+ "Zustand.csv");
        string[] Zeilen = csvFile.Split('\n');
        // NEU ENDE

        GameObject aktuellesObjekt; // Speichert das aktuell zu bearbeitende Objekt
        int aktuelleZeile = 0;
        foreach (string Zeile in Zeilen) // Gehe alle Zeilen in der CSV-Datei durch
        {
            int aktuelleSpalte = 0;
            aktuelleZeile += 1;
            string[] Spalten = Zeile.Split(','); // Wenn du hier wieder Zeile.Split(';') nimmst liest er wieder eine Datei mit Semikolons!
            
            aktuellesObjekt = null; // Noch kein zu bearbeitendes Objekt gefunden
            foreach (string Spalte in Spalten) // Gehe alle Spalten der jeweiligen Zeile durch
            {
                aktuelleSpalte += 1;
                Debug.Log("Zeile " + aktuelleZeile + " Spalte " + aktuelleSpalte + " = " + Spalte);

                if (aktuelleSpalte == 1) // wenn wir uns in der 1. Spalte befinden (hier stehen die Objektnamen)
                {
                    aktuellesObjekt = SuchePassendesObjekt(Spalte); // Sucht das passende Objekt zum Namen der in der Spalte enthalten ist
                }

                if (aktuellesObjekt != null && aktuelleSpalte == 2) // Falls Objekt gefunden wurde und wenn wir uns in der 2. Spalte befinden (hier stehen die Farben)
                {
                    aktuellesObjekt.GetComponent<Renderer>().materials[0].color = meineFarben[int.Parse(Spalte)]; // Farbe zuweisen nach Wert der Spalte
                }

            }
        }
    }

    private GameObject SuchePassendesObjekt(string objektName)
    {
        GameObject gefundenesObjekt = null;
        foreach (GameObject objekt in meineObjekte) // Durchsuche alle meine Objekte
        {
            if (objekt.name == objektName) // Suche das Objekt mit dem Namen
            {
                // Entsprechende Objekt gefunden!
                gefundenesObjekt = objekt;
            }
        }
        return gefundenesObjekt;
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

Ankündigungen


Hy, wir programmieren für dich Apps(Android & iOS):

Weiterleitung zum Entwickler "daubit"



×
×
  • Neu erstellen...