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
相关产品推荐
相关产品推荐

