
I used array and random number generation skills to program this challenge where balls are randomly falling from the sky and you have to send your dog out to catch them before they hit the ground. To complete this challenge, I was required to make sure the variables are assigned properly, the if-statements are programmed correctly, the collisions are being detected perfectly, and that objects are being generated randomly.
Give the game a try in your browser at https://meta.dwdenney.com/challenge2/


Challenge Outcome:
- A random ball (of 3) is generated at a random x position above the screen
- When the user presses spacebar, a dog is spawned and runs to catch the ball
- If the dog collides with the ball, the ball is destroyed
- If the ball hits the ground, a “Game Over” debug message is displayed
- The dogs and balls are removed from the scene when they leave the screen
- Bonus – randomize the spawn interval
- Bonus – not allow user to spam launching dogs
C# Code Samples
public class MoveForwardX : MonoBehaviour
{
public float speed;
// Update is called once per frame
void Update()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnManagerX : MonoBehaviour
{
public GameObject[] ballPrefabs;
private float spawnLimitXLeft = -22;
private float spawnLimitXRight = 7;
private float spawnPosY = 30;
private float startDelay = 1.0f;
private float spawnInterval;
// Start is called before the first frame update
void Start()
{
spawnInterval = Random.Range(3, 5);
InvokeRepeating("SpawnRandomBall", startDelay, spawnInterval);
}
// Spawn random ball at random x position at top of play area
void SpawnRandomBall ()
{
// Generate random ball index and random spawn position
Vector3 spawnPos = new Vector3(Random.Range(spawnLimitXLeft, spawnLimitXRight), spawnPosY, 0);
int ballIndex = Random.Range(0, ballPrefabs.Length);
// instantiate ball at random spawn location
Instantiate(ballPrefabs[ballIndex], spawnPos, ballPrefabs[ballIndex].transform.rotation);
}
}
public class PlayerControllerX : MonoBehaviour
{
public GameObject dogPrefab;
private bool dogActive = false;
// Update is called once per frame
void Update()
{
// On spacebar press, send dog
if (Input.GetKeyDown(KeyCode.Space) && !dogActive)
{
Instantiate(dogPrefab, transform.position, dogPrefab.transform.rotation);
dogActive = true;
Invoke("restDog", 1);
}
}
void restDog()
{
dogActive = false;
}
}
public class DestroyOutOfBoundsX : MonoBehaviour
{
private float leftLimit = -30;
private float bottomLimit = -5;
// Update is called once per frame
void Update()
{
// Destroy dogs if x position less than left limit
if (transform.position.x < leftLimit)
{
Destroy(gameObject);
}
// Destroy balls if y position is less than bottomLimit
else if (transform.position.y < bottomLimit)
{
Destroy(gameObject);
}
}
}
public class DetectCollisionsX : MonoBehaviour
{
private void OnTriggerEnter(Collider other)
{
Destroy(gameObject);
}
}