Задача: при открытии игрового окна, начинается отсчёт времени, от 7 секунд до 0, при достижении 0 игровое окно закрывается, при этом отсчёт таймера должен сопровождаться звуком (тиканье часов).
Проблема: зацикливается звук. Сейчас реализация находится в Update, Как исправить ситуацию, что бы звук проигрывался раз в секунду в такт таймера и при этом не находился в условии Update ?
Код:
private bool isTimerActive = false;
private float currentTimer = 7;
void Update()
{
if (isTimerActive)
{
AudioManager.Instance.PlaySound(pointerAudioTimer, 1f); // аудио
currentTimer -= Time.deltaTime;
timerText.text = currentTimer.ToString ("#");
}
if(currentTimer <= 0)
Close();
}
public void Show() // Открытие окна
{
if (currentActive)
return;
isTimerActive = true; // определяет начало запуска таймера
}
Ответ
Не лучше ли будет запустить корутину в Show?
А так как нет особого смысла каждый кадр обновлять текст(зачем лишние перерисовки), то монжо раз в 100мс менять. Звук нужно 7 секунд крутить, значит будет 70 тиков.
public void Show() // Открытие окна
{
StartCoroutine(PlaySound());
}
private IEnumerator PlaySound()
{
int counter = 70;
// примерно 7 секунд будет длиться
while (counter > 0)
{
timerText.text = (counter / 10).ToString ("#");
if(counter % 10 == 0)
AudioManager.Instance.PlaySound(pointerAudioTimer, 1f); // аудио раз в секунду
// обновляем текст и запускаем звук каждые 100мс.
yield return new WaitForSeconds(0.1f);
counter--;
}
Close();
}
Единственное, я не знаю, как запуск звука у вас работает. Если AudioManager.Instance.PlaySound проигрывает звук один раз, то так. Если оно зацикленно проигрывает, то перед while запускайте, а после отключайте.
Комментариев нет:
Отправить комментарий