Как я могу предотвратить запуск сопрограмм, когда он уже выполняется? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь заставить некоторые сигналы поворота работать на транспортном средстве, которое я строю в Unity, но я не могу заставить сопрограммы работать должным образом. Я прошел через несколько различных итераций и обновлений в моем коде, и я чувствую, что я довольно близок. Мне кажется, я понимаю, что проблема в том, что, как только я включаю сигнал поворота, он переходит в соответствующий блок кода оператора If, запускает сопрограмму, и эта часть великолепна. Но затем в следующем кадре он делает это снова, а затем снова в следующем кадре. Так что я думаю, что он постоянно перекрывает сопрограммы. Что я могу сделать, чтобы сообщить, что сопрограмма уже запущена, и если это так, не запускать ее снова? Имея в виду, что, чтобы остановить l oop сопрограмм, мне нужно было бы либо выключить сигналы поворота, либо переключиться на другой сигнал поворота ... Надеюсь, кто-то может помочь мне здесь. Я застрял на этом некоторое время.

 private void OperateTurnSignals()
{
    if (GetControlValueAsBool("LeftTurnSignal"))
    {
        StartCoroutine(LeftTurnSignalCoroutine());
    }
    else if (GetControlValueAsBool("RightTurnSignal"))
    {
        StartCoroutine(RightTurnSignalCoroutine());
    }
    else if (GetControlValueAsBool("Hazards"))
    {
        StartCoroutine(TurnOnHazards(LeftTurnSignals, RightTurnSignals));
    }
    else
    {
        StopAllCoroutines();
        TurnOffTurnSignals(LeftTurnSignals);
        TurnOffTurnSignals(RightTurnSignals);
    }
}

private IEnumerator TurnOnHazards(List<Light> leftTurnSignals, List<Light> rightTurnSignals)
{
    TurnOnTurnSignals(leftTurnSignals);
    TurnOnTurnSignals(rightTurnSignals);
    yield return new WaitForSeconds(1.0f);
    StartCoroutine(TurnOffHazards(leftTurnSignals, rightTurnSignals));
}

private IEnumerator TurnOffHazards(List<Light> leftTurnSignals, List<Light> rightTurnSignals)
{
    TurnOffTurnSignals(leftTurnSignals);
    TurnOffTurnSignals(rightTurnSignals);
    yield return new WaitForSeconds(1.0f);
    StartCoroutine(TurnOnHazards(leftTurnSignals, rightTurnSignals));
}

private IEnumerator LeftTurnSignalCoroutine()
{
    TurnOnTurnSignals(LeftTurnSignals);
    yield return new WaitForSeconds(1.0f);
    TurnOffTurnSignals(LeftTurnSignals);
    yield return new WaitForSeconds(1.0f);
    StartCoroutine(LeftTurnSignalCoroutine());
}

private IEnumerator RightTurnSignalCoroutine()
{
    TurnOnTurnSignals(RightTurnSignals);
    yield return new WaitForSeconds(1.0f);
    TurnOffTurnSignals(RightTurnSignals);
    yield return new WaitForSeconds(1.0f);
    StartCoroutine(RightTurnSignalCoroutine());
}

private void TurnOnTurnSignals(List<Light> turnSignals)
{
    foreach (Light light in turnSignals)
    {
        light.gameObject.SetActive(true);
    }
}

private void TurnOffTurnSignals(List<Light> turnSignals)
{
    foreach (Light light in turnSignals)
    {
        light.gameObject.SetActive(false);
    }
}
...