Цикл внутри сопрограммы - PullRequest
       0

Цикл внутри сопрограммы

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

Я написал следующий фрагмент, чтобы воспроизвести пять звуков щелчка, напоминающих вращающееся колесо.

Как сделать из него все oop, чтобы щелчки продолжались до тех пор, пока я не позвоню функция остановки внизу?

Я включил функцию l oop в каждом звуковом файле, но каждый из них по-прежнему воспроизводится только один раз ...

public void PlayClickSounds()
{
    StartCoroutine( ClickSounds(0.5f) );
}

private IEnumerator ClickSounds(float clipsGapDuration)
{
    Play(SpinningSoundClick1);
    yield return new WaitForSeconds(clipsGapDuration);                      
    Play(SpinningSoundClick2);
    yield return new WaitForSeconds(clipsGapDuration);
    Play(SpinningSoundClick3);
    yield return new WaitForSeconds(clipsGapDuration);
    Play(SpinningSoundClick4);
    yield return new WaitForSeconds(clipsGapDuration);
    Play(SpinningSoundClick5);
    yield return new WaitForSeconds(clipsGapDuration);
}

public void StopClickSounds()
{
    StopCoroutine( SpinningClickSounds(0.5f) );
}

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Вы должны использовать while l oop. Я не вижу ваших настроек, но вы должны также использовать список, например

[SerializeField] private List<AudioClip> _boostWheelSpinningSoundClicks = new List<AudioClip>();

private int _currentIndex;
private Coroutine _currentRoutine;

public void PlayClickSounds()
{
    if(_currentRoutine != null) 
    {
        Debug.LogWarning("Already playing");
        return;
    }

    _currentRoutine = StartCoroutine(ClickSounds(0.5f));
}

private IEnumerator ClickSounds(float clipsGapDuration)
{
    // This looks dangerous but is allowed in 
    // Coroutines as long as you yield somewhere inside
    while(true)
    {
        _currentIndex = (_currentIndex + 1) % _boostWheelSpinningSoundClicks.Count;

        var currentClip = _boostWheelSpinningSoundClicks[_currentIndex];
        Play(currentClip);
        yield return new WaitForSeconds(clipsGapDuration);                      
    }
}

public void StopClickSounds()
{
    if(_currentRoutine == null)
    {
        Debug.LogWarning("Not playing");
        return;
    }

    StopCoroutine(_currentRoutine);
}
1 голос
/ 18 февраля 2020

Существуют различные варианты того, как этого добиться. Вы можете использовать while l oop, вы можете вызвать сопрограмму из сопрограммы.

Это пример while.

private bool _isClipPlaying;
private IEnumerator ClickSounds(float clipsGapDuration)
{
    while(_isClipPlaying){
        Play(boostWheelSpinningSoundClick1);
        yield return new WaitForSeconds(clipsGapDuration);                      
        Play(boostWheelSpinningSoundClick2);
        yield return new WaitForSeconds(clipsGapDuration);
        Play(boostWheelSpinningSoundClick3);
        yield return new WaitForSeconds(clipsGapDuration);
        Play(boostWheelSpinningSoundClick4);
        yield return new WaitForSeconds(clipsGapDuration);
        Play(boostWheelSpinningSoundClick5);
        yield return new WaitForSeconds(clipsGapDuration);
    }
}

public void PlayClickSounds()
{
    _isClipPlaying = true;
    StartCoroutine( ClickSounds(0.5f) );
}

public void StopClickSounds()
{
    _isClipPlaying = false;
}

Другой вариант - вызвать сопрограмму после этого.

private IEnumerator ClickSounds(float clipsGapDuration)
{
    Play(boostWheelSpinningSoundClick1);
    yield return new WaitForSeconds(clipsGapDuration);                      
    Play(boostWheelSpinningSoundClick2);
    yield return new WaitForSeconds(clipsGapDuration);
    Play(boostWheelSpinningSoundClick3);
    yield return new WaitForSeconds(clipsGapDuration);
    Play(boostWheelSpinningSoundClick4);
    yield return new WaitForSeconds(clipsGapDuration);
    Play(boostWheelSpinningSoundClick5);
    yield return new WaitForSeconds(clipsGapDuration);
    StartCoroutine(ClickSounds(clipsGapDuration));
}

Я бы предложил использовать список для звуков щелчков, так как он будет более читабельным.

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