Menu
CoddyTech

Chuyển động chậm

Thuộc phần Xây dựng trò chơi thực tế trong hành trình Unity của Coddy. Bài học 35 trên 60.

Time.timeScale nằm giữa 0 và 1 sẽ tạo hiệu ứng chuyển động chậm. Khi ở mức 0.25, Time.deltaTime bằng một phần tư thời gian khung hình thực, vì vậy xe di chuyển bằng speed * Time.deltaTime chỉ đi được một phần tư quãng đường mỗi giây thực, các vật thể Rigidbodies bay và rơi với một phần tư tốc độ, còn WaitForSeconds(1f) kéo dài 4 giây thực. Trên 1, trò chơi chạy nhanh: 2 là tốc độ gấp đôi.

Vật lý cần thêm một dòng nữa. Mỗi bước vật lý vẫn đưa trò chơi tiến thêm Time.fixedDeltaTime, tức 0.02 giây thời gian trong trò chơi, và ở mức 0.25, mỗi bước kéo dài 0.08 giây thực: FixedUpdate() chỉ chạy 12.5 lần mỗi giây thực, nên các vật thể chỉ di chuyển một lần sau mỗi năm khung hình và bị giật. Giảm bước theo cùng hệ số, rồi khôi phục cả hai giá trị sau đó, vì Unity không tự đặt lại fixedDeltaTime. Tập lệnh này làm chậm trò chơi khi bạn giữ phím Space:

float normalStep;

void Awake()
{
    normalStep = Time.fixedDeltaTime;   // 0.02 trong dự án mới
}

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;
    }
}

Với bước nhỏ hơn, vật lý vẫn chạy 50 bước mỗi giây thực và mỗi bước ứng với một phần tư thời gian trong trò chơi, vì vậy chuyển động chậm vẫn mượt mà. Bước được tính bằng giây trong trò chơi, nên code trong FixedUpdate() sử dụng Time.deltaTime vẫn hoạt động như cũ.

challenge icon

Thử thách

Trung bình

Chơi cảnh sao chổi bay qua SlowZone trong chuyển động chậm.

  1. Trong SlowZone.cs, viết void OnTriggerEnter(Collider other): đặt Time.timeScale thành slowScale và Time.fixedDeltaTime thành 0.02f * slowScale.
  2. Viết void OnTriggerExit(Collider other): đặt chúng về 1f và 0.02f.

Nhấn Chơi rồi nhấn phím Space: sao chổi lướt qua vùng này với tốc độ 0.4. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

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

    // Chuyển động chậm khi có vật ở trong vùng
}

Tất cả bài học trong Xây dựng trò chơi thực tế

Tự luyện tập: Playground Unity