Các hàm cơ bản của Monobehaviour Unity: Update, LateUpdate, FixedUpdate
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 và 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?