Các hàm cơ bản của Monobehaviour Unity: Update, LateUpdate, FixedUpdate

26 Tháng sáu, 2024

Với nhiều bạn mới làm quen với Unity, thì việc khi nào dùng Update, LateUpdate, FixedUpdate thường là khá mơ hồ. Thêm vào đó, ba hàm này ảnh hưởng khá nhiều đến hiệu năng của game. Do đó, hiểu rõ ba hàm này là rất quan trọng trong quá trình làm game.

Update

using UnityEngine;
public class NewBehaviourScript : MonoBehaviour 
{
	// Update is called once per frame
	void Update () {
		
	}
}

Ngay ở dòng comment đã làm rõ cách hoạt động của hàm Update. Nó được gọi mỗi frame một lần. Ví dụ, bạn viết một hàm vào trong hàm Update, game của bạn đang chạy ở mức 60fps (frame per second) tức là 1 giây hàm bạn viết sẽ được thực hiện 60 lần. Điều đó ảnh hướng rất nhiều đến performance.

Mình thường chỉ viết hàm vào Update khi thực sự cần. Thường đó là các hàm xử lý Input của người chơi, đòi hỏi mọi tương tác của người chơi với game phải được xử lý và phản hồi liên tục.

Một điều mà nhiều người khi mới làm quen với Unity hay mắc phải đó là viết hàm di chuyển gameobject trong Update. Về cơ bản thì việc làm này không sai, nhưng hãy chắc chắn rằng các gameobject mà bạn thực hiện lệnh di chuyển trong Update không có các Component mô phỏng vật lý (rigidbody và collider).

LateUpdate

using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
    void LateUpdate()
    {
        transform.Translate(0, Time.deltaTime, 0);
    }
}

LateUpdate cũng giống với Update. Điều được gọi mỗi frame. Điểm khác nhau là LateUpdate được gọi sau khi Update được gọi. Vì vậy, các lưu ý khi dùng LateUpdate cũng giống như dùng Update.

Vậy ta cần LateUpdate làm gì khi đã có Update?

Ví dụ có một gameobject di chuyển trong hàm Update. Nếu mình muốn Camera của mình di chuyển theo gameobject đó thì mình sẽ viết hàm di chuyển của Camera vào trong LateUpdate. Đó cũng là cách di chuyển Camera theo một vật mượt mà nhất.

FixedUpdate

Như chúng ta đã biết, các đại lượng vật lý thường phụ thuộc vào thời gian. Việc mô phỏng vật lý trong Unity cũng vật, nó phụ thuộc vào thời gian chứ không phải fps. FixedUpdate thường dùng để xử lý các tác vụ liên quan đến vật lý trong game.

Tại sao lại như vậy?

Đó cũng là điểm khác việt với Update LateUpdate. FixedUpdate được gọi sau mỗi khoảng fixedDeltaTime mặc định trong Unity là 0.02 giây, tức là 1 giây được gọi 50 lần. Vì vậy, dù game bạn có chạy ở 60fps hay 120fps số lần gọi FixedUpdate cũng không khác nhau.

Do đó, nếu gameobject đang được mô phỏng vật lý (có gán rigidbody) việc di chuyển gameobject đó nên được thực hiện trong FixedUpdate bằng AddForce hoặc MovePosition.

using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
    public Vector3 teleportPoint;
    public Rigidbody rb;
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    void FixedUpdate()
    {
        rb.MovePosition(transform.position + transform.forward * Time.deltaTime);
    }
}

Kết

Mình đã giới thiệu các điểm cơ bản nhất của cả ba hàm Update, LateUpdate, FixedUpdate. Việc sử dụng đúng ba hàm Update là rất quan trọng vì nó ảnh hướng rất lớn tới performance của game. Cũng vì thế, trước khi các bạn viết hàm con vào trong một trong ba hàm Update hãy tự hỏi liệu hàm đó có nhất quyết phải đặt trong Update không?

guest
0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
Tin tức liên quan
Hướng dẫn lấy đường dẫn các page Woocommerce 3.x
Chắc hẳn ai dùng Woocommerce đều sẽ muốn hiển thị đường dẫn của trang tài khoản, cửa hàng, thanh toán, giỏ hàng,.. Có rất nhiều phương án xử lý...
Hướng dẫn xóa san-pham , danh-muc-san-pham trong đường dẫn sản phẩm Woocommerce
Với mặc định của Woocommerce, chi tiết sản phẩm sẽ có dạng domain/san-pham/ten-san-pham và danh mục sản phẩm sẽ ở dạng domain/danh-muc-san-pham/ten-danh-muc. Một phần đường dẫn như vậy sẽ...
Hướng dẫn tạo sản phẩm Woocommerce có biến thể đẹp mắt
Mình đọc bình luận thấy khá nhiều bạn kêu gặp khó khăn trong vấn đề tạo sản phẩm có biến thể, hay sản phẩm có biến thể không được...