• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Coroutine, Unity

Object Storage Arubacloud
0 głosów
90 wizyt
pytanie zadane 15 grudnia 2023 w C# przez Rais3n Nowicjusz (160 p.)

Cześć, mam mały problem z wykorzystaniem coroutine. Wykorzystuję ją w proceduralnym generowaniu świata (takim jak mineraft). 

IEnumerator VisualizeChunks()
{
    while (chunksToVisualizeList.Count > 0)
    {
        Debug.Log("1");
        AddNewBlocksToArray(chunksToVisualizeList[0].xGlobalPos / 6, chunksToVisualizeList[0].zGlobalPos / 6);
        
        while (chunksToVisualizeList.Count > 1)
        {

            Debug.Log("Elementy: " + chunksToVisualizeList.Count);
            AddNewBlocksToArray(chunksToVisualizeList[1].xGlobalPos / 6, chunksToVisualizeList[1].zGlobalPos / 6);
            chunksToVisualizeList[0].VisualizeChunk();
            chunksToVisualizeList.RemoveAt(0);
            Debug.Log("2");
            yield return null;
        }
        Debug.Log("3");
        Debug.Log("elementy: " + chunksToVisualizeList.Count);
        chunksToVisualizeList[0].VisualizeChunk();
        chunksToVisualizeList.RemoveAt(0);
        yield return null;
    }
    Debug.Log("koniec");
}

Problem polega na tym, że po wykonaniu ostatniej linijki w pętli nadrzędnej, liczyłem że zawsze będzie się wznawiać w tej linijce (czyli sprawdzac warunek w while czy lista niepusta).
Z jakiegoś powodu konsola wyrzuca mi ArgumentOutOfRangeException.
Ostatnie 5 linijek w konsoli to:
3
elementy: 1
3
elementy: 0
Error
Byłbym wdzięczny gdyby ktoś mi wyjaśnił gdzie popełniam błąd
 

komentarz 16 grudnia 2023 przez Rais3n Nowicjusz (160 p.)

Postanowiłem nieco zmodyfikować kod, dla prostszego zrozumienia mojego konceptu.
 

public class World2 : MonoBehaviour
{
    private List<int> lista = new List<int>();

    private void Start()
    {
        for(int i = 0; i < 6; i++)
            lista.Add(i);
    }
    private void Update()
    {
        StartCoroutine("Test");
    }
    IEnumerator Test()
    {
        while (lista.Count > 0)
        {
            Debug.Log("liczba elementow w liscie: " + lista.Count);
            Debug.Log("1");

            while (lista.Count > 1)
            {
                lista.RemoveAt(0);
                Debug.Log("2");
                yield return null;
            }
            Debug.Log("3");
            lista.RemoveAt(0);
            yield break;
        }

    }
}

No i wg mnie powinno to działać w nastepujacy sposob:
wypisuje liczbe el. listy
wypisuje "1"
Dalej w tej samej klatce usuwa pierwszy element listy i wypisuje "2"
W drugiej i kolejnych 3  klatkach (az do 5 klatki) powinien wypisywać "2" i usuwać pierwszy element listy
w 6 klatce powinien wypisac "3" usunac pierwszy element listy, (ktory jest już jedynym elementem listy) i korutyna powinna się zresetować, czyli rozpocząc ponownie opisany wyżej proces, gdy lista bedzie niepusta.
Ale tak nie działa, a konsola wypisuje mi coś takiego:

liczba elementow w liscie: 6
1
2

liczba elementow w liscie: 5 <--- i tutaj już kod działa nie tak jak chce, bo dla mnie ta linijka powinna się nie wypisać i zamiast niej powinno być wypisanie: "2" i usniecie pierwszego elementu listy

1
2
2

liczba elementow w liscie: 3
1
2
2
3
3
Error 

Zakładam, że źle rozumiem jak działaja yield, no ale próbowałem na różne sposoby i nic nie wyszło (, a w każdym razie nie tak jak chciałem).
 

 

1 odpowiedź

0 głosów
odpowiedź 16 grudnia 2023 przez womecm Nowicjusz (180 p.)
Typowe "Out of bounds", Indeksy / Adressy czy jak to byś nazwał zaczynają się o 0 a kończą na N-1, czly jak masz tablicę o 10 elementach masz indeksy 0 1 2 3 4 5 6 7 8 9 ale już nie 10, jeśli wykonasz operacje na indeksie 10 którego nie posiadasz... cóż zależnie od tego gdzie i w czym pracujesz otrzymasz różne nagrody, w przypadku Unity jest to tylko error w konsoli.

Zwyczajnie próbujesz się odwołać do indeksu tablicy który nie istnieje... W którym miejscu? A cóż to już tego ci nie powiem, po prostu nie chce mi się czytać i rozumieć twojego kodu :P ale przynajmniej wiesz co jest przyczyną błędu...

Podobne pytania

0 głosów
0 odpowiedzi 127 wizyt
pytanie zadane 15 grudnia 2020 w C# przez kubaa322 Użytkownik (710 p.)
0 głosów
2 odpowiedzi 175 wizyt
pytanie zadane 16 grudnia 2023 w C# przez Rere Nowicjusz (120 p.)
0 głosów
1 odpowiedź 212 wizyt
pytanie zadane 9 listopada 2023 w C# przez Rais3n Nowicjusz (160 p.)

92,656 zapytań

141,546 odpowiedzi

319,987 komentarzy

62,025 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...