Unity падает, когда программа в последний раз проходит через WaitForSeconds - PullRequest
0 голосов
/ 22 апреля 2020

У меня странная проблема. Мой код работает нормально. Все работает как надо, пока не пройдет последний раз через foreach l oop. Код:

public List<string> waveInput = new List<string>(); //die Eingabe der Welle als Zeichenfolge
public List<GameObject> enemyTyps = new List<GameObject>();
public List<Vector3> path = new List<Vector3>();
public GameObject tempPathStart;
public int currentWave = 0;
public int currentAmountOfEnemies;

private int spawnAmountOfEnemies;
private double spawnDelay;
private List<GameObject> enemyToSpawn = new List<GameObject>();

void Start() {
    path.Add(tempPathStart.transform.position);
    StartCoroutine(function());
}

IEnumerator function() {

    while(waveInput.Capacity >= currentWave) {

        if(waveInput[currentWave] == "" && currentAmountOfEnemies <= 0) {
            currentWave++;
            enemyToSpawn.Clear();
            spawnAmountOfEnemies = 0;
        } else if(currentAmountOfEnemies <= 0) {
            string _substring = waveInput[currentWave].Substring(0, waveInput[currentWave].IndexOf(";") + 1);
            ManageSubstring(_substring);

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

                foreach(GameObject element in enemyToSpawn) {
                    this.SpawnEnemy(element);
                    yield return new WaitForSeconds((float)spawnDelay);
                }
            }
        }
    }
}

void ManageSubstring(string _substring) {
    string _tempStringAmount = "";
    string _tempStringDelay = "";
    string _tempStringType = "";
    bool _switchAmountDelay = false;

    for(int i = 0; i < _substring.Length; i++) {
        char c = _substring[i];

        if(c >= '0' && c <= '9') {

            if(_switchAmountDelay) {

                _tempStringDelay += c;
            } else {
                _tempStringAmount += c;
            }
        } else if(c == ';') {

        } else if(c == '.') {
            _tempStringDelay += c;
        } else {
            _switchAmountDelay = true;
            _tempStringType += c;
        }
    }
    spawnDelay = double.Parse(_tempStringDelay);
    spawnAmountOfEnemies = int.Parse(_tempStringAmount);

    foreach(char c in _tempStringType) { //die Buchstaben in GameObjekte / Gegner umwandeln
        int _tempConvertedInt = TranslateStringToInt(c);
        enemyToSpawn.Add(enemyTyps[_tempConvertedInt]);
    }
}

int TranslateStringToInt(char pToConvertChar) {
    List<char> _alphabet = new List<char>() {'a','b','c','d','e','f','g','h','i','j','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    return _alphabet.IndexOf(pToConvertChar);
}

void SpawnEnemy(GameObject prefab) {
    currentAmountOfEnemies++;
    GameObject e = Instantiate(prefab) as GameObject;
    e.transform.position = path[0];
}

очень странная вещь, как я уже сказал: код работает, даже строка работает нормально, пока не пройдет в последний раз. Затем Unity падает, и я понятия не имею, что мне делать. Если для контекста требуется больше кода, просто скажите.

Спасибо за каждый ответ!

1 Ответ

0 голосов
/ 23 апреля 2020

Я только что вытащил ваш скрипт в отладчик и прошел последнюю итерацию:

Когда итерация закончена, она возвращается в while () l oop, который охватывает все тело function()* нулевой элемент, который не является "", и счет врага еще не был сброшен.

условие else if(currentAmountOfEnemies <= 0) также ложно, поскольку текущая сумма не была сброшена. больше ничего пока l oop, ничего не изменилось, у вас есть бесконечный l oop, который никогда не достигнет доходности. Это блокирует цикл обновления () Unity и позволяет только убивать.
...