Kod tworzy za duzo obiektow niz powinien

0

Mam problem z kodem. Nie mam pojecia gdzie lezy blad. Tworze sobie gre z falami zombie, Ustalilem sobie ze co poziom ilosc_zombie = zabite*2 da kolejny poziom. Tylko ze pierwszy poziom działa tylko poprawnie. Drugi w polowie.Zmienna ilosc_zombie pokazuje poprawnie ile powinno byc teraz zombie a okazuje sie ze jest ich o wiele wiele wiecej. Dlaczego ?

void Update()
    {
        PoziomCheck();
        wave = gO.GetComponent<Stats>().wave;
       // ilosczombie = gO.GetComponent<Stats>().zombie;
        zabite = gO.GetComponent<Stats>().zabite_zombie;
        if(wave == 1)
        {
            if(tworz == true)
            {
                for (int i = 0; i < ilosczombie; i++)
                {
                    //InvokeRepeating("NowyZombie", 0.5f, 0.5f);
                    Invoke("NowyZombie", 2);
                    if(i <= ilosczombie)
                    {
                        tworz = false;
                    }
                }
            }
            
        }
        if (wave == 2)
        {
            gO.GetComponent<Stats>().wave = 2;
            if (tworz == true)
            {
                for (int i = 0; i < ilosczombie; i++)
                {
                    //InvokeRepeating("NowyZombie", 0.5f, 0.5f);
                    Invoke("NowyZombie", 2);
                    if (i <= ilosczombie)
                    {
                        tworz = false;
                    }
                }
            }

        }


        //InvokeRepeating("NowyZombie", 0.5f, 0.5f);
        //Invoke("NowyZombie", 5);
    }
    void PoziomCheck()
    {
        switch(zabite)
        {
            case 2:
                wave = 2;
                ilosczombie = zabite * 2;
                tworz = true;
                break;
            case 4:
                wave = 3;
                ilosczombie = zabite * 2;
                break;
            default:

                break;
        }
            
    }
0

Przemyślą tą logikę i ją uprość, bo strasznie namotane i błędogenne.

Nie musisz sprawdzać ilości zombie w pętli (Update()).
Zabity zombie może sam w momencie śmierci zgłaszać do managera, że został zabity.
Wtedy manager sobie odlicza zombiaka od licznika zombiaków utworzonych i sprawdza, czy fala się skończyła.
Jeśli fala się skończyła (zabito wszystkie zombie), to wtedy zaczyna się następna fala.

0

Tak wiem ze jest To nie przejrzyste i potrzebne sa poprawki. Pierw chce dojsc do tego by działało. A potem zaczac zmieniac kod.

1

Przerób sobie te tutoriale.

Może nie są jakieś PRO, ale akurat gra implementuje mechanikę, którą próbujesz osiągnąć.

onizuka napisał(a):

Tak wiem ze jest To nie przejrzyste i potrzebne sa poprawki. Pierw chce dojsc do tego by działało. A potem zaczac zmieniac kod.

Cóż... Dla mnie przerabianie takiego kodu jaki wkleiłeś to tortura.
Napisałem Ci jak zrobić to sprawniej.

0

Rozwiazalem w taki sposob

 private float TimeToWait = 4f;

    public int enemyCount = 0;
    public int waveNumber = 1;

    void Start()
    {
        gO = GameObject.Find("GameManager");
        zabite = 0;
        StartCoroutine(SpawnEnemyWave(waveNumber));
    }
    void Update()
    {
        // PoziomCheck();
        gO.GetComponent<Stats>().wave = waveNumber;
        if (enemyCount == 0)
        {
            waveNumber++;
            gO.GetComponent<Stats>().player_HP += 20;
            gO.GetComponent<Stats>().zombie_hp += 5;
            StartCoroutine(SpawnEnemyWave(waveNumber));
        }

        if (Input.GetMouseButtonDown(0))
        {
          //  enemyCount--;
        }
    }
    IEnumerator SpawnEnemyWave(int enemiesToSpawn)
    {
        
        for (int i = 0; i < enemiesToSpawn; i++)
        {
            enemyCount++;
        }

        yield return new WaitForSeconds(TimeToWait); 

        

        for (int i = 0; i < enemiesToSpawn; i++)
        {
            

            NowyZombie();
        }
    }
0

Stats mogłoby być polem w klasie GameManager.
Wtedy nie miałbyś pomysłów, żeby tyle razy wywoływać gO.GetComponent<Stats>().

Zwiększanie enemyCount w pętli powinieneś zastąpić enemyCount += enemiesToSpawn.

Ten Update() zmień na metodę wywoływaną przez wroga, kiedy ginie. Szkoda to wywoływać w każdej klatce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1