重复统一的音频剪辑,间隔越来越小



我希望一个倒数计时器随着时间的计数而更快。" tick"是一个很短的门lip。

我有计时器工作,该计时器调用playtickmanager()每个帧。

但是,通过这种实现,在取消/重新启动的某些过渡中,tick之间的差距是不一致或重叠的,导致不自然的发声tick。

是否有更好的方法可以在不加速实际的听波的情况下实施此操作,从而保持音高等?

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

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

这是'再次称呼自己,模式。

请注意,这在游戏中非常非常常见 - 尤其是每种类型的武器使用"再次称呼自己"。图案。(简而言之,您不使用" 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);
  }

最新更新