Code : Tout sélectionner
public void SetRoadPoint(List<Vector3> path)
{
// créer une courbe de Bézier à partir des points du chemin
BezierCurve curve = BezierCurve.CreateCurve(path);
// créer un GameObject pour représenter la route
GameObject roadObject = new GameObject("Road");
// ajouter un composant MeshFilter au GameObject pour contenir la géométrie de la route
MeshFilter meshFilter = roadObject.AddComponent<MeshFilter>();
// créer un nouveau Mesh pour représenter la géométrie de la route
Mesh mesh = new Mesh();
// créer un tableau de Vector3 pour stocker les sommets de la géométrie de la route
Vector3[] vertices = new Vector3[curve.Points.Count * 2];
// créer un tableau d'entiers pour définir les indices des triangles de la géométrie de la route
int numSegments = curve.Points.Count - 1;
if (numSegments > 0)
{
int trianglesPerSegment = 2 * 3; // 2 triangles par segment, 3 indices par triangle
int numTriangles = numSegments * trianglesPerSegment;
int[] triangles = new int[numTriangles];
// calculer les sommets et les triangles de la géométrie de la route
for (int i = 0; i < curve.Points.Count; i++)
{
Vector3 point = curve.Points[i];
Vector3 normal = curve.Normals[i];
// calculer la direction de la route en chaque point
Vector3 direction = Vector3.Cross(Vector3.up, normal).normalized;
// calculer les sommets pour la chaussée
vertices[i * 2] = point - direction * 2.5f; // sommet gauche
vertices[i * 2 + 1] = point + direction * 2.5f; // sommet droit
// calculer les triangles pour la chaussée
if (i < curve.Points.Count - 1)
{
int ti = i * 6;
int vi = i * 2;
triangles[ti] = vi;
triangles[ti + 1] = vi + 1;
triangles[ti + 2] = vi + 2;
triangles[ti + 3] = vi + 1;
triangles[ti + 4] = vi + 3;
triangles[ti + 5] = vi + 2;
}
}
// ajouter les sommets et les triangles au Mesh
mesh.vertices = vertices;
mesh.triangles = triangles;
// ajouter des normales au Mesh pour un éclairage correct
Vector3[] normals = new Vector3[vertices.Length];
for (int i = 0; i < normals.Length; i++)
{
normals[i] = Vector3.up;
}
mesh.normals = normals;
// ajouter des coordonnées de texture pour la texture de la chaussée
Vector2[] uv = new Vector2[vertices.Length];
for (int i = 0; i < uv.Length; i += 2)
{
uv[i] = new Vector2(0, i / 2);
uv[i + 1] = new Vector2(1, i / 2);
}
mesh.uv = uv;
// affecter le Mesh au MeshFilter
meshFilter.mesh = mesh;
// ajouter un composant MeshRenderer au GameObject pour afficher la géométrie de la route
MeshRenderer meshRenderer = roadObject.AddComponent<MeshRenderer>();
// ajouter un matériau pour la texture de la chaussée
meshRenderer.material = new Material(Shader.Find("Standard"));
meshRenderer.material.mainTexture = Resources.Load<Texture>("Texture/Road/Road");
meshRenderer.material = meshRenderer.material;
}
}