x


Waiting for input using yield and coroutines

I'm obviously not a great programmer, and I'm having a problem at the moment that I think stems from a fundamental misunderstanding of coroutines and yield.

Basically, I have a function used to display GUI texts according to a numbered variable when the player activates a terminal etc. I want the GUI message to display until the player hits a key, and then load the next message ( very similar to this, but I can't figure it out)

So the two scripts are as follows (names simplified):

//Script 1
yield Script2.Display(1);
yield Script2.Display(2);
yield Script2.Display(3);


//Script 2    
//this function enables the GUI script
function Display(messageNumber){
 messagenumber = textnumber;
 GetComponent(GUIDisplay).enabled = true;
 yield MoveOn();
 }

//this function turns the GUI off on keypress, 
//so that it can be reloaded with the next value
function MoveOn(){
 while(GetComponent(GUIDisplay).enabled){
 if(Input.GetButtonDown("Skip"){
 GetComponent(GUIDisplay).enabled = false;
 }
 yield;
 }
}

Now, as I (mis)understand it, yielding the commands in Script 1 means that Script 1 will wait until each function is complete before moving to the next one. My problem is that I can't get Script 2 (especially the MoveOn function) to work. I can get an infinite loop(crash), or simply cycle through all three commands in Script 1 instantly. I have read in other posts that while loops need a yield to prevent infinite looping, but it seems to me that putting in a yield simply gives control back to Display(), defeating the purpose of the loop (i.e. waiting for a keypress before ending)

BTW, it works fine using yield WaitforSeconds, but I want the time to be set by the user (for slow readers!)

Any ideas what I'm missing here? Any commments much appreciated, and feel free to point out how little I know!

more ▼

asked Mar 01, 2012 at 12:42 AM

dav78 gravatar image

dav78
18 7 4 4

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

1 answer: sort voted first

Yeah, no. You should look for Input in an Update function, set whatever variables would indicate progress there, and use those in the OnGUI function to display which ever UI bits you want at that stage. OnGUI would 'wait' for the user to type something in, for example. I suppose you might use Yield and such to do such things, but it would not be 'best practice'

more ▼

answered Mar 01, 2012 at 12:49 AM

DaveA gravatar image

DaveA
33.4k 417 336 443

Thanks for your reply. I'm trying to do this using "global" coroutines, so that I can bring up the display I need with minimal trouble later (I will need to do this a lot). I tried setting some booleans in Update, and using these to signal the while loop to end but I still couldn't get it to work. Purely theoretically I can't see how while loops can ever work with yield, though it seems others have made them work.

Mar 01, 2012 at 12:26 PM dav78
(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:

x1568
x620
x512
x94

asked: Mar 01, 2012 at 12:42 AM

Seen: 2466 times

Last Updated: Mar 01, 2012 at 12:26 PM