I wrote a quick sample, the grid is always centered to the spawn position. You can adjust the following: >- number of objects in x and y direction, just like you already had it - distance between objects in x and y direction (seperately) - assign a transform which provides the spawn position, if it's null, the grid will stay at the world origin Looks a bit confusing, but just to get an idea... using UnityEngine; using System.Collections.Generic; public class GridManager : MonoBehaviour { public int GridWidth; public int GridHeight; [Range(0,5)] public int distanceX; [Range(0,5)] public int distanceY; public Transform spawnPoint; public GameObject myPrefab; public List<GameObject> list = new List<GameObject>(); void Start() { CreateGrid(); } public void CreateGrid() { GameObject newEmptyGameObject = new GameObject("Grid"); // following line is probably not neccessary newEmptyGameObject.transform.position = Vector3.zero; // some math to find the most left and bottom offset float offsetLeft = (-GridWidth / 2f) * distanceX + distanceX / 2f; float offsetBottom = (-GridHeight / 2f) * distanceY + distanceY / 2f; // set it as first spawn position (z=1 because you had it in your script) Vector3 nextPosition = new Vector3(offsetLeft, offsetBottom, 1f); for (int y = 0; y < GridHeight; y++) { for (int x = 0; x < GridWidth; x++) { GameObject clone = Instantiate(myPrefab, nextPosition, Quaternion.identity) as GameObject; clone.transform.parent = newEmptyGameObject.transform; // add to list list.Add(clone); // add x distance nextPosition.x += distanceX; } // reset x position and add y distance nextPosition.x = offsetLeft; nextPosition.y += distanceY; } // move the whole grid to the spawnPoint, if there is one if (spawnPoint != null) newEmptyGameObject.transform.position = spawnPoint.position; } }