In challenge 2 of the Unity Create with Code course, we will create a game in which colored balls will fall from the sky while the player tries to catch the balls by spawning dogs that run across the screen. We will look at how to solve the individual problems and complete the challenge. Note that the first two steps are about setting up the project so we will be starting on step 3.
This guide is also available in video form shown below.
Navigate to the inspector tab for the spawn manager. You will see that the array "Ball Prefabs" contain dogs. This is causing the spawner to spawn dogs instead of balls. Replace the dogs with the balls and the spawner will work correctly.
This step is similar to step 3. Navigate to the inspector tab for the player character. You will see that the game object "Dog Prefab" contains the prefab for the green ball. This is causing the player to spawn balls instead of dogs. Replace the ball with the dog and we will have solved the problem.
This behavior is caused by the dog's collider being too big. We can edit the collider by going to the dog prefab and clicking edit collider. We then drag the box to be approximately the same size as the dog and that will solve the problem of the ball being destroyed from far away.
If we go to the script DestroyOutOfBounds, we can see that the code is there for destroying objects off of the screen. The problem is that the conditions in the if-statements are incorrect.
For the first condition for destroying dogs, the condition checks whether a dog's x position is larger than 30. However, if we run our project and click on a dog, we see that its x position is decreasing and x = -30 is around where the dog leaves the screen. So we change the condition to be less than -30, rather than the original greater than 30.
If we run our project and click on a ball, see the that the y value of the ball is decreasing as the ball drops. In the if-statement, an object's z position is used. Simply change the z position to y position and balls will be destroyed properly.
In the spawn manager script, we see that the instantiate function is always spawning ballPrefabs, which will be whatever color ball that you put in the first position of the array in step 3. We want to randomize the index we access and we can use the Random.Range method for that. Random.Range(0,2) will randomly generate 0, 1, or 2, which is what we need.
The spawn interval can also be randomized like in the step above. However, we will need to change the InvokeRepeating method as well. Instead of using InvokeRepeating, which will continue to call a function at the interval initially assigned, we can use Invoke and put it in the SpawnRandomBall method. Every time a ball spawn, a randomized timer will also start which will call the method again after a few seconds.
There are a few ways to solve this problem. The most intuitive is probably adding a timer that starts when the player spawns a dog and locking out the player from spawning another dog until that timer is up. To do this, we will create a new variable and set this variable to 1 (for a 1 second cooldown) every time we spawn a dog. In each update call we will also decrement this variable if its positive by the time that has since the last frame. Finally, we will add a condition that ensures this variable is 0 or below before we allow a dog to spawn.
We have now completed challenge 2 and became more familiar with the Unity editor. We also worked with arrays and random numbers, both will come handy as you continue to program and make games.