慢动作
本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 35 课,共 60 课。
Time.timeScale 在 0 到 1 之间时,游戏会进入慢动作状态。设为 0.25 时,Time.deltaTime 是实际帧时间的四分之一,因此,汽车按 speed * Time.deltaTime 移动时,每过 1 秒实际时间只会驶过四分之一的距离,刚体的飞行和下落速度也会变成四分之一,而 WaitForSeconds(1f) 会持续 4 秒实际时间。大于 1 时,游戏运行速度会加快:2 表示双倍速度。
物理还需要多设置一行。每个物理步仍会让游戏时间前进 Time.fixedDeltaTime,也就是 0.02 秒游戏时间;当时间缩放为 0.25 时,每个物理步要经过 0.08 秒实际时间,因此 FixedUpdate() 每秒只运行 12.5 次,物体每 5 帧才移动一次,画面会卡顿。将步长按相同比例缩小,并在之后恢复这两个值,因为 Unity 不会自行重置 fixedDeltaTime。下面的脚本会在按住 Space 时减慢游戏速度:
float normalStep;
void Awake()
{
normalStep = Time.fixedDeltaTime; // 新项目中为 0.02
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Time.timeScale = 0.25f;
Time.fixedDeltaTime = normalStep * Time.timeScale;
}
if (Input.GetKeyUp(KeyCode.Space))
{
Time.timeScale = 1f;
Time.fixedDeltaTime = normalStep;
}
}使用更小的步长后,物理每秒实际时间仍会运行 50 次,每个物理步覆盖四分之一的游戏时间,因此慢动作依然流畅。步长以游戏秒为单位,所以 FixedUpdate() 中使用 Time.deltaTime 的代码仍可照常运行。
挑战
中等让彗星以慢动作穿过 SlowZone。
- 在
SlowZone.cs中,编写void OnTriggerEnter(Collider other):将Time.timeScale设置为slowScale,将Time.fixedDeltaTime设置为0.02f * slowScale。 - 编写
void OnTriggerExit(Collider other):将它们恢复为1f和0.02f。
按下 “开始” 并按空格键:彗星会以 0.4 倍速度滑过区域。然后点击 “检查”。
亲手试试
using UnityEngine;
public class SlowZone : MonoBehaviour
{
public float slowScale = 0.4f;
// 有物体进入区域时启用慢动作
}
打造真正的游戏中的所有课
自己练习: Unity 在线编辑器