- Home /
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
Answer by sooncat · Nov 26, 2013 at 10:57 AM
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[i] = Color.red;
}
texture.SetPixels(color);
texture.filterMode = FilterMode.Point;
texture.wrapMode = TextureWrapMode.Clamp;
texture.Apply();
MeshRenderer mesh_renderer = GetComponent<MeshRenderer>();
//Note3: add material to mesh
mesh_renderer.sharedMaterial = new Material(Shader.Find("Diffuse"));
mesh_renderer.sharedMaterial.mainTexture = texture;
Debug.Log("Done Texture!");
}
@sooncat very very nice, thank you. I have got this problem : in the original project (at the bottom of this page: http://quill18.com/unity_tutorials/) the code works fine with his code, but when I repeat it with another gameObject in the same project, I need your changes to make it works, otherwise i get a created mesh entirely black. Then, on a second project, none of them work, your code works though with a red color, but not when I add a texture with : Color[] p = terrainTiles.GetPixels( x*tileResolution , y*tileResolution, tileResolution, tileResolution ); texture.SetPixels(x*tileResolution, y*tileResolution, tileResolution, tileResolution, p);
the created mesh is always black... Would you know what could be the problem?
@sooncat O$$anonymous$$, I don't know what was the problem. Now on a all-new project, it works fine. Anyway, thanks for your answer, at least I learned something with your message :) EDIT: O$$anonymous$$... I understood: the size of my texture was 512 * 256, and I set too many tiles, with a too high resolution, which added a black texture on the tiles! O$$anonymous$$, done! Thank you again for your help!
Answer by Lantix · May 26, 2014 at 11:12 PM
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;