2016-06-21 1 views
2

Я хочу, чтобы таймер обратного отсчета показывался быстрее, когда время отсчитывается. «тик» - очень короткий аудиоклип.Повторите аудио клип в Unity со все меньшими интервалами

У меня работает таймер, который вызывает playTickManager() каждый кадр.

Однако с этой реализацией при некоторых переходах отмены/повторного вызова промежуток между тиками является несогласованным или перекрывается, вызывая неестественное звучание.

Есть ли лучший способ реализовать это, не ускоряя фактический аудиоклип, тем самым поддерживая шаг и т. Д.?

// This is called every frame by the 'timer' script as it counts down to 0. 
// 'seconds' is a float. 

void playTickManager() 
{ 
    Debug.Log(seconds); 
    if (seconds >= 20 && tickPlaySpeed != 1) 
    { 
     InvokeRepeating("playTickAudio", 1f, 1f); 
     tickPlaySpeed = 1; 
    } 
    else if (seconds >= 16 && seconds < 20 && tickPlaySpeed != 2) 
    { 
     CancelInvoke("playTickAudio"); 
     InvokeRepeating("playTickAudio", 0f, .85f); 
     tickPlaySpeed = 2; 
    } 
    else if (seconds >= 12 && seconds < 16 && tickPlaySpeed != 3) 
    { 
     CancelInvoke("playTickAudio"); 
     InvokeRepeating("playTickAudio", 0f, .7f); 
     tickPlaySpeed = 3; 
    } 
    else if (seconds > 8 && seconds < 12 && tickPlaySpeed != 4) 
    { 
     CancelInvoke("playTickAudio"); 
     InvokeRepeating("playTickAudio", 0f, .55f); 
     tickPlaySpeed = 4; 
    } 
    else if (seconds >= 4 && seconds < 8 && tickPlaySpeed != 5) 
    { 
     CancelInvoke("playTickAudio"); 
     InvokeRepeating("playTickAudio", 0f, .4f); 
     tickPlaySpeed = 5; 
    } 
    else if (seconds > 0 && seconds < 3 && tickPlaySpeed != 6) 
    { 
     CancelInvoke("playTickAudio"); 
     InvokeRepeating("playTickAudio", 0f, .25f); 
     tickPlaySpeed = 6; 
    } 
    else if(seconds <= 0) 
    { 
     CancelInvoke("playTickAudio"); 
     tickPlaySpeed = 0; 
    } 
} 

void playTickAudio() 
{ 
    AudioSource.PlayClipAtPoint(tickAudio, gameObject.transform.position, 1f); 
} 
+0

Каков минимальный и максимальный обратный отсчет времени? Сколько секунд стоит первый тик? – Programmer

+0

min = 0, max - это все, что передается. Сценарий таймера просто выполняет следующее обновление: timeleft = timeleft-Time.timeDelta; playTickManager();» – mbka

+0

Важный момент здесь. @mbka ... никогда, *** КОГДА-ЛИБО ***, используйте «еще если» по какой-либо причине. Это похоже на использование «глобалов» в программном обеспечении - никогда не делайте этого. – Fattie

ответ

3

Это хороший шанс изучить очень распространенный образец.

Это «снова вызовите себя» образец в программном обеспечении.

Обратите внимание, что это очень, очень распространено в играх - особенно в каждом типе оружие использует шаблон «позвонить себе снова». (Короче говоря, вы не используете что-то вроде «invokeRepeating», так как вам нужно больше контроля над петлей обжига.)

Так попробуйте это ... преподавая пример:

private float gapToNext; 

private void ExcitingCountdown() 
    { 
    gapToNext = 2.5f; 
    PlayOneStep(); 
    } 

private void PlayOneStep() 
    { 
    if (gapToNext < 0.01f) return; 
    YourBeepSound.Play(); 
    gapToNext = gapToNext - 0.1f; 
    Invoke("ExcitingCountdown", gapToNext); 
    } 

Простые права?

Жизнь легче, когда вы знаете модели :)

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

Просто настроить значения в ExcitingCountdown, чтобы получить звучащий результат, который вы хотите.

private float gapToNext; 
private int safetyCounter; 

void Start() 
    { 
    ExcitingCountdown(); 
    } 

private void ExcitingCountdown() 
    { 
    gapToNext = 2.5f; 
    safetyCounter = 30; 
    PlayOneStep(); 
    } 

private void PlayOneStep() 
    { 
    if (gapToNext < 0.05f || safetyCounter<0) 
    { 
    Debug.Log("we're done...!"); 
    return; 
    } 

    YourBeepSound.Play(); 

    gapToNext = gapToNext * 0.85f; 
    --safetyCounter; 

    Debug.Log("gap is now " +gapToNext.ToString("f4")); 

    Invoke("ExcitingCountdown", gapToNext); 
    } 
+0

Итак, если я правильно понимаю ваш второй блок кода - каждый цикл, он уменьшает gapToNext на 15%, пока не достигнет <0.05f, а затем остановится. Таким образом, каждый интервал Beep на 15% меньше, пока он не закончится, или не завершил 30 итераций. Позвольте мне попытаться реализовать это и посмотреть, как я иду. – mbka

+0

@JoeBlow вам нужно по крайней мере 15 человек, чтобы проголосовать, однако теперь, когда я поддержал OP (это был достойный вопрос), он должен был это сделать сейчас. –

+0

Реализован этот @JoeBlow, и он работает. Благодаря ! Теперь у вас другая проблема с ссылкой на аудиокнигу, но я опубликую это в другом вопросе. – mbka