Jump to content
Unity Insider Forum

Excel Tabelle in Unity einbinden


Willy_Wonder

Recommended Posts

Ja, das ist soweit alles richtig, aber
GetComponent<Renderer> gibt dir den Renderer des "aktuellen" Gameobjektes zurück und das ist in deinem Fall das Gameobjekt, an welchem das Skript "Zustandsaenderung" dranhängt!
Ich kenne deine Szene nicht, aber wenn dein GameObjekt "Sphere" nicht das Objekt ist, wo das Skript "Zustandsaenderung" dranhängt, dann kann es nicht funktionieren.
Du musst deinem Skript "Zustandsaenderung" nun auch noch die GameObjekt-Referenzen deiner "Kugeln" übergeben, damit du die Farben setzen kannst.

Hier ein Codebeispiel. Damit musst du dann noch deine Kugeln einzeln in den Slot "mySpheres" ziehen.

public GameObject[] mySpheres;
...
// Für Sphere 1
mySpheres[0].GetComponent<Renderer> ().materials [0].color = Color.red;
...
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Antworten 59
  • Created
  • Letzte Antwort

also in meiner projektszene sind es so um die 50 "spheren"... ich hatte vor, jeder sphere diesen skript zuzuweisen wobei dein weg natürlich auch verlockend ist. dann beziehe ich ja meinen skript "zustandsänderung" auf in leers Gameobjekt, oder die Kamera, ja? und ziehe dann meine spheren in die 50 slots einezln rein?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, genau. Du kannst deinen "Spheren" allerdings auch in der Szene "suchen" und dann der Variablen "mySpheres" zuordnen (dann allerdings private, da du die Kugeln nicht mehr über den Inspektor zuweisst), nur dann hast du erst einmal eine beliebige Reihenfolge. Wenn du allerdings den "Spheren" eindeutige Namen verpasst, dann kannst du die jeweiligen "Spheren" später wieder identifizieren.

Hier der Code, wie du alle Objekte findest, an denen ein "SphereCollider" hängt (also deine Kugeln):

private GameObject[] mySpheres;
...
GameObject[] mySpheres = FindObjectsOfType(typeof(SphereCollider)) as GameObject[];
...
...
// Für Sphere 1
mySpheres[0].GetComponent<Renderer> ().materials [0].color = Color.red;
...

Und hier noch der Code, um die gesuchte Kugel zu indentifizieren:

                foreach (GameObject sphere in mySpheres) {
                    if (sphere.name == "Sphere (1)")
                    {
                        // Entsprechende Kugel gefunden!
                        sphere.GetComponent<Renderer>().materials[0].color = Color.red;
                    }
                }


Ich glaube nun hast du alles was du brauchst, nun einfach alle Puzzleteile zusammensetzen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich weiß, ich nerve, aber ich möchte es gerne verstehen um dann weniger dumme fragen zu stellen :D

ein riiiieeesiges Dankeschön an alle (vor allem natürlich an @Zer0Cool für die Geduld und die Hilfe!)

 

ich mache ja jetzt erstmal nur eine kleine Bespielszene mit 3 Cubes (siehe screenshot).

der script dazu sieht nun folgendermaßen aus:

using UnityEngine;

public class Zustandsaenderung : MonoBehaviour
{
    public TextAsset csvFile;
    public GameObject[] myCubes;
    public void Start()
    {
        string[] Zeilen = csvFile.text.Split('\n');
        myCubes[0].GetComponent<Renderer> ().materials [0].color = Color.red;
        myCubes[1].GetComponent<Renderer> ().materials [0].color = Color.red;
        myCubes[2].GetComponent<Renderer> ().materials [0].color = Color.red;
        int aktuelleZeile = 0;
        foreach (string Zeile in Zeilen)
        {
            int aktuelleSpalte = 0;
            aktuelleZeile += 1;
            string[] Spalten = Zeile.Split(','); 
            foreach (string Spalte in Spalten)
            {
                aktuelleSpalte += 1;
                Debug.Log("Zeile " + aktuelleZeile + " Spalte " + aktuelleSpalte + " = " + Spalte);
            }
        }
    }
}

 

Unbenannt.PNG

Link zu diesem Kommentar
Auf anderen Seiten teilen

es gibt keine worte, die beschreiben können, wie glücklich ich gerade bin, dass die cubes nun tatsächlich eine farbe angenommen haben :D

jetzt werde ich mit der if funtion weiter machen, damit die cubes bei unterschiedlichen zuständen unterschiedliche farben annehmen.

 

 

(Wollte hier nur die zwischenschritte "abspeichern", vielleicht kann ja noch jemand anderes mit dem gleichen Anliegen hier fündig werden :) )

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich schon wieder :D

nun habe ich meinen Skript folgendermaßen erweitert:

using UnityEngine;

public class Zustandsaenderung : MonoBehaviour
{
    public TextAsset csvFile;
    public GameObject[] myCubes;
    public void Start()
    {
        string[] Zeilen = csvFile.text.Split('\n');
                myCubes[0].GetComponent<Renderer> ().materials [0].color = Color.red;
        if(float.Parse(Zeilen [1])==1){
            myCubes [0].GetComponent<Renderer> ().materials [0].color = Color.green;            
        }
        myCubes[1].GetComponent<Renderer> ().materials [0].color = Color.red;
        if(float.Parse(Zeilen [1])==1){
            myCubes [1].GetComponent<Renderer> ().materials [0].color = Color.green;            
            }
        myCubes[2].GetComponent<Renderer> ().materials [0].color = Color.red;
        if(float.Parse(Zeilen [1])==1){
            myCubes [2].GetComponent<Renderer> ().materials [0].color = Color.green;            
                }
        int aktuelleZeile = 0;
        foreach (string Zeile in Zeilen)
        {
            int aktuelleSpalte = 0;
            aktuelleZeile += 1;
            string[] Spalten = Zeile.Split(','); 
            foreach (string Spalte in Spalten)
            {
                aktuelleSpalte += 1;
                Debug.Log("Zeile " + aktuelleZeile + " Spalte " + aktuelleSpalte + " = " + Spalte);
            }
        }
    }
}

Unbenannt2.PNG

 

das kommt nun dabei raus. an sich nicht verkehrt, aber wo ist die farbe "grün"hin? :o

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nimm mal oben das "<>" Zeichen um Code zu posten. Dann kann man deinen Code besser lesen.

"Zeilen [1]" beinhaltet:
"Sphere (1),1"

Und deswegen wird "grün" niemals gesetzt.
Du muss in die untere Schleife "foreach (string Spalte in Spalten)" um die einzelnen Spaltenwerte zu bekommen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

So, daß wir hier mal vorankommen, hier der fertige Code.
Du kannst nun alle Farben ebenfalls dem Skript zuordnen. "0" in der CSV-Datei bedeutet nun 1. Farbe im Slot.
Alles ist beschrieben, so daß du es gut nachvollziehen kannst:
 

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

using UnityEngine;

public class SimpleCSVReader : MonoBehaviour
{
    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(','); // 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

vor 30 Minuten schrieb Zer0Cool:

Nimm mal oben das "<>" Zeichen um Code zu posten. Dann kann man deinen Code besser lesen.

"Zeilen [1]" beinhaltet:
"Sphere (1),1"

Und deswegen wird "grün" niemals gesetzt.
Du muss in die untere Schleife "foreach (string Spalte in Spalten)" um die einzelnen Spaltenwerte zu bekommen.

using UnityEngine;

public class Zustandsaenderung : MonoBehaviour
{
	public TextAsset csvFile;
	public GameObject[] myCubes;
	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(',');

			myCubes[0].GetComponent<Renderer> ().materials [0].color = Color.red;
			if(float.Parse(Spalten [1])==1){
				myCubes [0].GetComponent<Renderer> ().materials [0].color = Color.green;            
			}
			myCubes[1].GetComponent<Renderer> ().materials [0].color = Color.red;
			if(float.Parse(Spalten [1])==1){
				myCubes [1].GetComponent<Renderer> ().materials [0].color = Color.green;            
			}

			myCubes[2].GetComponent<Renderer> ().materials [0].color = Color.red;
			if(float.Parse(Spalten [1])==1){
				myCubes [2].GetComponent<Renderer> ().materials [0].color = Color.green;            
			}


			foreach (string Spalte in Spalten)
			{
				aktuelleSpalte += 1;
				Debug.Log("Zeile " + aktuelleZeile + " Spalte " + aktuelleSpalte + " = " + Spalte);
			}
		}
	}
}

so hätte ich es jetzt gemacht  :o habs aber bestimmt wieder falsch verstanden...

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Minuten schrieb Zer0Cool:

So, das wir hier mal vorankommen. Hier der fertige Code.
Du kannst nun alle Farben ebenfalls dem Skript zuordnen. Alles ist beschrieben, so das du es gut nachvollziehen kannst:
 


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

using UnityEngine;

public class SimpleCSVReader : MonoBehaviour
{
    public TextAsset csvFile;
    public GameObject[] meineObjekte;
    public Color[] meineFarben;
    public void Start()
    {
        GameObject aktuellesObjekt;
        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!

            aktuellesObjekt = null;
            foreach (string Spalte in Spalten)
            {
                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)];
                }

            }
        }
    }

    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;
    }
}

 

sehr sehr lieb von dir, ich würde jedoch sehr gerne diese geschichte mit den zeilen und spalten verstehen... mir stehen noch weitere änderungen in dem eigentlichen projekt bevor :o möchte in zukunft nicht wegen jeder lapallie das forum befragen :/

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist ja alles gut kommentiert nun und daher kannst du ja nun auch sehen, wie es gemacht werden könnte, um deinen eigenen Code damit weiter entwickeln...
Jede "foreach"-Schleife geht jeweils entweder über alle Zeilen oder über alle Spalten der Zeile. Einfach damit herumspielen, bis du es verstehst.

Ansonsten ist es korrekt "Spalten [1]" steht für die 2. Spalte, wenn du dich in der "foreach (string Zeile in Zeilen)" befindest.
Hier noch einmal Pseudocode zur Veranschaulichung:

foreach (string Zeile in Zeilen)
Zeile: "Sphere (1),1"
	foreach (string Spalte in Spalten)
	Spalte: "Sphere (1)"
	Spalte: "1"
Zeile: "Sphere (2),0"
	foreach (string Spalte in Spalten)
	Spalte: "Sphere (2)"
	Spalte: "0"
Zeile: "Sphere (3),2"
	foreach (string Spalte in Spalten)
	Spalte: "Sphere (3)"
	Spalte: "2"

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb Zer0Cool:

Ist ja alles gut kommentiert nun, daher kannst du ja nun auch sehen, wie es gemacht werden könnte und deinen eigenen Code damit weiter entwickeln...

in deinem fertigen code nimmst du ja diese option mit ObjektFinden, richtig? ich wollte jede sphere einzeln zuweisen, das ist für mich im Moment nachvollziehbarer.

vor 4 Minuten schrieb Zer0Cool:

Ansonsten ist es korrekt "Spalten [1]" steht für die 2. Spalte, wenn du dich in der "foreach (string Zeile in Zeilen)" befindest.

wenn ich diesen code jetzt verwende, passiert das gleiche wie zuvor - der mittlere cube bleibt rot, die anderen beiden werden weiß. wobei das mit der spalte ja eigentlich stimmen müsste, wenn man quasi die spalte der tabelle nimmt, wo "1,2,1" steht <_<

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, ist noch die Variante mit dem "Zuweisen". Zusätzlich kannst du auch noch die Farben dem Skript zuweisen!

Ansonsten sollte eigentlich gehen, nimmt vielleich mal Int.Parse, aber Float.Parse sollte auch gehen.

Tue doch mal ein Debug an die entsprechende Stelle:

            Debug.Log(Spalten[1]);
            if (int.Parse(Spalten[1]) == 1)
            {
                meineObjekte[0].GetComponent<Renderer>().materials[0].color = Color.green;
            }


 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Minuten schrieb Zer0Cool:

Nein, ist noch die Variante mit dem "Zuweisen". Zusätzlich kannst du auch noch die Farben dem Skript zuweisen!

habs gerade ausprobiert und kein Cube hat irgendeine Farbe angenommen... ich denke, das wird heute nichts mehr :'(

vor 7 Minuten schrieb Zer0Cool:

Nimm mal "Int.Parse"

es ändert sich nichts...

Link zu diesem Kommentar
Auf anderen Seiten teilen

hallo nochmal an alle :)

zwischenbericht: ich habe das skript an mein projekt angepasst und es funktioniert einwandfrei !

kurze frage: wenn ich jetzt die szene als .exe datei builde, dann die zustände in der csv datei ändere, passiert in meinem "gebuildeten" spiel leider gar nichts, sprich, die zustände werden auf die .exe datei nicht übertragen.

in unity funktioniert alles, da ändere ich die zustände in der liste und die farben passen sich an. woran könnte es liegen? :ph34r:

 

und noch eine weitere frage für die zukunft:

aktuellesObjekt = null; 
			foreach (string Spalte in Spalten) 
			{
				aktuelleSpalte += 1;
				Debug.Log("Zeile " + aktuelleZeile + " Spalte " + aktuelleSpalte + " = " + Spalte);

				if (aktuelleSpalte == 2) 
				{
					aktuellesObjekt = SuchePassendesObjekt(Spalte); 
				}

				if (aktuellesObjekt != null && aktuelleSpalte == 3) 
				{
					aktuellesObjekt.GetComponent<Renderer>().materials[0].color = meineFarben[int.Parse(Spalte)]; 
				}

kann ich in diese if funktion noch eine Funktion mit einem OnMouseDown GUI-Button hinzufügen? oder muss ich dafür einen neuen CSV-Skript erstellen, der jedem Objekt in meiner Szene zugewiesen werden muss, so dass wenn man drauf klickt, ein Button mit einem Text erscheint, der von dem Zustand in meiner Liste abhängig ist?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 37 Minuten schrieb Willy_Wonder:

....

kann ich in diese if funktion noch eine Funktion mit einem OnMouseDown GUI-Button hinzufügen? oder muss ich dafür einen neuen CSV-Skript erstellen, der jedem Objekt in meiner Szene zugewiesen werden muss, so dass wenn man drauf klickt, ein Button mit einem Text erscheint, der von dem Zustand in meiner Liste abhängig ist?

habe jetzt eine idee, die frage ist, ob die überhaupt sinn ergibt? :D

ich habe 3 unterschiedliche Skripte für 3 Zustände (die sind fertig und funktionieren auch, wenn ich diese den Cubes zuweise). Könnte ich dann einfach den Skript von @Zer0Cool mit den Farben so ändern, dass man im insprector anstatt von Farben diese Skripte zuweist? so nach dem motto: meine Zustände -> Size 3 -> und da für Element 0, 1 und 2 dann die jeweiligen Skripte für die Buttons reinziehen? ist es sinnvoll? :o

 

 

EDIT: okay, diese if schleife und oben public Color [] muss geändert werden. welchen value type nimmt man denn für ein script?

if (aktuellesObjekt != null && aktuelleSpalte == 3) 
				{
					aktuellesObjekt.GetComponent<Renderer>().materials[0].color = meineFarben[int.Parse(Spalte)]; 
				}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sind nach dem Build die Farben zwar da, aber du kannst sie nicht mehr ändern, oder sind die Farben komplett weg?
OnMouseDown() funktioniert nur pro GameObjekt, d.h. du kannst diese Funktion nicht in der Klasse "Zustandsaenderung" verwenden.

Du kannst aber an jedem deiner "Cubes" ein Skript verpassen und diesem Skript Werte über die Klasse "Zustandsaenderung" übergeben.
Dieses Skript dient dann quasi als Datenschnittstelle.
Da du ja bereits 3 Skripte erstellt hast und diese bereits an den "Cubes" hängen, so kannst du "einfach" auf diese Skripte zugreifen:
 

                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)];
                    meinSkript1 = aktuellesObjekt.GetComponent<meinSkript1>();
                    meinSkript1.rufeMethodeX(Spalten[2]); // Übergibt Wert in Spalte 3
                    meinSkript2= aktuellesObjekt.GetComponent<meinSkript2>();
                    meinSkript2.rufeMethodeY(Spalten[2]); // Übergibt Wert in Spalte 3
                    ...
                }	

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 6 Minuten schrieb Zer0Cool:

Sind nach dem Build die Farben zwar da, aber du kannst sie nicht mehr ändern, oder sind die Farben komplett weg?
 

die Farben sind da, aber ich kann sie nicht ändern. Die Farben passen auch zu den Zuständen, die zum Zeitpunkt des Buildens in der Liste als Zustände zugewiesen waren.

 

vor 6 Minuten schrieb Zer0Cool:

Du hast ja quasi bereits 3 Skripte und wenn die bereits an den "Cubes" hängen, dann kannst du "einfach" auf diese Skript zugreifen:
 


                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)];
                    meinSkript1 = aktuellesObjekt.GetComponent<meinSkript1>();
                    meinSkript1.rufeMethodeX(Zeile[2]); // Übergibt Wert in Spalte 3
                    meinSkript2= aktuellesObjekt.GetComponent<meinSkript2>();
                    meinSkript2.rufeMethodeY(Zeile[2]); // Übergibt Wert in Spalte 3
                    ...
                }	

 

das heißt, ich nehmen nun den gleichen Skript für die zustände, erweitere diesen aber mit diesen Skripts und nehme dann dafür meine fertigen? :)

 

EDIT: rufeMethodeX ? rufeMethodeY? blöde Frage, aber wofür steht das? :o

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...