Pause game trong quá trình chơi là điều mà user sẽ luôn thực hiện. Vì vậy kiểm soát việc pause game sẽ là 1 bài toán thường xuyên gặp đối với các lập trình viên Unity Game.

Việc pause game thường sẽ có ảnh hưởng đến game của bạn. Ví dụ như không thể hiển thị các message, mở các tab cài đặt,...

Thông thường, đối với lập trình Unity, cách thuận tiện nhất để pause game là đặt giá trị cho Time.timeScale về bằng 0. Điều này sẽ tạm dừng toàn bộ các hoạt động như physics, animation hay di chuyển của nhân vật (movement), chỉnh timeScale bằng 1 thì game hoạt động như tốc độ bình thường.

Đa số các hoạt động sẽ bị dừng khi sử dụng dòng lệnh "Time.timeScale = 0" này, nhưng không phải tất cả. Sau đây chúng ta sẽ tìm hiểu về những thứ bị ảnh hưởng bởi timeScale và sử dụng nó để pause game một cách hợp lý và có ít lỗi xảy ra nhất.

Cách để tạm dừng game

Để pause game, thông thường sẽ sử dụng cấu trúc code:

Việc chỉnh timeScale sẽ ảnh hưởng đến time và deltaTime trong class Time. Việc bạn muốn thời gian trong game nhanh hay chậm thì chỉ cần chỉnh giá trị của timeScale tương ứng. Ví dụ timeScale = 0.5 thì thời gian sẽ chậm hơn một nửa so với bình thường.

Vậy Cái gì không bị ảnh hưởng khi pause game?

Tất cả các Object phụ thuộc vào thời gian đều bị ảnh hưởng, gọi là time-based object.

Điều này đã bao gồm gần như tất cả các thứ xảy ra trong game như: animation, di chuyển, vật lý,..

Update vẫn tiếp tục được gọi.

 Hàm update vẫn tiếp tục được gọi khi timeScale = 0. Tức là tất cả những thứ trừ những thứ phụ thuộc vào thời gian nằm trong Update sẽ được thực thi bất kể timeScale bằng bao nhiêu.

FixedUpdate sẽ bị dừng hẳn

FixedUpdate thường được sử dụng để handle các tính toàn vật lý, nó sẽ không được gọi nếu timeScale = 0.

Tất nhiên điều này sẽ cực kì thuận tiện cho chúng ta khi muốn toàn bộ các hoạt động vật lý dừng lại, chắc hẳn bạn không muốn quả bóng đang rơi vẫn bị tác động của trọng lực hay va chạm khi dừng game.

Tiếp tục di chuyển khi dừng game

Chúng ta không cần bất kỳ trick hay mẹo gì cả, Unity đã hỗ trợ sẵn hết các thuộc tính để làm điều này

  • Thay vì Time.deltaTime, hãy dùng Time.unscaledDeltaTime
  • Thay vì Time.time hãy dùng Time.unscaledTime
  • Thay vì Time.fixedDeltaTime, hãy sử dụng Time.fixedUnscaledDeltaTime

Bạn có thể thấy sự khác biệt đó là keyword: unscaled, đa số các thuộc tính bạn cần trong lớp Time đều có option này.

Chạy animation khi pause game?

Như mình đã giải thích trước đó, animation là một time-based feature, và sẽ bị dừng hoặc nhanh chậm phụ thuộc vào timeScale.Giải pháp ở đây, chúng ta có thể đặt lại thuộc tính Update Mode của component Animator trên editor thành Unscaled Time.

Tránh Update vẫn nhận input từ người dùng

Như mình đã đề cập, Update vẫn tiếp tục được gọi khi timeScale bằng 0, thường các phần xử lý nhận Input từ người dùng chúng ta cũng đặt trong Update, vì vậy các phần này cũng được thực thi.

Đôi khi không tránh những trường hợp chúng ta không muốn xử lý input.

Như vậy lúc tạm dừng game thì nhân vật của bạn vẫn có thể quay các hướng khác, để tránh điều này, cách đơn giản nhất là chúng ta sẽ kiểm tra pause game trong GameManager.cs:

và trong các script HandleInput khác:

Tham khảo:

The right way to pause a game in Unity


This free site is ad-supported. Learn more