Jump to content
Unity Insider Forum
vickal93

Verschiedene Texturen zu mehreren Materials zuordnen

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 + "");
        }
    }
}
 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...