Unity中如下写法的for循环能否作为计时器使用?
Unity计时器代码问题解答
你这段代码既实现不了每秒递增计数,也做不到正常逐帧计时,本质是完全不符合Unity运行逻辑的错误写法,运行后会直接卡死Unity主线程,核心问题如下:
- 首先,C#的
for循环是同步执行逻辑,只要你把这段代码写在Unity主线程调用的方法里(比如Start、Update),整个循环会在单个帧的时间片内全部执行完毕,根本不会跨帧等待。Time.deltaTime的值只有在引擎每帧更新阶段才会刷新,你单帧内跑完整段循环时,取到的Time.deltaTime永远是当前帧的固定值,不会随现实时间推进变化。 - 其次,你全程用
int整数类型做运算,存在数值截断bug:Minute是int类型的60,Minute / 60走整数除法逻辑,结果固定为1;后续你给int类型的Second加1 * Time.deltaTime时,Time.deltaTime是0~1之间的浮点数(正常帧率下大概0.016左右),C#隐式转int时会直接截断小数部分,相当于每次循环Second实际加的是0,永远满足Second < Minute的循环条件,直接触发无限死循环,占满主线程导致Unity未响应。 - 就算你把所有变量都改成float浮点数,单帧跑完整个for循环的逻辑也不对——相当于一帧内就把
Second从1累加到60,瞬间走完1分钟的计时,完全没有等待时间流逝的效果。
Unity里实现1分钟计时器的正确写法参考,核心逻辑是把计时变量存在方法外,每帧只累加一次时间间隔:
float timer = 0; void Update() { timer += Time.deltaTime; if (timer >= 60) { timer = 0; // 到点后要执行的逻辑写在这里 Debug.Log("计时1分钟结束"); } }
针对你最开始问的计数频率问题:符合规范的Time.deltaTime计时器是逐帧触发累加的,每次加的是两帧之间的真实时间差,最终累加的总时长和现实时间完全一致,不会受帧率波动影响;如果要做每秒跳一次的显示效果,只要在累加值跨过整数秒的时候刷新UI就行,不需要强行让计数逻辑每秒才执行一次。
内容的提问来源于stack exchange,提问作者user19326604
相关产品推荐
相关产品推荐

