Trang chủ » Blog » Tìm hiểu quá trình xử lý Time và Input trong Unity 3D

Tìm hiểu quá trình xử lý Time và Input trong Unity 3D

bởi CodeGym | 23/07/2024 16:28 | Blog

Nắm vững cách xử lý Time và Input trong Unity là một yếu tố then chốt để tối ưu hiệu năng và cải thiện trải nghiệm người chơi. Bài viết này sẽ giúp bạn hiểu sâu hơn về ảnh hưởng của các thuộc tính trong class Time đến game. Đồng thời, bạn sẽ học cách xử lý Input người chơi chính xác, mượt mà, bất kể tốc độ khung hình của thiết bị.

Class Time của Unity cung cấp các thuộc tính cơ bản quan trọng cho phép bạn làm việc với các giá trị liên quan đến thời gian trong dự án của mình. Một số thuộc tính hay được sử dụng có thể kể đến như:

  • Time.time: trả về lượng thời gian tính bằng giây kể từ khi game của bạn bắt đầu chạy.
  • Time.deltaTime: trả về lượng thời gian tính bằng giây đã trôi qua kể từ khi khung hình (frame) cuối cùng hoàn thành. Giá trị này thay đổi tùy thuộc vào tốc độ khung hình trên giây (FPS) mà trò chơi hoặc ứng dụng của bạn đang chạy.
  • Time.timeScale: kiểm soát tốc độ thời gian trôi qua, cho phép bạn tạo hiệu ứng chuyển động chậm (slow motion), tạm dừng trò chơi (pause) hoặc chuyển tiếp nhanh (fast forward).
  • Time.fixedDeltaTime: kiểm soát khoảng thời gian của vòng lặp cố định của Unity (fixed timestep), được sử dụng cho vật lý và nếu đoạn code của bạn phụ thuộc vào tần suất cập nhật cố định.
  • Time.maximumDeltaTime: đặt giới hạn trên cho khoảng thời gian giữa hai khung hình.

Class Time ảnh hưởng đến hầu hết các khía cạnh phụ thuộc thời gian trong game engine.

Bước thời gian động (Variable time steps)

Variable time steps là hệ thống có khoảng thời gian thay đổi giữa mỗi bước. Tốc độ khung hình của trò chơi của bạn có thể thay đổi do ảnh hưởng bởi tốc độ xử lý của thiết bị, cũng như mức độ phức tạp của đồ họa được hiển thị và yêu cầu tính toán cho mỗi khung hình. Ví dụ: trò chơi của bạn có thể chạy ở tốc độ khung hình chậm hơn khi có một trăm nhân vật trên màn hình, so với khi chỉ có một nhân vật. Tốc độ thay đổi này thường được gọi là “khung hình trên giây” hoặc FPS.

Unity cung cấp hàm Update để bạn viết code xử lý trong mỗi khung hình. Ví dụ bạn có thể đọc dữ liệu đầu vào của người chơi khi bấm phím tiến lên và di chuyển nhân vật về phía trước một khoảng nhất định. Điều quan trọng cần nhớ khi xử lý các hành động phụ thuộc thời gian như trên là tốc độ khung hình của trò chơi có thể khác nhau và do đó khoảng thời gian giữa các lần gọi Update cũng khác nhau.

Hãy xem xét việc di chuyển một đối tượng về phía trước dần dần, từng khung hình một. Nhìn đoạn code sau thì có vẻ như bạn đang dịch đối tượng theo một khoảng cách cố định cho mỗi khung hình:

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    public float distancePerFrame;
   
    void Update() {
        transform.Translate(0, 0, distancePerFrame); // Xin đừng làm vậy
    }
}

Tuy nhiên, với đoạn code này, khi tốc độ khung hình thay đổi, tốc độ của đối tượng cũng thay đổi. Nếu trò chơi đang chạy ở tốc độ 100 khung hình mỗi giây, đối tượng sẽ di chuyển distancePerFrame một trăm lần mỗi giây. Nếu tốc độ còn 60 khung hình/giây thì nó chỉ tiến về phía trước 60 lần/giây. Do đó nó sẽ di chuyển một khoảng cách ngắn hơn trong cùng một khoảng thời gian.

Để đối tượng trong trò chơi của bạn di chuyển ở tốc độ ổn định bất kể tốc độ khung hình. Giải pháp là nhân tỷ lệ mức độ chuyển động của mỗi khung hình theo lượng thời gian trôi qua của mỗi khung hình từ thuộc tính Time.deltaTime:

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    public float distancePerSecond;
   
    void Update() {
        transform.Translate(0, 0, distancePerSecond * Time.deltaTime); // Xin hãy làm thế này
    }
}

Lưu ý rằng chuyển động hiện được đưa ra dưới dạng distancePerSecond thay vì distancePerFrame. Khi tốc độ khung hình thay đổi, độ lớn của bước chuyển động sẽ thay đổi tương ứng và do đó tốc độ của đối tượng sẽ không đổi.

Bước thời gian cố định (Fixed time steps)

Fixed time steps sẽ có thời gian được xác định trước cho mỗi bước và không liên quan đến quá trình xử lý hiển thị lên màn hình. Fixed time steps thường được dùng trong hệ thống vật lý, chạy ở tốc độ được chỉ định để đảm bảo mô phỏng vật lý diễn ra ổn định tại mọi thời điểm.

Unity cung cấp hàm FixedUpdate để bạn xử lý code của mình theo thời gian cố định. Thuộc tính fixedDeltaTime kiểm soát khoảng thời gian của bước thời gian cố định của Unity và được tính bằng giây. Ví dụ: giá trị 0,01 có nghĩa là mỗi dấu thời gian cố định có thời lượng là một phần trăm giây và do đó sẽ có 100 bước cố định mỗi giây.

Nếu game bạn đang chạy ở tốc độ khung hình cao hơn số lượng bước cố định mỗi giây, điều đó có nghĩa là thời lượng của mỗi khung hình nhỏ hơn thời lượng của một bước cố định. Trong trường hợp đó, Unity thực hiện 0 hoặc một cập nhật vật lý cố định trên mỗi khung hình. Ví dụ: nếu fixedDeltaTime của bạn là 0,02 thì sẽ có 50 bước cố định mỗi giây. Nếu trò chơi hoặc ứng dụng của bạn chạy ở tốc độ 60 khung hình/giây thì khoảng 1/10 khung hình sẽ không có bước cố định.

Time và Input trong Unity

Nếu game của bạn đang chạy ở tốc độ khung hình thấp hơn giá trị của bước cố định, điều đó có nghĩa là thời lượng mỗi khung hình dài hơn một bước cố định. Để giải quyết vấn đề này, Unity sẽ thực hiện một hoặc nhiều bước cố định cho mỗi khung hình để mô phỏng vật lý bắt kịp lượng thời gian đã trôi qua kể từ khung hình cuối cùng. Ví dụ: nếu giá trị fixedDeltaTime của bạn là 0,01 thì sẽ có 100 bước cố định mỗi giây. Nếu ứng dụng của bạn chạy ở tốc độ 25 khung hình/giây, Unity sẽ thực hiện 4 bước cố định cho mỗi khung hình. Trong nhiều bài toán, việc đảm bảo tính chính xác của mô phỏng vật lý quan trọng hơn tốc độ khung hình cao.

Time và Input trong Unity

Sơ đồ xử lý Time trong Unity

Sơ đồ dưới đây minh hoạ quá trình Unity xử lý một khung hình và mối liên hệ giữa các thuộc tính deltaTime, fixedDeltaTime, maximumDeltaTime. Hiểu rõ sơ đồ này giúp bạn nắm được code của bạn đang được Unity xử lý thế nào mỗi frame. Điều này rất quan trọng trong các bài toán tối ưu nâng cao.

Time và Input trong Unity

Hiệu ứng làm chậm với timeScale

Trong class Time của Unity có thuộc tính timeScale để kiểm soát tốc độ của trò chơi so với thời gian thực. Nếu bạn đặt tỷ lệ là 1.0 thì thời gian trong trò chơi của bạn khớp với thời gian thực. Giá trị 2.0 khiến thời gian trôi qua nhanh gấp đôi trong Unity (tức là hành động sẽ được tăng tốc), trong khi giá trị 0.5 sẽ làm chậm tốc độ game xuống một nửa. Giá trị bằng 0 sẽ khiến thời gian trong game của bạn dừng hoàn toàn. Lưu ý timeScale không thực sự làm chậm việc xử lý của CPU mà thay vào đó thay đổi giá trị của Time.deltaTime và Time.fixedDeltaTime. Nói cách khác, số lần gọi hàm Update, FixedUpdate không đổi, nhưng giá trị của deltaTime sẽ thay đổi tốc độ di chuyển của đối tượng mỗi frame. Các chức năng tập lệnh khác không bị ảnh hưởng bởi timeScale. Do đó, bạn có thể hiển thị và tương tác bình thường với UI khi game bị tạm dừng.

using UnityEngine;

public class Example : MonoBehaviour
{
    // Tạo hiệu ứng làm chậm mỗi khi bấm Space
    private float fixedDeltaTime;

    void Awake()
    {
        // Lưu lại giá trị ban đầu của fixedDeltaTime
        this.fixedDeltaTime = Time.fixedDeltaTime;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (Time.timeScale == 1.0f)
                Time.timeScale = 0.7f;
            else
                Time.timeScale = 1.0f;
            // Thay đổi giá trị của fixedDeltaTime theo deltaTime để đảm bảo tính chính xác của mô phỏng vật lý
            Time.fixedDeltaTime = this.fixedDeltaTime * Time.timeScale;
        }
    }
}

Tổng kết – Xử lý Time và Input trong Unity 3D

Bài viết trên đã giúp bạn nắm rõ hơn về cách sử dụng Time và xử lý Input trong Unity. Hy vọng sau bài viết này, các bạn có thể viết code không bị phụ thuộc vào tốc độ khung hình và trả ra kết quả giống nhau trên các thiết bị khác nhau.

Tìm hiểu thêm về Time và Input trong Unity 3D qua video: 

[Buổi 4] Tìm hiểu về Time và Input trong Unity - Khoá lập trình Game Unity | CodeGym

Nếu bạn muốn tiếp cận với Game Unity một cách bài bản, khóa học lập trình Game Unity tại CodeGym là lựa chọn hoàn hảo cho bạn. Khóa học cung cấp kiến thức từ cơ bản đến nâng cao, giúp bạn nắm vững các kỹ năng phát triển game trên nền tảng Unity.

 

Tags: game

0 Lời bình

Gửi Lời bình

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

BÀI VIẾT LIÊN QUAN

BẠN MUỐN HỌC LẬP TRÌNH?

GỌI NGAY

098 953 44 58

Đăng ký tư vấn lộ trình học lập trình

Đăng ký tư vấn, định hướng lộ trình học và giải đáp các thắc mắc về ngành nghề – Miễn phí – Online.

15 + 15 =

TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM
TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM