Search…

Phân Biệt Awake và Start trong Unity

24/09/20203 min read
Phân biệt phương thức Awake và phương thức Start trong Unity.

Trong quá trình phát triển game với Unity Engine, phương thức Start được dùng 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. Phương thức Awake cũng thường được sử dụng như 1 sự khởi đầu nhưng có chút khác biệt.

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ế 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, 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 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 Awake đầ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, AwakeStart 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, 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

Điều này có nghĩa là dùng Start cho những mong muốn thực thi khi Script component được bật, nó cho phép 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, 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, 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.
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024