x


Yield after spawning object

Hey everyone,

I'm making a simple arcade-style collection game where apples fall and the player has to collect them. The apples fall from a random point (an array of empty gameObjects to simulate a tree), and then are supposed to wait a varying amount of seconds before dropping again.

I thought the code below would work, but the yield command seems to cause the method to not run (everything else runs fine). Of course, removing the yield command results in a million spheres spawning everywhere. Any suggestions? The method as I have it is supposed to spawn another apple in a time frame of 1 to 5 seconds, using Random.Range to select the specific pause length.

function Update () { 
makeApple();
yield WaitForSeconds(Random.Range(1, 5));
}

function makeApple(){
currentApple = Random.Range(0, apple.Length);
var newApple : GameObject = GameObject.CreatePrimitive(PrimitiveType.Sphere);
newApple.transform.position = apple[currentApple].transform.position;
newApple.AddComponent("Rigidbody");
}
more ▼

asked Aug 18 '12 at 08:19 AM

justinpatterson gravatar image

justinpatterson
40 1 3 5

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

1 answer: sort voted first

You cannot use yield WaitForSeconds in the update.

That is your problem. As you call the function in the update no matter what you shuld use a timer instead. See below:

function Update () { 
makeApple();
}

function makeApple(){
currentApple = Random.Range(0, apple.Length);
var newApple : GameObject = GameObject.CreatePrimitive(PrimitiveType.Sphere);
newApple.transform.position = apple[currentApple].transform.position;
newApple.AddComponent(Rigidbody);
var wait=Random.Range(1, 5); // Note this is giving 1 to 4. Range excludes the max value when using integers
yield WaitForSeconds(wait);
}

This is calling the function 60 or more time per second and each call is waiting but with:

var timer:float;
var wait:int;
function Start(){
  wait = Random.Range(0,5);
}
function Update(){
  timer+=Time.deltaTime;
  if(timer>wait){
    makeApple();
    wait = Random.Range(0,5);
    timer = 0;
  }
}

function makeApple(){
    currentApple = Random.Range(0, apple.Length);
    var newApple : GameObject = GameObject.CreatePrimitive(PrimitiveType.Sphere);
    newApple.transform.position = apple[currentApple].transform.position;
    newApple.AddComponent(Rigidbody);
    var wait=Random.Range(1, 5);
}

now the function is not called until timer reaches the value

more ▼

answered Aug 18 '12 at 08:23 AM

fafase gravatar image

fafase
10.5k 9 15 40

Thanks! That did the trick. So, it seems that my makeApple method wasn't abstracted from the update method enough; that is, it didn't have any conditionals before running to check the time so the yield didn't yield results.

Thanks again! Now to figure out the AI >_<

Aug 18 '12 at 01:21 PM justinpatterson
(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:

x1090
x571
x92
x15

asked: Aug 18 '12 at 08:19 AM

Seen: 1023 times

Last Updated: Aug 18 '12 at 01:21 PM