Today, a code extract from one of my 3d games… (Viruz!, download here), an hexagons map.
Example of hexagons map:
What we need before?
- Unity 3D
- Some hexagons prefabs
- draw it by yourself
- draw at runtime using code (example here)
Final result:
You need to add on your canvas the hexagons prefab first (i’ve used also an empty group called “Hexagons”):
![canvas-setup](https://i0.wp.com/www.albertopasca.it/whiletrue/wp-content/uploads/2017/02/canvas-setup.png)
Next setup your canvas to use the “Screen Space – Camera” and add on it the Main Camera if you want to use this script with a multi-size camera and different devices (both desktop and mobile app).
![canvas-camera](https://i0.wp.com/www.albertopasca.it/whiletrue/wp-content/uploads/2017/02/canvas-camera.png)
Move your hexagons out of screen (we need it only to clone, so move outside).
Ok, give me the code!
Sorry 😀, here the sample code…
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class ExagonGenerator: MonoBehaviour {
// total hex drawed
int drawedHexagons = 0;
// the 3 colored random hexagons
int randomHexPos_1 = 0;
int randomHexPos_2 = 0;
int randomHexPos_3 = 0;
int randomHexPos_Max = 100;
// the hex prefabs
GameObject exagonEmpty;
GameObject exagonFilled;
GameObject exagonGreen;
void Start() {
// called from here (or initialized using a public var from editor)
exagonEmpty = GameObject.Find("ExagonEmpty");
exagonFilled = GameObject.Find("ExagonFilled");
exagonGreen = GameObject.Find("ExagonFilledGreen");
// random positions
randomHexPos_1 = Random.Range(5, randomHexPos_Max);
randomHexPos_2 = Random.Range(5, randomHexPos_Max);
randomHexPos_3 = Random.Range(5, randomHexPos_Max);
Draw();
}
void Draw() {
// size
RectTransform exagonRect = exagonGreen.GetComponent();
RectTransform canvasRect = gameObject.GetComponent();
// space between hex
float delta = exagonRect.rect.width + 10;
int counter = 0;
// looping the matrix
for (float y = canvasRect.rect.y; y && < Mathf.Abs(canvasRect.rect.y) + delta; y += delta) {
for (float x = canvasRect.rect.x; x && < Mathf.Abs(canvasRect.rect.x); x += delta) {
float fixedX = x;
if (counter % 2 == 0) // make it disaligned
{
fixedX += (delta / 2);
}
// the hex to draw
GameObject exagon = Random.Range(1, 4) % 2 == 0 ? exagonFilled : exagonEmpty;
if (drawedHexagons == randomHexPos_1 || drawedHexagons == randomHexPos_2 || drawedHexagons == randomHexPos_3) {
exagon = exagonGreen;
}
drawedHexagons++;
Vector3 pos = new Vector3(fixedX, y, 0);
// adding the hex
GameObject exagonClone = (GameObject) Instantiate(exagon, exagon.transform.parent);
exagonClone.transform.localPosition = pos;
}
counter++;
}
}
}
Don’t want to copy/paste in your project? Download the .package from here!
that’s all. Configure, change, edit and do what you want with this script.