Thời gian không bị co giãn
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 36 trên 60.
Một trò chơi đang tạm dừng hoặc chạy chậm vẫn cần đồng hồ thực cho một số việc: menu tạm dừng có hoạt ảnh, thời gian đếm ngược trước khi tiếp tục chơi, hoặc trạng thái đóng băng phải tự kết thúc. Time.unscaledDeltaTime là thời gian thực kể từ khung hình trước, bất kể Time.timeScale đang ở mức nào, còn Time.unscaledTime là thời gian thực kể từ khi trò chơi bắt đầu. Menu tạm dừng này dùng thời gian thực để xoay vòng tròn tải, vì vậy vòng tròn vẫn quay khi trò chơi tạm dừng:
void Update()
{
wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime); // nửa vòng mỗi giây, dù có tạm dừng hay không
}Coroutine cũng có cặp tương tự. WaitForSeconds tính thời gian trong trò chơi, nên khi Time.timeScale = 0, nó sẽ không bao giờ kết thúc; WaitForSecondsRealtime tính giây thực. Coroutine này bắt đầu khi menu mở và làm nhấp nháy tiêu đề của menu cứ mỗi nửa giây:
IEnumerator Blink()
{
while (true)
{
title.SetActive(!title.activeSelf);
yield return new WaitForSecondsRealtime(0.5f);
}
}Dùng các giá trị có tỉ lệ thời gian cho lối chơi, vốn nên dừng lại khi trò chơi dừng, và các giá trị không tỉ lệ thời gian cho những thứ phải tiếp tục chạy khi trò chơi tạm dừng hoặc chạy chậm: menu, hoạt ảnh của chúng và bộ đếm thời gian kết thúc trạng thái tạm dừng. Invoke không có phiên bản dùng thời gian thực: nó luôn tính thời gian trong trò chơi.
Thử thách
Trung bìnhThêm hiệu ứng dừng hình khi đe va chạm: toàn bộ trò chơi sẽ đóng băng trong giây lát khi đe tiếp đất.
- Trong
Anvil.cs, viếtIEnumerator HitStop():Time.timeScale = 0f;, sau đóyield return new WaitForSecondsRealtime(freezeTime);, rồi đặt lại thành1f. - Viết
void OnCollisionEnter(Collision collision)để gọiStartCoroutine(HitStop());.
Nhấn Chơi rồi thả đe bằng phím Space: mỗi lần đe tiếp đất, trò chơi sẽ đóng băng trong 0.3 giây. Sau đó, nhấn Kiểm tra.
Tự làm thử
using System.Collections;
using UnityEngine;
public class Anvil : MonoBehaviour
{
public float freezeTime = 0.3f;
// Tạm dừng trò chơi trong freezeTime giây thực khi đe va vào vật gì đó
}
Tất cả bài học trong Xây dựng trò chơi thực tế
1Văn bản trên màn hình
Canvas và văn bảnHiển thị điểm sốĐịnh dạng sốĐồng hồ đếm ngượcÔn tập: Đồng hồ tốc độ7Điều khiển thời gian
Tạm dừng bằng timeScaleChuyển động chậmThời gian không bị co giãnÔn tập: Bullet Time2Nút bấm và màn hình
Nút bấm và onClickLambdaKết nối trong InspectorBật và tắt bảngThanh máuÔn tập: Cửa hàng nâng cấp5Lưu dữ liệu với PlayerPrefs
Lưu một sốTải với giá trị mặc địnhĐiểm cao nhấtLưu cài đặtÔn tập: Tiền xu trong ngân hàngTự luyện tập: Playground Unity