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
@Pauls That's a good news
– sooncat