Tài trợ bài viết này và giới thiệu dịch vụ, sản phẩm, thương hiệu, nhu cầu tuyển dụng của doanh nghiệp đến với cộng đồng.
Bùi Trung Hiếu Awake và Start đều là 2 phương thức Unity hỗ trợ để thiết lập, khởi tạo biến hoặc trạng thái của đối tượng lúc ban đầu. Chúng ta thường hay sử dụng Start và không thường dùng Awake. Trong bài viết này tôi sẽ giúp các bạn phân biệt Awake và Start, cũng như việc sử dụng chúng một cách chính xác.
Nội dung bài viết

Giới thiệu

Trong quá trình phát triển game với Unity Engine, chúng ta thường hay sử dụng phương thức Start trong các trường hợp khởi tạo giá trị, khởi tạo đối tượng… như là một phương thức thiết lập ban đầu. Chúng ta đa phần không hay sử dụng phương thức Awake, vậy phương thức Awake là gì, nó được dùng như thế nào? Awake và Start khác nhau như thế nào? Bài viết này sẽ giúp các bạn giải đáp thắc mắc đó.

Tiền đề bài viết

Bài viết nhằm giúp cho các bạn đang phát triển game với Unity Engine có cái nhìn tổng qua hơn về 2 phương thức AwakeStart, qua đó phân biệt và sử dụng Awake và Start hợp lý.

Đối tượng hướng đến

Bài viết hướng đến các bạn đang làm quen với Unity Engine.

MonoBehaviour.Awake()

Awake là phương thức được tự động gọi khi Script component được nạp. Awake chỉ được gọi duy nhất 1 lần. Phương thức này được dùng để khởi tạo bất cứ biến nào hoặc trạng thái game trước khi game bắt đầu. Phương thức Awake được gọi sau khi tất cả các đối tượng được khởi tạo vì thế bạn có thể giao tiếp với các đối tượng khác hoặc truy vấn chúng.

Mỗi hàm Awake của đối tượng trong game được gọi với thứ tự ngẫu nhiên giữa các đối tượng. Bởi vì điều này, bạn có thể sử dụng Awake để thiệt lập tham số giữa các Script component và dùng Start để chuyển bất kì tham số nào qua lại giữa chúng. Awake luôn được gọi trước Start, điều này cho phép bạn có sắp xếp thứ tự khởi tạo của Script.

Awake không thể là 1 co-routine. 

MonoBehaviour.Start()

Start được gọi trước lần gọi Update đầu tiên ngay tại frame Script component được bật. Cũng giống như Awake, Start được gọi duy nhất 1 lần. Tuy nhiên, Awake được gọi khi đối tượng được khởi tạo, bất kể Script component có được bật hay tắt. Start có thể không được gọi trên cùng 1 frame với Awake nếu Script component không được bật ở thời điểm khởi tạo.

Awake và Start

Về cơ bản, Awake và Start là 2 phương thức được tự động gọi khi Script component được nạp. Awake được gọi đầu tiên ngay cả khi Script component không được bật và được dùng tốt nhất là để thiết lập các tham số giữa Script và việc khởi tạo. Start được gọi sau Awake và trước lần gọi Update đầu tiên nhưng chỉ khi Script component được bật.

Ví dụ: Trong scene ta có GameObject có Script component:

using UnityEngine;

public class AwakeStartTester : MonoBehaviour {

    void Awake()
    {
        Debug.Log("Awake called");
    }

    void Start()
    {
        Debug.Log("Start called");
    }
}

Nhấn Play game và kết quả:

awake-start-unity-1

Đều này có nghĩa bạn có thể dùng Start cho những thứ bạn muốn được thực thi khi Script component được bật. Nó cho phép bạn trì hoãn bất cứ phần nào của việc khởi tạo cho đến khi điều đó thật sự cần thiết.

Lưu ý

  • Phương thức Awake của tất cả đối tượng trong scene được gọi trước bất kì phương thức Start của bất kì đối tượng nào.

Ví dụ: Trong scene ta có 2 đối tượng GameObjectAGameObjectB đều có Script component:

using UnityEngine;

public class AwakeTester : MonoBehaviour {

    void Awake()
    {
        Debug.Log("Awake() was called form " + this.name);
    }

    void Start ()
    {
        Debug.Log("Start() was called form " + this.name);
    }
}

Nhấn Play và ta có đoạn Log như sau:

awake-start-unity

Điều này hữu ích khi việc khởi tạo GameObjectA phải dựa vào GameObjectB đã được khởi tạo hay chưa, việc khởi tạo GameObjectB nên được hoàn thành ở phương thức Awake trong khi việc GameObjectA nên hoàn thành ở Start.

  • Trong trường hợp các đối tượng được tạo ra trong suốt quá trình chơi game, phương thức Awake của chúng sẽ được gọi tự động ngay sau khi phương thực Start của scene được hoàn thành.

Tham khảo

THẢO LUẬN
ĐÓNG