我希望一个倒数计时器随着时间的计数而更快。" 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);
}