Looping inside OnGUI

I’m trying to use a for loop to create a button for every item is found inside the list menuItems. However i also want each button to be 50 pixels away from the last button. To do this i add 50 pixels to the xPos of the button after each loop. the problem is that it keeps adding 50 to it every frame. Help?

var rayLength : float = 30;

private var buttonPosX : int = 10;

private var buttonPosY : int = 10;

var menuItems : Array = [];

var itemTextures  : Array = [];

private var currentGameObject : String;

function Update () {

InventoryRay();
//PrintList(menuItems);

}

function PrintList(list) {

Debug.Log(list);

}

function InventoryRay() {

var hit : RaycastHit;

Debug.DrawRay(transform.position, transform.forward * rayLength, Color.red);

if(Physics.Raycast(transform.position, transform.forward, hit, rayLength))
	{
		if(Input.GetMouseButtonDown(0))
		{
			if(hit.collider.gameObject.tag == "collectable")
			{
				Debug.Log("collectable");
				currentGameObject = hit.collider.gameObject.name;
				Debug.Log(currentGameObject);
				menuItems.Add(currentGameObject);
			}
		}
	}


}

function OnGUI() {

GUI.Box(Rect(0, 0, Screen.width/2, Screen.height/2), "Inventory");
for(items in menuItems)
{
	if(GUI.Button(Rect(buttonPosX, buttonPosY, 100, 100), items))
	{
		
	}
	buttonPosX = buttonPosX + 50;
}

}

You need to reset buttonPosX at the start of each OnGUI frame loop.

For button spacing, you want to add the depth of the button with the space you want in-between. (I made the button depth 50)

Try this to replace your current GUI function :

function OnGUI() {
	GUI.Box(Rect(0, 0, Screen.width/2, Screen.height/2), "Inventory");
	buttonPosX = 10; // reset buttonPosX everytime OnGUI is called
	for(items in menuItems)
	{
		if(GUI.Button(Rect(buttonPosX, buttonPosY, 100, 50), items))
		{
			// do stuff
		}
	buttonPosX = buttonPosX + 100; // button depth (50) PLUS space between buttons (50)
	}
}

You’re not resetting buttonPosX before the loop in OnGUI, so it will just keep adding to it forever. It would be better and simpler to use a standard for loop (for (var i = 0; i < menuItems.Length; i++)) instead of a for/in loop, then you can just use the loop index instead of making a global variable. Also, don’t use Array, use List. unifycommunity.com