Color not appearing on created mesh? (only grey)

Hi,

The color on a dynamically created mesh does not show up, the mesh stays grey. The triangles appear well on the mesh, the Regenerate button works also, but still no color on the mesh. I put the texture in a “Textures” folder, or in “Resources”, I changed the vertices to get a 2*2 square, I changed the resolution of each tile, the logs appear well. Sometimes the mesh is black after “regenerate”, and saving the project makes it appear grey… I restarted Unity in case it was a bug, but it is still the same. The material for the mesh is Diffuse. Would you know how to debug this?

Here is the code if this can help:

the “Regenerate” button :

using UnityEditor;
using UnityEngine;
using System.Collections;

[CustomEditor(typeof(TileMapNe))]
public class TileMapInspector : Editor {
	
	public override void OnInspectorGUI() {
		//base.OnInspectorGUI();
		DrawDefaultInspector();
		
		if(GUILayout.Button("Regenerate")) {
			TileMapNe tileMap = (TileMapNe)target;
			tileMap.BuildMesh();
		}
	}
}

The code to create the mesh :

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
[RequireComponent(typeof(MeshCollider))]
public class TileMapNe : MonoBehaviour {
	
	public int size_x = 2;
	public int size_z = 2;
	public float tileSize = 15.0f;
	
	public Texture2D terrainTiles;
	public int tileResolution;
	
	
	void Start () {
		BuildMesh();
	}
	
	void BuildTexture() {
		
		int texWidth = size_x * tileResolution;
		int texHeight = size_z * tileResolution;
		Texture2D texture = new Texture2D(texWidth, texHeight);
		
		for(int y=0; y < size_z; y++) {
			for(int x=0; x < size_x; x++) {
				Color p = new Color(1.0f, 0, 0);
				texture.SetPixel(x, y, p);
			}
		}
		
		texture.filterMode = FilterMode.Point;
		texture.wrapMode = TextureWrapMode.Clamp;
		texture.Apply();
		
		MeshRenderer mesh_renderer = GetComponent<MeshRenderer>();
		mesh_renderer.sharedMaterials[0].mainTexture = texture;
		
		Debug.Log ("Done Texture!");
	}
	
	public void BuildMesh() {
		int numTiles = size_x * size_z;
		int numTris = numTiles * 2;
		
		int vsize_x = size_x + 1;
		int vsize_z = size_z + 1;
		int numVerts = vsize_x * vsize_z;
		
		// Generate the mesh data
		Vector3[] vertices = new Vector3[ numVerts ];
		Vector3[] normals = new Vector3[numVerts];
		Vector2[] uv = new Vector2[numVerts];
		
		int[] triangles = new int[ numTris * 3 ];

		int x, z;
		for(z=0; z < vsize_z; z++) {
			for(x=0; x < vsize_x; x++) {
				vertices[ z * vsize_x + x ] = new Vector3( x*tileSize, 0, -z*tileSize );
				normals[ z * vsize_x + x ] = Vector3.up;
				uv[ z * vsize_x + x ] = new Vector2( (float)x / size_x, 1f - (float)z / size_z );
			}
		}
		Debug.Log ("Done Verts!");
		
		for(z=0; z < size_z; z++) {
			for(x=0; x < size_x; x++) {
				int squareIndex = z * size_x + x;
				int triOffset = squareIndex * 6;
				triangles[triOffset + 0] = z * vsize_x + x + 		   0;
				triangles[triOffset + 1] = z * vsize_x + x + vsize_x + 1;
				triangles[triOffset + 2] = z * vsize_x + x + vsize_x + 0;
				
				triangles[triOffset + 3] = z * vsize_x + x + 		   0;
				triangles[triOffset + 4] = z * vsize_x + x + 		   1;
				triangles[triOffset + 5] = z * vsize_x + x + vsize_x + 1;
			}
		}
		
		Debug.Log ("Done Triangles!");
		
		// Create a new Mesh and populate with the data
		Mesh mesh = new Mesh();
		mesh.vertices = vertices;
		mesh.triangles = triangles;
		mesh.normals = normals;
		mesh.uv = uv;
		
		// Assign our mesh to our filter/renderer/collider
		MeshFilter mesh_filter = GetComponent<MeshFilter>();
		MeshCollider mesh_collider = GetComponent<MeshCollider>();
		
		mesh_filter.mesh = mesh;
		mesh_collider.sharedMesh = mesh;
		Debug.Log ("Done Mesh!");
		
		BuildTexture();
	}
	
}

Thanks

2 Answers

2

try this

    void BuildTexture()
    {
        //Note1: tielResolution != 0
        int texWidth = size_x * (tileResolution<=0? 1 : tileResolution));
        int texHeight = size_z * (tileResolution<=0? 1 : tileResolution));
        Texture2D texture = new Texture2D(texWidth, texHeight);

        //Note2: SetPixs is more efficient than for(SetPix)
        Color[] color = new Color[texWidth * texHeight];
        for(int i=0;i<color.Length;i++)
        {
            color *= Color.red;*

}
texture.SetPixels(color);

texture.filterMode = FilterMode.Point;
texture.wrapMode = TextureWrapMode.Clamp;
texture.Apply();

MeshRenderer mesh_renderer = GetComponent();

//Note3: add material to mesh
mesh_renderer.sharedMaterial = new Material(Shader.Find(“Diffuse”));
mesh_renderer.sharedMaterial.mainTexture = texture;

Debug.Log(“Done Texture!”);
}

@Pauls That's a good news

This is probably too late, but to fix the issue with that tutorial you just need to add the shader either through the editor or in code as sooncat suggested:

// Between the 2 lines, before trying to set the mainTexture of the material, you need to give the gameObject a material
MeshRenderer mesh_renderer = GetComponent<MeshRenderer>();
mesh_renderer.sharedMaterial = new Material(Shader.Find("Diffuse"));
mesh_renderer.sharedMaterials[0].mainTexture = texture;