1、时间冻结遇上卡顿,战斗表现与逻辑脱节
1.1 做法设定
- 时间冻结:
Time.timeScale = 0
- 冻结与恢复的控制:用UnScaledFrameTimer执行
- 战斗逻辑:用ScaledFrameTimer驱动
- 冻结效果:当前施法的单位正常行动,其他单位冻结
- 逻辑与表现匹配方式:完整的逻辑帧中减去冻结的帧数,当前表现的TML忽略TimeScale正常播放
- TML基于时间播放:其本身有追帧效果
1.2 脱节问题点与现象
- 时间冻结恢复的那帧,卡住了(比如2s)。卡多久会脱节多久,最大上限为冻结的时长。
- Unity冻结恢复的那一帧,
deltaTime
还是0 - TML在冻结恢复时,时间取值从
unscaledDeltaTime
变成了deltaTime
:本应一直Play的TML暂停了很长的一帧
1.3 原因
正常的执行效果是,TML完整播放,逻辑在冻结时暂停,恢复的时候TML跟逻辑点正好匹配。
由于卡顿 + 切换帧,导致TML中间暂停了很长时间(超过/接近冻结时间);逻辑帧正常结束暂停(实际上是有偏差)。
实际走出的效果描述1:逻辑没有暂停(但减了帧数);表现正常播放 => 逻辑比表现短了
实际走出的效果描述2:逻辑正常暂停、结束;表现由于切换的暂停,总时长被拉长了 => 表现比逻辑长了
1.4 解决方案
最终放弃了TimeScale做法
表现层:
- TML自己处理暂停,包括Animator、Animation、Particle System等组件的处理
- 浮空脚本支持暂停
逻辑层:
- 保持主逻辑正常执行
- 其他单位的逻辑,根据时间暂停、延后执行
网友评论