Nắm bắt và xử lý thời gian rất quan trọng đối với mọi chương trình, xử lý thời gian để giới hạn số frame của game (FPS), xử lý lực bắn, ứng dụng để tính toán và di chuyển đối tượng 1 cách mượt mà nhất, … Trong Unity, các thao tác này trở nên đơn giản hơn bao giờ hết bởi Unity đã hỗ trợ sẵn hầu hết các thuộc tính cơ bản có liên quan đến việc xử lý thời gian.
Bài viết sau sẽ giới thiệu về lớp Time trong Unity và 1 số ứng dụng của nó.
Lớp Time
Time là 1 lớp được định nghĩa sẵn bởi Unity, cung cấp các thuộc tính lưu trữ và xử lý các thông tin về thời gian trong Unity. Lớp Time
không bao gồm bất kỳ phương thức nào, nhưng có 1 vài thuộc tính có thể chỉnh sửa để tương thích và phù hợp với chương trình.
1 số thuộc tính quan trọng
time
Thời gian tính bằng giây (kiểu float
), trả về thời điểm bắt đầu của frame hiện tại. Thuộc tính này không thể chỉnh sửa.
Thuộc tính này sẽ trả về giá trị như nhau cho dù được gọi ở các thời điểm khác nhau trong cùng 1 vòng lặp.
Time.time
sẽ trả về giá trị của Time.fixedTime
nếu được gọi trong hàm FixedUpdate
.
deltaTime
Thuộc tính này trả về khoảng thời gian (tính bằng giây) cần thiết để xử lý hết frame trước đó.
deltaTime
được ứng dụng rất nhiều trong các hàm thuộc lớp Mathf
, khi cần di chuyển đối tượng mượt mà. Thuộc tính deltaTime
không thể chỉnh sửa.
Khi được gọi trong FixedUpdate
, thuộc tính sẽ trả về giá trị của fixedDeltaTime
thuộc lớp Time
.
timeScale
timeScale
là thuộc tính mô tả độ co giãn của thời gian.
- Khi nhận giá trị
1.0
, thời gian trôi qua đúng bằng thời gian thực. - Khi muốn chương trình chạy chậm đi 2 lần, gán giá trị
0.5
chotimeScale
. - Khi
timeScale
nhận giá trị0
, chương trình sẽ đóng băng hoàn toàn.
timeScale
sẽ ảnh hưởng lên mọi đối tượng được quản lý bởi lớp Time
, ngoại trừ thuộc tính realTimeSinceStartup
.
Lưu ý: Hàm FixedUpdate
(nếu có) sẽ không được gọi khi timeScale
nhận giá trị 0
.
maximumDeltaTime
Khoảng thời gian tối đa mà 1 frame có thể được cập nhật. Thuộc tính này thường được sử dụng để tránh việc FPS bị giảm đột ngột do tiến trình thu dọn rác – GarbageCollector
và các thao tác xử lý vật lý tốn kém tài nguyên gây ra.
Nếu việc xử lý giá trị tốn nhiều thời gian, các hiệu ứng và vật lý sẽ có ít thời gian hơn để cập nhật. Việc này sẽ làm giảm chất lượng game, tuy nhiên sẽ tránh được hiện tượng giật, lag khi chơi game.
Giá trị hợp lý để thiết lập cho thuộc tính vào khoảng 1/10 – 1/3 giây.
Các thuộc tính khác và chức năng
fixedTime và fixedDeltaTime
2 thuộc tính này có chức năng tương tự như Time.time
và Time.deltaTime
, nhưng được sử dụng trong hàm FixedUpdate
để tính toán các thao tác vật lý được đơn giản hơn.
Các thao tác vật lý thường sử dụng các công thức phức tạp nên việc làm tròn các giá trị là khá quan trọng giúp đỡ hao tốn tài nguyên hơn.
smoothDeltaTime
Giả sử tại 1 hoặc 1 vài vòng lặp liên tiếp trong game, các giá trị cần xử lý tăng đột biến khiến cho deltaTime
tăng nhanh đột ngột. Điều này gây ảnh hưởng không nhỏ đến độ chính xác của các thao tác trong các lần lặp tiếp theo. Thuộc tính smoothDeltaTime
được sử dụng để làm giảm việc thay đổi đột ngột thời gian như thế.
Ví dụ nhỏ dưới đây sẽ giúp hiểu rõ hơn về chức năng của thuộc tính smoothDeltaTime
:
deltaTime | smoothDeltaTime |
---|---|
... | ... |
0.2 | 0.2 |
0.2 | 0.2 |
0.2 | 0.2 |
0.2 | 0.4833 |
0.9 | 0.4833 |
0.8 | 0.4833 |
0.4 | 0.4833 |
0.4 | 0.4833 |
0.2 | 0.4833 |
0.2 | 0.2 |
... | ... |
Ở bảng trên, mức độ thay đổi của smoothDeltaTime là nhỏ hơn tại hầu hết thời điểm so với deltaTime
.
frameCount
Tổng số lượng frame đã được xử lý kể từ khi chương trình bắt đầu chạy. Thuộc tính này không thể thay đổi.
realtimeSinceStartup
Trả về thời gian tính bằng giây kể từ khi chương trình được khởi chạy. Ngoại trừ khi thay đổi timeScale
, có thể sử dụng Time.time
tương đương trong mọi trường hợp còn lại.
Khi chương trình được tạm dừng ở Unity Editor, thuộc tính này vẫn sẽ được cập nhật liên tục. Phụ thuộc vào nền tảng và thiết bị phần cứng, thuộc tính này có thể trả về giá trị giống nhau trong vài frame liên tiếp.
timeSinceLevelLoad
Thuộc tính sẽ trả về khoảng thời gian bắt đầu từ khi level cuối cùng (scene) được khởi chạy cho đến thời gian bắt đầu của frame hiện tại.