Search code examples
c#unity-game-enginetexturestexture-mapping

Apply different textures to multiple materials (Unity3D)


I have a folder, called "Walls" in the Ressorce-folder, which contains multiple textures, calling "wallRoi[1-26]". Now I would like to apply those to my model in Unity via C# scripting. Explaning my code: The model has multiple segmentation of the whole wall, each of them has a tag ("Wall[1-26]"). The tag of the whole wall is "Wall". Now I'm trying to loop through the whole wall and apply to each segmenation of the wall a different texture from the folder. My Code doesn't work, any purposes? Thank you!

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

Solution

  • Create a new script named TexturesOverWall.cs Then copy and paste the below code. All you need to do is name each wall segmentation gameobject with the same name of the texture to apply. Hope this help you :)

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class TexturesOverWall : MonoBehaviour
    {
    
    private Texture2D[] walltextures;
    
    void Awake ()
    {
        mapTexturesOverWalls ();
    }
    
    void mapTexturesOverWalls ()
    {
        walltextures = Resources.LoadAll<Texture2D> ("Walls");
    
        GameObject walls = GameObject.FindGameObjectWithTag ("Wall");
        Renderer[] renders = walls.GetComponentsInChildren<Renderer> ();
    
        foreach (Renderer r in renders) {
            // all you need to do is name each wall segmentation gameobject with the same name of the texture to apply
            r.material.mainTexture = getTextureByName(r.gameObject.name);
        }
    }
    
    Texture2D getTextureByName (string name)
    {
        foreach (var tex in walltextures) {
            if (tex.name == name)
                return tex;
        }
    
        return null;
        }
    }