- Home /
Coroutine - events not working
I have spent endless nights, pulling my hair out a burning out my brain, why? Because I cannot seem to wrap my head round why my code will not work.
I am using a coroutine to enable an event to work.
I want a loading screen (a scene) to wait 5 seconds when it starts and to wait for the space bar to be pressed to actually load the next level... Please help me, I cannot stand my pain.
function start()
{
yield WaitForSeconds (5);
gameObject.Find("Continue").renderer.enabled = true;
gameObject.Find("Continue").renderer.material.color = Color.gray;
StartCoroutine("Do");
function Do(){
if
(Input.GetKeyDown(KeyCode.Space))
{
Application.LoadLevel("OpeningTutorialScene");
}
}
Do you have any Debug.Log() in your code? I would recommend putting one inside the Do function - to make sure it is actually looping and another inside your if statement - to see if it is detecting the key press.
Try this out (if you haven't already) and let me know the results.
Also i just thought, don't you have to yield in a coroutine? so it knows the location where it needs to restart?
if I yield coroutine, it will give me a bug over and over again...I cannot make debug as the scene will not run as the errors keep rushing up
This is how i would do it (i'm a C# person so i apologise if any of the syntax is slightly wrong):
function Do()
{
// a while loop so it will keep looping
while (true)
{
// a yield so it knows where to restart from (waits until the end of the frame)
yield WaitForEndOfFrame();
// check for input
if(Input.Get$$anonymous$$eyDown($$anonymous$$eyCode.Space)) {
Application.LoadLevel("OpeningTutorialScene");
}
}
}
Answer by Bunny83 · Jun 14, 2013 at 02:10 PM
This is what you need:
function Start()
{
yield WaitForSeconds (5);
var renderer = gameObject.Find("Continue").renderer;
renderer.enabled = true;
renderer.material.color = Color.gray;
while(true)
{
if (Input.GetKeyDown(KeyCode.Space))
{
Application.LoadLevel("OpeningTutorialScene");
}
yield;
}
}
btw: note that "Start" starts with a capital "S" or it won't work. "start" and "Start" is not the same thing.
$$anonymous$$any Thanks Bunny, and what is the difference - I would like to know as I want to gain as much knowledge as possible for coding.
Oops, just added code in, now it is freezing my unity and application in dev build when the 5 secs are over?
Sorry ;) forgot the yield inside the while loop ;) i've changed the code.
Answer by create3dgames · Jun 14, 2013 at 10:01 PM
Coroutines are tricky business sometimes. Try this method instead.
private var startTime : int = 0;
public var waitForSecondsTime : int = 0;
function Awake()
{
startTime = Time.time;
gameObject.Find("Continue").renderer.enabled = true;
gameObject.Find("Continue").renderer.material.color = Color.gray;
}
function Update ()
{
if (Time.time > startTime + waitForSecondsTime)
{
Do();
}
}
function Do()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Application.LoadLevel("OpeningTutorialScene");
}
}
Your answer
Follow this Question
Related Questions
Using Coroutine rather than Update to Check Whether Time Passed 1 Answer
[ANSWERED]Move object without Update or coroutine 2 Answers
Confused about using Update vs. Coroutines 2 Answers
What is the best approach? Coroutine or calculate the "Elapsed Time" in the Update? 3 Answers
Im a bit confused on a simple script 1 Answer