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;
}
}
