Jump to content
Unity Insider Forum

Verschiedene Texturen zu mehreren Materials zuordnen


vickal93

Recommended Posts

Ich habe in dem Ressource-Ordner einen weiteren Ordner, names "Walls". Dieser enthält mehrere Texturen, jeweils mit "wallRoi[1-26]" benannt. Nun würde ich gerne all diese Texturen über ein C#-Script meinem Modell zuordnen. 
Mein Modell besitzt eine Wand, die in mehrere Segmente unterteilt ist (damit ich eben jedem Segment eine andere Textur zuordnen kann), deren Tags sind jeweils "Wall[1-24]". Die gesamte Wand besitzt ebenfalls einen Tag "Wall". Nun versuche ich irgendwie durch die ganzen Segmente zu iterieren, um jedes der Reihe nach mit einer Textur aus dem oben genannten Ordner zu mappen. Hier mein Code, der allerdings nicht funktioniert. Ich freue mich über jede Anregung! 

private UnityEngine.Object[] walltextures;

void mapTexturesOverWalls() {
    walltextures = Resources.LoadAll ("Walls", typeof(Texture2D));

    Texture2D[] wallTex = (Texture2D)walltextures [walltextures.Length];

    GameObject walls = GameObject.FindGameObjectWithTag ("Wall");
    Renderer[] renders = walls.GetComponentsInChildren<Renderer> ();

  	for (int i = 0; i < wallTex.Length; i++) {
        foreach (Renderer r in renders) {
            r.material.mainTexture = wallTex[i];
            UnityEngine.Debug.Log (wallTex + "");
        }
    }
}
 
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

 

folgendes sieht für mich nach einem Fehler aus:

Texture2D[] wallTex = (Texture2D)walltextures [walltextures.Length];

Du konvertierst ein Arrayelement (bla[index]) zu ein Array. Das ganze Script sollte hier schon einen Fehler bei der Ausführung werfen. Zuerst eine IndexOutOfBoundsException an dieser Zeile und später eine konvertier Exception weil Texture2D kein Texture2D[] ist.

 

Was du machen kannst ist einfach ein ELement aus dem walltextures Array zu nehmen und direkt nach texture2D zu konvertieren:

 

r.material.mainTexture = (Texture2D)walltextures[i];

 

Das ganze würde dann so ungefähr aussehen:

 

private UnityEngine.Object[] walltextures;

void mapTexturesOverWalls() {
    walltextures = Resources.LoadAll ("Walls", typeof(Texture2D));

    GameObject walls = GameObject.FindGameObjectWithTag ("Wall");
    Renderer[] renders = walls.GetComponentsInChildren<Renderer> ();

  	for (int i = 0; i < walltextures.Length; i++) {
        foreach (Renderer r in renders) {
            r.material.mainTexture = (Texture2D)walltextures[i];
            UnityEngine.Debug.Log (wallTex + "");
        }
    }
}

 

Aber auch hier würde es ein Fehler geben, eher einen logischen als einen der eine Meldung wirft. So wie deine Schleifen aufgebaut sind werden alle Renderer als mainTexture die letzte walltexture im Array haben. Wieso das so ist überlasse ich dir, will dir ja nicht den ganzen Spaß nehmen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mark hat da Recht. Wenn du mal hier schaust siehst du auch eine andere Möglichkeit dein Array zu bekommen und in einer Zeile gleich zu konvertieren.

Resources.LoadAll

wallTex = Resources.LoadAll("Walls", typeof(Texture2D)).Cast<Texture2D>().ToArray();

Aber bitte vergiss nicht zukünftig konkrete Fehlermeldungen zu posten. "Funktioniert nicht" ist schwer zu debuggen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...