Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
This post has been wikified, any user with enough reputation can edit it.
avatar image
1
Question by Pauls · Nov 26, 2013 at 08:43 AM · meshcolorverticesuv

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

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

2 Replies

· Add your reply
  • Sort: 
avatar image
2
Best Answer

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!");
     }
Comment
Add comment · Show 3 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Pauls · Nov 26, 2013 at 02:14 PM 0
Share

@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?

avatar image Pauls · Nov 27, 2013 at 02:16 AM 0
Share

@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!

avatar image sooncat · Nov 27, 2013 at 10:32 AM 0
Share

@Pauls That's a good news

avatar image
0

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;
Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

18 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Split a mesh while using same UVs and texture position. 0 Answers

Best way to optimize mesh updating through code? 1 Answer

UV-ing a sphere procedurally 1 Answer

how to remove vertices of a certain colour range from a mesh? 0 Answers

Fast way to find vertex of spezific color 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges