# place 8 objects around a target gameObject in a circle ( like a compass )

Hey there !

I’m trying to instantiate 8 different gameobjects around my character, but I don’t really know the math behind it, to do it with Sin or Asin.

First I was trying to do a for cycle from 1-8, then tried to convert i to degrees then that back to vectors, but somewhere around I gave up on that try.

``````for (int i = 1; i < 8; i++) {
//Got the degree
float degree = Mathf.Asin(i / 360.0f);
//How to convert it to a vector ?
Vector2 vector = ?;
//Instantiating
Vector3 newPos = new Vector3(vector.x, y, vector.z);
GameObject go = Instantiate(GameObject.CreatePrimitive(PrimitiveType.Cube), newPos, Quaternion.identity);
}
``````

Does anyone know the math behind it ?

for (int i = 0; i < 8; i++)
{
float angle = i * Mathf.PI*2f / 8;
GameObject go = Instantiate(GameObject.CreatePrimitive(PrimitiveType.Cube), newPos, Quaternion.identity);
}

First of all all trigonometry functions work with radians and not degree (full circle is 2*PI). Second ASin only covers 180°. Next thing is you started your loop with “1” but ended it on “7” ( “< 8”). That’s why you usually start at 0 and go up to 7 which are 8 values.

So all you need is Sin and Cos with equally spaced angles in radians.

im a bit late for this but for anyone struggling with this @Bunny83 pretty much gave me everything i needed but i wrapped it into a pretty function for any amount of objects and from any position in the world.

``````public void instantiateInCircle(GameObject obj, Vector3 location, int howMany)
{
for (int i = 0; i < howMany; i++)
{
float angle = i * Mathf.PI * 2f / radius;
Vector3 newPos = transform.position + (new Vector3(Mathf.Cos(angle) * radius, -2, Mathf.Sin(angle) * radius));
Instantiate(obj, newPos, Quaternion.Euler(0, 0, 0));
}
}
``````

full credit to @Bunny83 , math is not my thing. neither is programming hence why i came here in the first place LOL.

I Extended a little bit more the implementation of @elButterfingers and @Bunny83 , I added some methods for and parameters to customize better the usages. I hope that be useful! Cheers!

``````public class TestCreateObjectsInCircle : MonoBehaviour
{
public GameObject prefabToInstantiate;

/// <summary>
///     Instantiates prefabs around center splited equality.
///     The number of times indicated in <see cref="howMany" /> var is
///     the number of parts will be the circle cuted, with taking as a center the location,
/// </summary>
/// <param name="prefab">The object it will be intantiated</param>
/// <param name="location">The center point of the circle</param>
/// <param name="howMany">The number of parts the circle will be cut</param>
///     your final position can be (4,1,1) for example
/// </param>
/// <param name="yPosition">The yPostion for the instantiated prefabs</param>
public void InstantiateInCircle(GameObject prefab, Vector3 location, int howMany, float radius, float yPosition)
{
float angleSection = Mathf.PI * 2f / howMany;
for (int i = 0; i < howMany; i++)
{
float angle = i * angleSection;
Vector3 newPos = location + new Vector3(Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius;
newPos.y = yPosition;
Instantiate(prefab, newPos, prefab.transform.rotation);
}
}

public void InstantiateInCircle(GameObject prefab, Vector3 location, int howMany, float radius)
{
}

public void InstantiateInCircle(GameObject prefab, int howMany, float radius)
{
}

// client EXAMPLE
private void Start()
{
this.InstantiateInCircle(this.prefabToInstantiate, new Vector3(0,0,0), 24, 2, 2);
}
}
``````

Thanks for this awesome script @Raikish
How could I add rotation to the prefabs? I want to instantiate the enemies in a 3d environment, but the game is supposed to be viewed 2d. So I want the circle to be “upright”, zero on the z.position for all the instantiated prefabs.
I tried to add a vector3 rotation to the function, but somehow cant make it work.

Thanks for the script @Bunny83 ! Really helped my game!