Simple Spawner
Script Component to spawn PickUp Prefab gameObjects.
Objects to Spawn - PickUp Prefabs
PickUp Prefabs to be Spawned in the MiniGame should have the following configuration: See PickUp PreFabs
PickUp GameObjects should be a PreFab
A SpriteRenderer Component
At least 1 Collider2D component with IsTrigger set to true (can have additional nested Collider2D components if necessary)
A PickUp script component, with the public attributes like: value, type set in the inspector.
GameObject: Tag: "Collectible" or "Hazard"
Can have a Rigidbody2D if the spawned object will be moving
Can have an Animator component if the object will be animated
Important: The PickUp Prefabs must have Tag that corresponds to Tags in OnTriggerEnter2D( ).
Simple Spawner Logic
Logic Overview: Define variables that can be customized for each instance of a Spawner:
Specify PickUp prefabs to spawn ( good, bad )
Specify total number of prefabs to spawn (numToSpawn)
Specify probability of bad prefabs to spawn. (chanceToSpawnBad)
Constrain where objects will be spawned. (xRange, yRange)
Determine time between spawning objects (pauseTime)
Define boolean variable that can toggle: (stop, start) spawning
Spawner Methods, Helper Methods
Start Spawning:
SpawnPrefab( )
private method, executed in a loop in
StartSpawning( )
spawns 1 prefab instance - with some probability of it being good / bad type
will only spawn a prefab if
activeSpawning
is true;
StartSpawning ( )
public method to be executed in MiniGameManager
For testing, we'll start with calling this in
Start( )
- we'll remove this code laterhas a loop that invokes
SpawnPrefab( )
multiple times with delays
Stop Spawning:
DestroyAllSpawnedObjects( )
Creates Array of PickUps by Finding all items of type
< PickUp >
in the scene
StopAllSpawning( )
Cancels all Invoked
SpawnPrefab( )
methodsSets activeSpawning to false;
Executes DestroyAllSpawnedObjects( )
Important Spawner GameObject Configuration Details:
When initializing the Inspector Panel for Spawner Component: 1. Delete all PickUp Prefab gameObjects from the Scene 2. Select Original Prefab from Assets: GoodPrefab, BadPrefab (from the Assets tab) see image below


Spawner.cs
The code below creates a simple spawner.
Create a C# Script in your project Assets: Spawner.
Double-click the script so that it opens in Visual Studio.
Add the code from below to the script.
In Visual Studio, build to compile the script.
In Unity, Add the Spawner.cs component to an empty GameObject, Spawner in the scene.
//Sept 17, 2020
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spawner : MonoBehaviour
{
[Header("Set in Inspector")]
public GameObject goodPrefab, badPrefab;
public bool activeSpawning = false;
[SerializeField]
int pauseTime = 2; //may need to customize for your game
[SerializeField]
int numToSpawn = 10; //customize as needed
[SerializeField]
float chanceToSpawnBad = 0.10f; //modify as needed
[SerializeField]
float xRangeLeft = -8.0f; //customize as needed
[SerializeField]
float xRangeRight = 8.0f; //customize as needed
[SerializeField]
float yRangeTop = -2.0f; //customize as needed
[SerializeField]
float yRangeBottom = -3.5f; //customize as needed
// Start is called before the first frame update
void Start()
{
activeSpawning = true; //remove this code later
StartSpawning(); //remove this code later, move to MiniGameManager
}
///Will be exectued in MiniGameManager when startButton clicked
//MiniGameState is set to active
public void StartSpawning()
{
Debug.Log("Start Spawning called");
//Loop generates multiple delayed invocations of SpawnPrefab( ) method.
for (int i = 0; i < numToSpawn; i++)
{
Invoke("SpawnPrefab", pauseTime * i * 2); //Delays between SpawnPrefab( ) exection
}
}
//Executed from the StartSpawning method
//Many instances of this method will be invoked
void SpawnPrefab()
{
if (activeSpawning) //won't actually spawn anything unless this is true
{
//Where to spawn based on transform of Spawner gameObject
Vector3 position = transform.localPosition;
position.x = Random.Range(xRangeLeft, xRangeRight);
position.y = Random.Range(yRangeBottom, yRangeTop);
float rand = Random.value;
GameObject prefab; //temp variable
if (rand < chanceToSpawnBad)
{ //spawn bad prefab
prefab = Instantiate(badPrefab, position, transform.rotation);
}
else //instantiate good one
{
prefab = Instantiate(goodPrefab, position, transform.rotation);
}
prefab.transform.SetParent(this.transform); //all spawned objects will be children of the Spawner gameObject
}
}//end SpawnPrefab
//This will be executed from MiniGameManager
public void StopAllSpawning()
{
CancelInvoke("SpawnPrefab"); //cancels all SpawnPrefab( ) methods waiting to be executed
activeSpawning = false;
DestroySpawnedObjects();
}
//Exectued in StopAllSpawning
private void DestroySpawnedObjects()
{
PickUp[] items = FindObjectsOfType<PickUp>();
foreach (PickUp item in items)
{
Destroy(item.gameObject);
}
}
}// end class Spawner
Last updated
Was this helpful?