Unity C#节奏循环异常:高Tempo(120)下无法稳定触发Beat函数
Unity节奏循环稳定触发问题修复方案
原代码的核心问题
- 整数除法陷阱:如果
Tempo是int类型,60 / Tempo会执行整数除法。当Tempo=120时,计算结果为0,导致BeatTime永远大于0,Beat()会被疯狂调用,这就是你遇到的异常。 - 累积误差与丢拍:仅用单次减法重置
BeatTime,当帧率波动(比如掉帧)时,BeatTime可能远超节拍间隔,此时只触发一次Beat()会丢失本该触发的节拍;多次加减后,时间误差会累积,导致节拍逐渐偏移。
修复后的代码
// 将Tempo设为float类型,避免整数除法问题 public float Tempo = 120f; private float BeatInterval; private float BeatTime; void Start() { // 提前计算节拍间隔,避免每帧重复计算 BeatInterval = 60f / Tempo; } void Update() { BeatTime += Time.deltaTime; // 用while循环处理掉帧时的多节拍触发,同时修正BeatTime while (BeatTime >= BeatInterval) { Beat(); BeatTime -= BeatInterval; // 可选:防止极端情况(如暂停后恢复)导致BeatTime溢出 if (BeatTime > BeatInterval * 2) { BeatTime = BeatTime % BeatInterval; } } } void Beat() { // 你的节拍触发逻辑 }
关键优化点
- 把
Tempo改为float类型,确保60f / Tempo是浮点数运算,得到正确的节拍间隔(120BPM时为0.5秒)。 - 在
Start()中提前计算BeatInterval,减少每帧的计算开销。 - 用
while替代if,确保掉帧时不会丢拍——比如某帧deltaTime为1秒时,120BPM下会触发2次Beat()。 - 增加溢出保护,避免暂停游戏后
BeatTime累积过大,恢复时一次性触发大量节拍。
内容的提问来源于stack exchange,提问作者Super-Robot14
相关产品推荐
相关产品推荐

