- Home /
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;
}
}
Answer by AlucardJay · Mar 24, 2012 at 05:47 PM
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)
}
}
Answer by Eric5h5 · Mar 24, 2012 at 05:48 PM
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. http://unifycommunity.com/wiki/index.php?title=Which_Kind_Of_Array_Or_Collection_Should_I_Use%3F
im having an issue with the standard for loop. when i use it, all of a sudden its says that the there is no valid arguement for the gui.button line
try debugging to see where it's breaking.
for (var i = 0; i < menuItems.Length; i++)
{
print ("i "+i+" : menuItems["+i+"] = "+menuItems[i]);
// other code
}
just guessing, you may be running out of places in the menuItems array.
see the .length may be 12 , but counting from 0 , you get to 11.
to fix this :
for (var i = 0; i < (menuItems.Length - 1); i++)