# Spawner - Final

This code includes updated code to: **`StopAllSpawning( )`** This method is executed within LevelManager, it destroys objects with Component of type: PickUp, ScorePickUp, Hazard, change to fix in your code so it is consistent.  It also stops any remaining SpawnPrefab methods waiting to be invoked. ***You may want to delete the MiniGameManager.cs script, otherwise fix any errors caused there.***

***Verify if this script needs to be added to the Spawner GameObject***

```java
using UnityEngine;

public class Spawner : MonoBehaviour {

    [Header("Set in Inspector")]
    public GameObject goodPrefab, badPrefab;

    public int pauseTime = 2; //wait 2 seconds before spawning, //adjust as needed for your game
    public int numToSpawn = 10;//adjust as needed for your game
    public float chanceToSpawnBad = .10f;//adjust as needed for your game
    public float xRange = 8.0f;//adjust as needed for your game
    public float yRangeTop = -2.0f; //adjust as needed for your game
    public float yRangeBottom = -3.5f;//adjust as needed for your game
    public bool activeSpawning = false;


    // Use this for initialization
    void Start() {
        //activeSpawning = true; ///remove later when we start spawning from another class
        //StartSpawning(); //remove later
    }

    public void StartSpawning()   //will be called from another class
    {
        for (int i = 0; i < numToSpawn; i++)
        {
            Invoke("SpawnPrefab", pauseTime * i * 2);
        }
    }

    /// <summary>
    /// Spawns one prefab:  good or bad with some probability of bad
    /// </summary>
    public void SpawnPrefab()
    {
        if (activeSpawning)
        {
            Vector3 position = transform.localPosition;
            position.x = Random.Range(-xRange, xRange);
            position.y = Random.Range(yRangeBottom, yRangeTop);
            float rand = Random.value; //returns value between 0.0 - 1.0 (property)
            GameObject prefab;
            if (rand < chanceToSpawnBad)
            {
                prefab = Instantiate(badPrefab, position, transform.rotation);    //instantiate bad
            }
            else  //instantiate good
            {
                prefab = Instantiate(goodPrefab, position, transform.rotation);
            }
            prefab.transform.SetParent(this.transform); //set Spawner as parent of prefabs in Hierarchy 
           // Debug.Log("Spawned 1");
        }
    } //end SpawnPrefab

    public void StopAllSpawning()
    {
        CancelInvoke("SpawnPrefab");
        activeSpawning = false;
        DestroySpawnedObjects();
    }
    
    void DestroySpawnedObjects()
    {
        PickUp[] items = FindObjectsOfType<PickUp>();
        foreach (PickUp item in items    )
        {
            Destroy(item.gameObject);
        }
        
        //if using scoreItems
        ScorePickUp[] scoreItems = FindObjectsOfType<ScorePickUp>();
        foreach (ScorePickUp scoreItem in scoreItems)
        {
            Destroy(scoreItem.gameObject);
        }

        Hazard[] hazards = FindObjectsOfType<Hazard>();
        foreach (Hazard hazard in hazards)
        {
            Destroy(hazard.gameObject);
        }
    } //end DestroySpawnedObjects
    
    ////used in Project 1: miniGameManager
    public void DestroyAllPickups()
    {
        PickUp[] items = FindObjectsOfType<PickUp>();
        foreach( PickUp item in items       )
        {
            Destroy(item.gameObject);
        }
    }
    
} //end of class
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kdoore.gitbook.io/cs2335/cs2335_f20/project-3-code-mods/project-3-code/class-code-examples/spawner-final.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
