我希望倒数计时器随着时间倒计时更快地打勾。 '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);
}
答案 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);
}