在Unity中重复音频剪辑,间隔越来越小

时间:2016-06-21 12:12:19

标签: unity3d timer

我希望倒数计时器随着时间倒计时更快地打勾。 'tick'是一个非常短的音频剪辑。

我有定时器工作,每帧调用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);
}

1 个答案:

答案 0 :(得分:3)

这是学习非常常见模式的好机会。

这是 &#34;在软件中再次调用自己&#34; 模式。

请注意,这在游戏中非常常见 - 特别是每种类型的武器使用&#34;再次自己调用&#34;图案。 (简而言之,你不会使用类似&#34; invokeRepeating&#34;因为你需要更多控制触发循环。)

所以试试这个...教学示例:

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);
  }