Menu
CoddyTech

慢动作

本课属于 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 的代码仍可照常运行。

challenge icon

挑战

中等

让彗星以慢动作穿过 SlowZone。

  1. 在 SlowZone.cs 中,编写 void OnTriggerEnter(Collider other):将 Time.timeScale 设置为 slowScale,将 Time.fixedDeltaTime 设置为 0.02f * slowScale。
  2. 编写 void OnTriggerExit(Collider other):将它们恢复为 1f 和 0.02f。

按下 “开始” 并按空格键:彗星会以 0.4 倍速度滑过区域。然后点击 “检查”。

亲手试试

using UnityEngine;

public class SlowZone : MonoBehaviour
{
    public float slowScale = 0.4f;

    // 有物体进入区域时启用慢动作
}

打造真正的游戏中的所有课

自己练习: Unity 在线编辑器