x


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;
}

}
more ▼

asked Mar 24 '12 at 05:37 PM

Kag359six gravatar image

Kag359six
102 20 31 33

(comments are locked)
10|3000 characters needed characters left

2 answers: sort voted first

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)
    }
}
more ▼

answered Mar 24 '12 at 05:47 PM

alucardj gravatar image

alucardj
13.6k 34 55 86

(comments are locked)
10|3000 characters needed characters left

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

more ▼

answered Mar 24 '12 at 05:48 PM

Eric5h5 gravatar image

Eric5h5
80.1k 41 132 519

thx for the link , very useful info there :)

Mar 24 '12 at 05:54 PM alucardj

thanks! although alucardj's solution works too.

Mar 24 '12 at 06:48 PM Kag359six

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

Mar 24 '12 at 06:55 PM Kag359six

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++)
Mar 24 '12 at 07:35 PM alucardj
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x242
x95
x92
x86
x8

asked: Mar 24 '12 at 05:37 PM

Seen: 728 times

Last Updated: Mar 24 '12 at 07:35 PM