private void OnEnable() { point = target as SplinePoint; spline = point.transform.GetComponentInParent <Spline>(true); }
public static MeshFilter CreateRoad(this MeshFilter self, Spline.Spline spline, int resolution, float width) { if (self.sharedMesh == null) { self.sharedMesh = new Mesh() { name = "Road" } } ; points.Clear(); normals.Clear(); uvs.Clear(); triangles.Clear(); var radius = width * 0.5f; var yCount = resolution; var yLenght = spline.Length / yCount; var xCount = Mathf.CeilToInt(width / yLenght); var xLength = width / xCount; var uvY = (spline.Length / width) / yCount; var uvX = 1.0f / xCount; for (int i = 0; i <= yCount; i++) { var point = spline.GetLocalPoint(i * yLenght); var cross = Vector3.Cross(point.forward, point.upward).normalized; var right = point.position - cross * radius; points.Add(right); normals.Add(point.upward); var t = i * uvY; uvs.Add(new Vector2(1, t)); var tileL = (cross * xLength); for (int c = 1; c <= xCount; c++) { points.Add(right + tileL * c); normals.Add(point.upward); uvs.Add(new Vector2(1 - uvX * c, t)); } } for (int y = 0; y < yCount; y++) { var a = y * (xCount + 1); for (int x = 0; x < xCount; x++) { int i = x + a; triangles.Add(i); triangles.Add(i + 1); triangles.Add(i + xCount + 1); triangles.Add(i + 1); triangles.Add(i + xCount + 2); triangles.Add(i + xCount + 1); } } self.sharedMesh.Clear(); if (points.Count > 3) { self.sharedMesh.vertices = points.ToArray(); self.sharedMesh.normals = normals.ToArray(); self.sharedMesh.uv = uvs.ToArray(); self.sharedMesh.triangles = triangles.ToArray(); self.sharedMesh.RecalculateNormals(); } return(self); } #endif }
private void OnEnable() { spline = target as Spline; }