public Tile CreateTile(Vector3 center, List <MeshTriangle> adjacentTris) { GameObject tileObj = new GameObject("Tile"); Mesh submesh = new Mesh(); tileObj.AddComponent <MeshFilter>(); tileObj.AddComponent <MeshRenderer>(); tileObj.transform.parent = this.transform; tileObj.transform.localPosition = center; Vector3 barycenter = Vector3.zero; List <Vector3> verts = new List <Vector3>(); List <Vector2> uvs = new List <Vector2>(); // Calculate the barycenter of the tile face foreach (MeshTriangle tri in adjacentTris) { Vector3 incenter = tri.GetIncenter(); barycenter += incenter; verts.Add(incenter); } // Orient tile transform Vector3 norm = barycenter - transform.position; barycenter /= adjacentTris.Count; tileObj.transform.localPosition = barycenter; //tileObj.transform.up = Invert ? -norm : norm; Vector3 toFirstVert = verts[0] - barycenter; tileObj.transform.rotation = Quaternion.LookRotation(toFirstVert, Invert ? -norm : norm); // Convert all vertices into the local space of the tile for (int i = 0; i < verts.Count; i++) { verts[i] = tileObj.transform.InverseTransformPoint(verts[i]); } // Sort verts clockwise Vector3[] vertArray = verts.ToArray(); Array.Sort(vertArray, new ClockwiseComparer(Vector3.zero)); // Generate UVs float startAngle = 90f; for (int i = 0; i < vertArray.Length; i++) { float angle = 360f * ((float)i / vertArray.Length) * Mathf.Deg2Rad + startAngle * Mathf.Deg2Rad; float x = Mathf.Cos(angle); float y = Mathf.Sin(angle); Vector2 uv = new Vector2(x, y) / 2f + new Vector2(0.5f, 0.5f); uvs.Add(uv); } uvs.Reverse(); // Generate Triangles List <int> subIndices = new List <int>(); for (int t = 1; t < verts.Count - 1; t++) { subIndices.Add(0); subIndices.Add(t); subIndices.Add(t + 1); } // Build Mesh submesh.vertices = vertArray; submesh.triangles = subIndices.ToArray(); submesh.uv = uvs.ToArray(); submesh.RecalculateBounds(); submesh.RecalculateNormals(); // Setup tile tileObj.GetComponent <MeshFilter>().sharedMesh = submesh; BaseTileScript tile = tileObj.AddComponent <BaseTileScript>(); tile.isHexagon = verts.Count == 6; //tile.GetComponent<Renderer>().sharedMaterial = verts.Count == 6 ? hexMat : pentMat; if (GenerateTileColliders) { switch (TileColliderType) { case TileColliderType.Box: tileObj.AddComponent <BoxCollider>(); break; case TileColliderType.Mesh: tileObj.AddComponent <MeshCollider>(); break; case TileColliderType.Sphere: tileObj.AddComponent <SphereCollider>(); break; } } verts.Clear(); subIndices.Clear(); tile.IsInverted = Invert; tile.parentPlanet = this; tile.Initialize(); tile.SetGroupId(0); return(tile); }