You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:27:08