Gap appears between two 2D hexagons sharing two vertices

Here are two scripts. Map is attached to a plane and instantiates objects of type Hex. The Hex.ToString() function prints vertices in (x,z) format because y is constant. Here is the result of the Hex.ToString() operations in advance:

Center: (0,0)

v1: (-6,0)

v2: (-3,5)

v3: (3,5)

v4: (6,0)

v5: (3,-5)

v6: (-3,-5)

Center: (-9,5)

v1: (-15,5)

v2: (-12,10)

v3: (-6,10)

v4: (-3,5)

v5: (-6,0)

v6: (-12,0)

The first hexagon’s vertex v1 = the second hexagon’s vertex v5 = (-6,0)

The first hexagon’s vertex v2 = the second hexagon’s vertex v4 = (-3,5)

The hexagons should overlap at a line drawn between the two shared vertices, however, they are spaced out. The size of these gaps also seems to scale with the radius of the hexagon.

public class Map : MonoBehaviour 
{
	private int radius = 6;
	void Awake() 
	{	
		Texture2D hexTexture = (Texture2D) Resources.Load ( "Hex" );
		
	
		Hex center = (Hex) this.gameObject.AddComponent ( "Hex" );
		center.Draw ( radius, 0, 0, hexTexture );
	
		Hex neighbor = (Hex) this.gameObject.AddComponent ( "Hex" );
		neighbor.Draw ( radius, -9, 5, hexTexture );
	}
}

public class Hex : MonoBehaviour
{
	private const float y = 0.01f;

	public void Draw( int r, float x, float z, Texture2D hexTexture )
	{		
		gO = new GameObject();
		gO.transform.position = new Vector3( x, y, z );
		gO.name = ( "Hex (" + x.ToString () + "," + z.ToString () + ")" );
				 		
		Vector3[] vertices = ComputeVertices( r, x, z );
		hexInfo = new HexInfo( r, x, z, vertices );
		
		Vector2 uvCenter = new Vector2( .5f, .5f );
		Vector2 uvV1 = new Vector2( 0, .5f );
		Vector2 uvV2 = new Vector2( .333f, 0 );
		Vector2 uvV3 = new Vector2( .666f, 0 );
		Vector2 uvV4 = new Vector2( 1, .5f );
		Vector2 uvV5 = new Vector2( .666f, 1 );
		Vector2 uvV6 = new Vector2( .333f, 1 );
		
		Vector2[] uv = { uvCenter, uvV1, uvV2, uvV3, uvV4, uvV5, uvV6 };
		
		int[] indeces = {
			6, 0, 5,
			5, 0, 4,
			4, 0, 3, 
			3, 0, 2,
			2, 0, 1,
			1, 0, 6,
		};
		
		Vector3[] normals = {
			Vector3.up,
			Vector3.up,
			Vector3.up,
			Vector3.up,
			Vector3.up,
			Vector3.up,
			Vector3.up
		};
		
		Mesh mesh = new Mesh();
		mesh.vertices = vertices;
		mesh.triangles = indeces;
		mesh.uv = uv;
		mesh.normals = normals;
		mesh.Optimize();
		
		MeshFilter meshFilter = (MeshFilter) gO.AddComponent( "MeshFilter" );
		meshFilter.mesh = mesh;
		
		MeshRenderer meshRenderer = (MeshRenderer) gO.AddComponent( "MeshRenderer" );
		meshRenderer.material.mainTexture = hexTexture;
		
		Debug.Log ( "Drew Hexagon: " + this.ToString () );
	}

//   v2 -- v3
//  /        \
// /          \
// v1    C    v4
// \          /
//  \        /
//   v6 -- v5 


	//        v2
	//       /|\
	//    c / | \
	//     /  |b \  
 	// v1 <-------Center
	//       a 
	//
	// All triangles in the hexagon have the properties of 
	// triangle (v1,v2,center), where a = c = radius
	//
	// Angle ab is a right angle whose line b bisects line a:
	// The x coordinate of v1 is the center's x coordinate - radius
	// The x coordinate of v4 is the center's x coordinate + radius
	// The x coordinate of v2 and v6 is the center's x value - 1/2 radius
	// The x coordinate of v3 and v5 is the center's x value + 1/2 radius
	//
	// line b's length is 1/2 of the hexagon's height H:
	// The z coordinate of v1 and v4 is the center's z coordinate
	// The z coordinate of v2 and v3 is the center's z value + b
	// The z coordinate of v6 and v5 is the center's z value - b
	private Vector3[] ComputeVertices( int r, float x, float z )
	{
		// Cast b to an integer to force rounding
		int b = (int) HexInfo.GetHeight ( r ) / 2;
		float halfRadius = r / 2;
		
		Vector3 center = new Vector3( x, y, z );
		Vector3 v1 = new Vector3( x - r, y, z );
		Vector3 v4 = new Vector3( x + r, y, z );
		
		Vector3 v2 = new Vector3( x - halfRadius, y, z + b );
		Vector3 v3 = new Vector3( x + halfRadius, y, z + b );
		Vector3 v5 = new Vector3( x + halfRadius, y, z - b );
		Vector3 v6 = new Vector3( x - halfRadius, y, z - b );
						
		Vector3[] vertices = { center, v1, v2, v3, v4, v5, v6 };
		return vertices;
	}
}

The reason there is a gap is that you are using the object’s center coordinates (x,z) as part of it’s vertex coordinates, and then you are also positioning it. So the second Hex gets positioned at (-9,.01,5), but it’s actual center coordinate is (-9,.01,5) relative to that, so the center coordinate is in world space at (-18, .02, 10).

Your vertices should be centered around your “pivot” point for each Hex, and should be the same for each Hex - since you place them with .position.

To fix, just change your ComputeVertices to:

private Vector3[] ComputeVertices( int r, float x, float z )
{
   // Cast b to an integer to force rounding
   int b = (int) HexInfo.GetHeight ( r ) / 2;
   float halfRadius = r / 2;

   Vector3 center = new Vector3( 0, 0, 0 );
   Vector3 v1 = new Vector3( - r, 0, 0 );
   Vector3 v4 = new Vector3(   r, 0, 0 );

   Vector3 v2 = new Vector3( - halfRadius, 0, b );
   Vector3 v3 = new Vector3(   halfRadius, 0, b );
   Vector3 v5 = new Vector3(   halfRadius, 0, - b );
   Vector3 v6 = new Vector3( - halfRadius, 0, - b );

   Vector3[] vertices = { center, v1, v2, v3, v4, v5, v6 };
   return vertices;
}