Сбой бесконечного цикла, но не в функции обновления - PullRequest
0 голосов
/ 17 мая 2018

Эти скрипты приводят к зависанию Unity.Что мне здесь не хватает?

Я знаю, что это, наверное, самый глупый вопрос, когда-либо рассматривавший, как Unity обрабатывает циклы.Но я клянусь, что я написал это раньше, и у меня получилось ...Я получаю, что цикл бесконечен, но он должен постоянно повторяться.

Timer.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Timer{
    float tickTime;
    float lastTicktime;
    bool timerRunning = false;

    public Timer (float tickTime) {
        this.tickTime = tickTime;
    }

    public void StartTimer() {
        timerRunning = true;
        lastTicktime = Time.time;
        GenerateTicks ();

    }

    public void StopTimer () {
        timerRunning = false;
    }

    void GenerateTicks () {
        while (timerRunning) {
            if ((Time.time - lastTicktime) > tickTime) {
                Debug.Log ("Tick");
                lastTicktime = Time.time;
            }
        }
    }
}

Реализация

Timer timer;
    void Start () {
        timer = new Timer (triggerTime);
        timer.StartTimer ();
}

1 Ответ

0 голосов
/ 17 мая 2018

Код никогда не может выйти из цикла while(timerRunning), так как вы никогда не выполняете timerRunning = false внутри указанного цикла.

Более того, даже если вы добавите timerRunning = false в раздел if ((Time.time - lastTicktime) > tickTime) { }, вызависание выполнения основного потока Unity до тех пор, пока это условие не станет true (в основном Unity остановлен, пока не пройдет хотя бы tickTime секунд).

Если вам нужно использовать таймер И позволить Unity исполниться,затем используйте сопрограммы.

Редактировать: чтобы ответить на ваш комментарий, измените код следующим образом:

using UnityEngine;
using System.Collections;

public class Timer {

    float tickTime;
    float lastTicktime;
    bool timerRunning = false;

    public Timer(float tickTime) {
        this.tickTime = tickTime;
    }

    public IEnumerator StartTimer() {
        timerRunning = true;
        lastTicktime = Time.time;
        while (timerRunning) {
            if ((Time.time - lastTicktime) > tickTime) {
                Debug.Log("Tick");
                lastTicktime = Time.time;
                timerRunning = false;
            }
            yield return null;
        }
    }
}

Реализация:

private Timer timer;
private IEnumerator timerCoroutine;

private void Start() {      
    timer = new Timer(triggerTime);
    timerCoroutine = timer.StartTimer();
    StartCoroutine(timerCoroutine);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...