- Home /
Question by
UnityProgramist2014 · Jan 14, 2014 at 04:07 PM ·
meshminecraft
Shader wants texture coordinates, but the mesh doesn't have them H
I try to make a copy of Minecraft in Unity.I wroted a chunk script,but I have this error: Shader wants texture coordinates, but the mesh doesn't have them
Can everyone help me??
Here's a chunk script:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[RequireComponent (typeof(MeshFilter))]
[RequireComponent (typeof(MeshCollider))]
public class Chunk : MonoBehaviour {
public int width = 16;
public byte[,,] map;
protected Mesh mesh;
protected MeshCollider meshCollider;
protected List<Vector3> verts = new List<Vector3>();
protected List<int> tris = new List<int>();
public List<Vector2> uv = new List<Vector2>();
// Use this for initialization
void Start () {
meshCollider = GetComponent<MeshCollider>();
map = new byte[width, width, width];
for (int x = 0; x < width; x++){
for (int z = 0; z < width;z++){
map[x,0,z] = 1;
map[x,1,z] = 1;
map[x,2,z] = 1;
map[x,3,z] = (byte)Mathf.RoundToInt(Random.value);
}
}
mesh = new Mesh();
GetComponent<MeshFilter>().mesh = mesh;
Regenerate();
}
// Update is called once per frame
void Update () {
}
public void DrawBrick(int x, int y, int z, byte block){
Vector3 start = new Vector3(x,y,z);
Vector3 offset1, offset2;
if (IsTransparent(x, y - 1, z)){
offset1 = Vector3.left;
offset2 = Vector3.back;
DrawFace(start + Vector3.right, offset1, offset2, block);
}
if (IsTransparent(x, y + 1, z)){
offset1 = Vector3.right;
offset2 = Vector3.back;
DrawFace(start + Vector3.up, offset1, offset2, block);
}
if (IsTransparent(x - 1, y, z)){
offset1 = Vector3.up;
offset2 = Vector3.back;
DrawFace(start, offset1, offset2, block);
}
if (IsTransparent(x + 1, y, z)){
offset1 = Vector3.down;
offset2 = Vector3.back;
DrawFace(start + Vector3.right + Vector3.up, offset1, offset2, block);
}
if (IsTransparent(x, y, z - 1)){
offset1 = Vector3.left;
offset2 = Vector3.up;
DrawFace(start + Vector3.right + Vector3.back, offset1, offset2, block);
}
if (IsTransparent(x, y, z + 1)){
offset1 = Vector3.right;
offset2 = Vector3.up;
DrawFace(start, offset1, offset2, block);
}
}
public void DrawFace(Vector3 start, Vector3 offset1, Vector3 offset2, byte block) {
int index = verts.Count;
verts.Add(start);
verts.Add(start + offset1);
verts.Add(start + offset2);
verts.Add(start + offset1 + offset2);
Vector2 uvBase;
switch (block)
{
default:
uvBase = new Vector2(0.25f,0.25f);
break;
case 2 :
uvBase = new Vector2(0.75f,75f);
break;
case 3 :
uvBase = new Vector2(0.25f,0.75f);
break;
}
if((offset1 == Vector3.right) && (offset2 == Vector3.back))
{
uv.Add(uvBase);
uv.Add(uvBase + new Vector2(0.125f,0));
uv.Add(uvBase + new Vector2(0,0.125f));
uv.Add(uvBase + new Vector2(0.125f,0.125f));
}else{
uv.Add(uvBase);
uv.Add(uvBase + new Vector2(-0.125f,0));
uv.Add(uvBase + new Vector2(0,0.125f));
uv.Add(uvBase + new Vector2(-0.125f,0.125f));
}
tris.Add(index + 0);
tris.Add(index + 1);
tris.Add(index + 2);
tris.Add(index + 3);
tris.Add(index + 2);
tris.Add(index + 1);
}
public bool IsTransparent(int x,int y,int z){
if ((x < 0) || (y < 0) || (z < 0) || (x >= width) || (y >= width) || (z >= width)) return true;
return map[x,y,z] == 0;
}
public void Regenerate() {
verts.Clear();
tris.Clear();
uv.Clear();
mesh.triangles = tris.ToArray();
for (int x = 0; x < width; x++){
for (int y = 0; y < width;y++){
for (int z = 0; z < width;z++){
byte block = map[x,y,z];
if (block == 0) continue;
DrawBrick(x,y,z,block);
}
}
}
mesh.vertices = verts.ToArray();
mesh.triangles = tris.ToArray();
mesh.RecalculateNormals();
meshCollider.sharedMesh = null;
meshCollider.sharedMesh = mesh;
}
public void SetBrick(int x, int y, int z ,byte block) {
if ((x < 0) || (y < 0) || (z < 0) || (x >= width) || (y >= width) || (z >= width)) return;
if (map[x,y,z] != block){
map[x,y,z] = block;
Regenerate();
}
}
}
`
Screenshots:
P.s. Sorry for my english
Comment
Try cleaning up your code to just show the relevant parts in order to get an answer. Nobody wants to read all that.
Answer by tanoshimi · Aug 24, 2014 at 07:16 PM
Like the error message says, your model has no texture coordinates (I.e. You never assign mesh.uv)