- Home /
Voxel retexture problem
Hi I have been trying to figure out voxel and I have gotten pretty far and made my own script from scratch but I am stuck on editing the terrain because I cant get the uvs to work right.
here is me clicking once on the grass
here is me clicking one below that block
and here is my script
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(MeshRenderer))]
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshCollider))]
public class RealVoxel : MonoBehaviour {
public int length = 1;
public int width = 1;
public Camera myCam;
private float tUnit = 0.25f;
private Vector2 tStone = new Vector2 (0, 3);
private Vector2 tGrass = new Vector2 (1, 3);
private MeshRenderer meshRender;
private MeshFilter meshFilter;
private MeshCollider meshCollider;
protected List<int>tris = new List<int>();
protected List<Vector2>uvs = new List<Vector2>();
protected List<Vector3>verts = new List<Vector3>();
private int id = 0;
private int tri = 0;
void Start()
{
meshRender = this.GetComponent<MeshRenderer>();
meshFilter = this.GetComponent<MeshFilter>();
meshCollider = this.GetComponent<MeshCollider>();
genCube();
}
void Update()
{
if(Input.GetKeyDown(KeyCode.Mouse0))
{
RaycastHit hit = new RaycastHit();
Ray vRay = myCam.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(vRay, out hit, 40))
{
Vector3 pos = new Vector3(0,0,0);
int x;
int y;
int z;
float fx = hit.point.x;
float fy = hit.point.y;
float fz = hit.point.z;
x = (int)fx;
y = (int)fy;
z = (int)fz;
print(x + ":" + y + ":" + z);
EditTerrain(new Vector3(x+1,y,z+1));
}
}
}
void EditTerrain(Vector3 pos)
{
Mesh mesh= new Mesh();
for(int i = 0; i < verts.Count; i++)
{
if(verts[i] == pos)
{
id = i;
break;
}
}
tri = id * 6;
uvs[id ] = (new Vector2 (tUnit * tStone.x, tUnit * tStone.y + tUnit));
uvs[id+1] = (new Vector2 (tUnit * tStone.x + tUnit, tUnit * tStone.y + tUnit));
uvs[id+2] = (new Vector2 (tUnit * tStone.x + tUnit, tUnit * tStone.y));
uvs[id+3] = (new Vector2 (tUnit * tStone.x, tUnit * tStone.y));
Recalcutlate(mesh);
}
void genCube()
{
for(int x = 0; x <= length; x++)
{
top(new Vector3(x,1,0));
for(int z = 0; z <= width; z++)
{
top(new Vector3(x,1,z));
}
}
}
public virtual void removeBlock(Vector3 corner)
{
Mesh visualMesh = new Mesh();
}
public virtual void top(Vector3 corner)
{
Mesh visualMesh = new Mesh();
int index = verts.Count;
verts.Add(corner);
verts.Add(corner + new Vector3(0,0,1));
verts.Add(corner + new Vector3(1,0,0) + new Vector3(0,0,1));
verts.Add(corner + new Vector3(1,0,0));
uvs.Add(new Vector2 (tUnit * tGrass.x, tUnit * tGrass.y + tUnit));
uvs.Add(new Vector2 (tUnit * tGrass.x + tUnit, tUnit * tGrass.y + tUnit));
uvs.Add(new Vector2 (tUnit * tGrass.x + tUnit, tUnit * tGrass.y));
uvs.Add(new Vector2 (tUnit * tGrass.x, tUnit * tGrass.y));
tris.Add(index + 0);
tris.Add(index + 1);
tris.Add(index + 2);
tris.Add(index + 2);
tris.Add(index + 3);
tris.Add(index + 0);
Recalcutlate(visualMesh);
}
void Recalcutlate(Mesh visualMesh)
{
visualMesh.Clear ();
visualMesh.vertices = verts.ToArray();
visualMesh.uv = uvs.ToArray();
visualMesh.triangles = tris.ToArray();
visualMesh.Optimize();
visualMesh.RecalculateBounds();
visualMesh.RecalculateNormals();
meshFilter.mesh = visualMesh;
meshCollider.sharedMesh = visualMesh;
}
}
seem it's 2D mesh try this:
verts.Add(corner);
verts.Add(corner + new Vector3(0,0,1));
verts.Add(corner + new Vector3(1,0,0) + new Vector3(0,0,1));
verts.Add(corner + new Vector3(1,0,0));
uvs.Add(new Vector2 (corner.x, corner.z));
uvs.Add(new Vector2 (corner.x, corner.z+1));
uvs.Add(new Vector2 (corner.x+1, corner.z+1));
uvs.Add(new Vector2 (corner.x+1, corner.z));
Thanks man this well help out a lot lol I know what im looking for now
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Distribute terrain in zones 3 Answers
generate lightmap uvs? 1 Answer
Set UVs depending on input 1 Answer