Jump to content
Unity Insider Forum

Spawner spawnt keine Gegner mehr


ShV

Recommended Posts

Ich habe die folgenden Scripts:

public class GameOver : MonoBehaviour
{
   
 
    public Text Highscore;
    public GameObject Player;
    public GameObject Spawner;
    public GameObject Restart;
    public void Start()
    {
 
    }
    private void OnTriggerEnter2D(Collider2D other)
    {
        if(other.tag == "Gegner")
        {
            PlayerPrefs.SetInt("Highscore", Zähler.currentscore);
            
            Debug.Log("Highscore");
            Zähler.currentscore = 0;
            Spawner.SetActive(false);
            Player.SetActive(false);
            Restart.SetActive(true);
        }
        
    }
   
}
public class Spawner : MonoBehaviour
{
    public GameObject[] Gegner;
    public List<GameObject> GegnerToSpawn = new List<GameObject>();

    int index;

    private void Awake()
    {
        IniGegner();
    }
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(SpawnRandomGegner());
    }
    void IniGegner()
    {
        index = 0;
        //Initialisiere die Gegner
        for (int i = 0; i < Gegner.Length * 10; i++)
        {
            GameObject obj = Instantiate(Gegner[index], transform.position, Quaternion.identity);
            GegnerToSpawn.Add(obj);
            GegnerToSpawn[i].SetActive(false);
            index++; 

            if (index == Gegner.Length)
            {
                index = 0;
            }
        }
    }
    // Update is called once per frame
    void Update()
    {
        
    }
    IEnumerator SpawnRandomGegner()
    {
        //Warte eine gewisse Zeit
        yield return new WaitForSeconds(Random.Range(1.5f, 4.5f));
        //Aktiviere Gegner
        int index = Random.Range(0, GegnerToSpawn.Count);

        while(true)
        {
            if(!GegnerToSpawn[index].activeInHierarchy)
            {
                GegnerToSpawn[index].SetActive(true);
                GegnerToSpawn[index].transform.position = transform.position;
                break;
            }
            else
            {
                index = Random.Range(0, GegnerToSpawn.Count);
            }
        }
        StartCoroutine(SpawnRandomGegner());
    }
    
}
public class Restart : MonoBehaviour
{
    public GameObject spawner;
    public GameObject Player;
    public GameObject Restart1;
    

    // Update is called once per frame
    void Update()
    {
        if (CrossPlatformInputManager.GetButtonDown("Restart"))
        {
            Neu();
        }
    }
    public void Neu()
    {
        Player.SetActive(true);
        spawner.SetActive(true);

        Restart1.SetActive(false);
    }
}

Aber wenn ich den Restart-Button gedrückt habe, wird zwar der Spawner wieder aktiviert, aber die Gegner nicht. Woran liegt das?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe nur kurz drüber geschaut, aber ich denke die Start() Methode des Spawners wird nicht mehr durchlaufen und damit wird die Co-Routine nicht neu gestartet.
Vermutlich sollte es reichen wenn du die Co-Routine in der OnEnable()-Methode wieder neu startest.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe im Spawnerscript jetzt folgendes hinzugefügt:

void Update()
    {
        if (CrossPlatformInputManager.GetButtonDown("Restart"))
        {
            StartCoroutine(SpawnRandomGegner());
        }

    }

Es funktioniert aber trotzdem nicht. Was kann ich machen, damit es funktioniert?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da könnte der Spawner ggf. noch gar nicht aktiviert sein und daher die "Restart"-Eingabe ins Leere laufen...

Lass den Code mal so wie er war und versuch mal folgendes:

    private void Awake()
    {
        IniGegner();
    }
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(SpawnRandomGegner());
    }
    // Reactivates the coroutine after GO was disabled
    void OnEnable()
    {
        StartCoroutine(SpawnRandomGegner());
    }


Ansonsten füge mal ein Debug.Log in den Code ein, um zu schauen ob die Co-Routine läuft:

 IEnumerator SpawnRandomGegner()
    {
        //Warte eine gewisse Zeit
        yield return new WaitForSeconds(Random.Range(1.5f, 4.5f));
        //Aktiviere Gegner
        Debug.Log("Coroutine is trying to spawn next enemy ...");
        int index = Random.Range(0, GegnerToSpawn.Count);

        while(true)
        {
            if(!GegnerToSpawn[index].activeInHierarchy)
            {
                GegnerToSpawn[index].SetActive(true);
                GegnerToSpawn[index].transform.position = transform.position;
                Debug.Log("Coroutine spawned enemy at " + transform.position);
                break;
            }
            else
            {
                index = Random.Range(0, GegnerToSpawn.Count);
            }
        }
        StartCoroutine(SpawnRandomGegner());
    }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...