Время печати в Debug.log с сопрограммой не работает, как я думал - PullRequest
0 голосов
/ 23 февраля 2020

Новое в программировании в C# и Unity. Мне пришлось немного поработать с сопрограммами и немного поиграть. Я думал, что код будет регистрировать время каждые 2,0 секунды, как указано параметром, но печатает его намного больше! Код stopCoroutine работает нормально. Может кто-нибудь объяснить мне, почему это происходит, пожалуйста.

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
    private bool _stopCoRoutine;

    private IEnumerator CoRoutine()
    {
        while (!_stopCoRoutine)
        {
            Debug.Log(Time.time.ToString("F2"));
            yield return new WaitForSecondsRealtime(2.0f);
        }
    }

    // Use this for initialization
    private void Start()
    {
    }

    // Update is called once per frame
    private void Update()
    {
        StartCoroutine(CoRoutine());

        if (Input.GetKeyDown(KeyCode.Space))
        {
            _stopCoRoutine = true;
        }
    }
}

Криспи

Ответы [ 3 ]

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

Я понимаю это;) Странно то, что когда я помещаю его в оператор if {}, он работает так, как я думал, что он будет работать, и сценарий по-прежнему может выполнять код, который следует после оператора if {}.

> private void Update()
>     {
>         if (Input.GetKeyDown(KeyCode.Keypad0))
>         {
>             StartCoroutine(PrintTotalTime());
>         }
> 
>         if (Input.GetKeyDown(KeyCode.Space))
>         {
>             StopPrintTotalTime();
>             StartCoroutine(SpeedUp());
>         }
>     }

Здесь он запускается и регистрируется каждые 2 секунды и останавливается при запуске другого. Это потому, что как только он начинается в операторах if {}, он остается там до тех пор, пока не остановится?

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

нашел способ предотвратить запуск новых сопрограмм! Возможно, очень глупо, но я многому научился, делая все это! Нуб чувствует себя счастливым:)

private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Keypad0) && !_0pressedAlready)
        {
            _0pressedAlready = true;
            StartCoroutine(PrintTotalTime());
        }

        if (Input.GetKeyDown(KeyCode.Space) && !_spacePressedAlready)
        {
            _spacePressedAlready = true;
            StopPrintTotalTime();
            StartCoroutine(SpeedUp());
        }
    }
0 голосов
/ 23 февраля 2020

Вы запускаете новую сопрограмму в каждом кадре. Вы должны позвонить StartCoroutine(CoRoutine()); на Start()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...