# Instantiate GameObjects in a Sphere shape

Hi all,

I'm trying to figure out a way to Instantiate a bunch of GameObjects ('flat' hexagons) to create a sphere. Essentially a spherical TileMap.

Is this actually possible and would anyone be able to point me in the right direction for a solution?

Thanks Spud

**Answer** by DreadKyller
·
Dec 22, 2017 at 01:38 AM

If you know the radius of the hexagon you can calculate everything needed:

It's important to remember that in a regular hexagon the length of each side is always equal to the radius. We need to envision the hexagon oriented this way:
Where the blue line is the radius:

The height is then equal to `radius*2`

The width is then equal to `radius*sqrt(3)`

Every odd numbered layer will be horizontally offset by `width/2`

Every even numbered layer will not be horizntally offset.

Every layer will have a vertical offset of `height*0.75`

Now we'll go through a 2D loop:

```
float ySpacing = height * 0.75f;
float xStagger = width / 2f;
int xCount = Mathf.CeilToInt(circleRadius / width);
int yCount = Mathf.CeilToInt(circleRadius / ySpacing);
float circleRadiusSqr = circleRadius * circleRadius;
// In cases where x is staggered by y position additional x unit is needed
// Thus the -1
for (int x = -xCount - 1; x <= xCount; x++) {
for (int y = -yCount; y <= yCount; y++) {
float yOffset = y * ySpacing;
float xOffset = x * width + ((y % 2) * xStagger);
if (xOffset * xOffset + yOffset * yOffset <= circleRadiusSqr)
{
Vector3 position = origin + xAxis * xOffset;
position = position + yAxis * yOffset;
// Do instantiation using position vector, replace xAxis and yAxis with any vector
// Pointing in that axis, standard axis use the axis defined
// in Vector3 (such as Vector3.up) or your own. If creating a 2D scene, use Vector2
}
}
}
```

If you need a sphere, not just a circle repeat this multiple times with a different origin on the axis you don't modify in the loop above. The new radius at any given hgieht in a sphere can be obtained with: `sqrt(circleRadiusSqr - sampleHeight * sampleHeight)`

Where sampleHeight is the height of a sphere where you wish to get the horizontal radius, equal to getting the width of a circle at a specific height.

Hope this was clear enough to help.

**Answer** by Spudly1701
·
Dec 22, 2017 at 03:57 AM

I've not had a chance to try this out yet, but I think I understand the thinking. Excellent explanation, thank you, really appreciate it.

So, to see if I have it right in my head.....

Define width/height (based on hex width) Define circle radius (for a ring of hexes)

For a circle use the equation in the last paragraph with a 'new' sampleHeight (currentHeight + radius*2) - simple example and repeat for amount of 'rows' needed to create sphere.

Assuming we start at sampleHeight=0, 2 loops, 1 for +y sampleHeight, 1 for -y sampleHeight ?

Spud

### Your answer

### Welcome to Unity Answers

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.