il s'inspire en grande parti de plusieurs tuto trouvé sur le web, comme j'ai un peu de mal a tout comprendre et que ça n'est pas instructif de faire du copié/collé. je réécrit une version de base pour comprendre tout les rouage
je souhaite simplement faire un empilement de boite décrit par la taille d'un chunk
exemple : si chunkx y et z vaux chacun 2 , je devrait avoir 2x2x2 boites. mais ça ne marche pas, seul la dernière des 8 boite est calculé .
ou est mon erreur?
comment faire pour que ce code me rende 8 cubes empilé en 2x2x2 ( ou tout autre valeur rentré en chunksize dans l'inspector) au lieu d'un seul ?
(c'est la méthode la plus basique avec tout les vertices et face interne calculé , je sait , mais j'ai déjà besoin de ça pour comprendre la suite, la création du mesh de chacun faces sont séparé en plusieurs méthode justement pour ne plus le faire par la suite)
Appliquer un gameobject empty avec un meshfilter , un mesh renderer un mesh collider et ce script.
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class Voxel : MonoBehaviour
{
public int chunkSizeX = 2;
public int chunkSizeY = 2;
public int chunkSizeZ = 2;
private int voxelCountX;
private int voxelCountY;
private int voxelCountZ;
private Mesh mesh;
private new MeshRenderer renderer;
private new MeshCollider collider;
private Vector3[] vertices = new Vector3[8];
private int[] triangles = new int[36];
private void Start()
{
Vector3 Chunk = new Vector3(chunkSizeX, chunkSizeY, chunkSizeZ);
mesh = gameObject.GetComponent<MeshFilter>().mesh;
renderer = gameObject.GetComponent<MeshRenderer>();
collider = gameObject.GetComponent<MeshCollider>();
for (int z =0; z<chunkSizeZ; z++)
{
if (voxelCountZ == chunkSizeZ)
{ voxelCountZ = 1; }
else { voxelCountZ++; }
for (int y = 0; y< chunkSizeY; y++)
{
if (voxelCountY == chunkSizeY)
{
voxelCountY = 1;
}
else
voxelCountY++;
for (int x = 0; x < chunkSizeX; x++)
{
if (voxelCountX == chunkSizeX)
{ voxelCountX = 1; }
else { voxelCountX++; }
GetVertices();
GetTriangles();
MakeMesh();
print("x" + voxelCountX + "y" + voxelCountY + "z" + voxelCountZ);
}
}
}
}
void GetVertices()
{
int x = voxelCountX;
int y = voxelCountY;
int z = voxelCountZ;
vertices[0] = new Vector3(x -1 , y -1 , z -1 );
vertices[1] = new Vector3(x , y -1 , z -1 );
vertices[2] = new Vector3(x -1 , y , z -1 );
vertices[3] = new Vector3(x , y , z -1 );
vertices[4] = new Vector3(x -1 , y -1 , z );
vertices[5] = new Vector3(x , y -1 , z );
vertices[6] = new Vector3(x -1 , y , z );
vertices[7] = new Vector3(x , y , z );
}
void GetTriangles()
{
GetTrianglesFront();
GetTrianglesBack();
GetTrianglesTop();
GetTrianglesDown();
GetTrianglesLeft();
GetTrianglesRight();
}
void GetTrianglesFront()
{
triangles[0] = 0;
triangles[1] = 2;
triangles[2] = 1;
triangles[3] = 1;
triangles[4] = 2;
triangles[5] = 3;
}
void GetTrianglesBack()
{
triangles[6] = 4;
triangles[7] = 5;
triangles[8] = 7;
triangles[9] = 4;
triangles[10] = 7;
triangles[11] = 6;
}
void GetTrianglesTop()
{
triangles[12] = 2;
triangles[13] = 6;
triangles[14] = 3;
triangles[15] = 3;
triangles[16] = 6;
triangles[17] = 7;
}
void GetTrianglesDown()
{
triangles[18] = 0;
triangles[19] = 1;
triangles[20] = 4;
triangles[21] = 1;
triangles[22] = 5;
triangles[23] = 4;
}
void GetTrianglesLeft()
{
triangles[24] = 0;
triangles[25] = 4;
triangles[26] = 2;
triangles[27] = 4;
triangles[28] = 6;
triangles[29] = 2;
}
void GetTrianglesRight()
{
triangles[30] = 1;
triangles[31] = 3;
triangles[32] = 5;
triangles[33] = 3;
triangles[34] = 7;
triangles[35] = 5;
}
void MakeMesh()
{
mesh.Clear();
mesh.vertices = vertices;
mesh.triangles = triangles;
renderer.material = new Material(Shader.Find("Diffuse"));
MeshUtility.Optimize(mesh);
collider.sharedMesh = null;
collider.sharedMesh = mesh;
}
}