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

Unity C#计算异常:FixedUpdate中Debug.Log输出重复问题排查

问题排查与解决方案

1. 日志显示“次数异常”是Unity Console的折叠机制导致的

你看到的Tran值重复显示、LevelLoad仅单次显示的现象,并非代码执行次数不一致,而是Unity Console的默认行为:

  • 当连续多次输出完全相同的字符串内容时,Console会自动折叠重复日志,在日志末尾标注重复次数(比如Tran: 1 (2)),看起来像是打印了两次;
  • 而LevelLoad对应的Time.timeSinceLevelLoad每次调用都会生成不同数值,每条日志都是唯一的,不会被折叠,因此看起来只打印了一次。
    实际代码中,FixedUpdate每次调用时,两行Debug.Log都会同步执行,次数完全一致。

2. Tran值计算异常的核心原因:整数除法陷阱

你的计算式Mathf.Min(Time.timeSinceLevelLoad * (1 / movementSpeedTransitionLength), 1)存在整数除法问题:

  • 已知movementSpeedTransitionLength = 20,如果这个变量是int类型,那么1 / 20会执行整数除法,结果为0,而非预期的0.05f;
  • 这会导致Time.timeSinceLevelLoad * 0始终为0,仅在少数特殊时机(比如浮点数精度触发的意外转换)才会得到正确值,这就是你看到“每隔一次输出才达到1”的根本原因。

修复方案

  • 修正除法运算:将其中一个操作数转为浮点数,确保执行浮点除法,两种写法均可:
    // 写法1:将1转为浮点数
    Debug.Log("Tran: " + Mathf.Min(Time.timeSinceLevelLoad * (1f / movementSpeedTransitionLength), 1));
    // 写法2:直接用除法简化逻辑
    Debug.Log("Tran: " + Mathf.Min(Time.timeSinceLevelLoad / movementSpeedTransitionLength, 1));
    
  • 统一变量类型:确保movementSpeedTransitionLength是float类型(赋值时添加f后缀,比如20f),避免后续再次触发整数除法问题。

额外说明

FixedUpdate的调用频率由Time.fixedDeltaTime控制(默认0.02秒一次),20秒后Time.timeSinceLevelLoad / 20的结果会等于或大于1,此时Mathf.Min会稳定返回1,修复后就不会再出现波动的低值。

内容的提问来源于stack exchange,提问作者Cyklon 3000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:45:34