4 Tính năng của Awake
Chỉ được gọi một lần
Điểm đặc biệt của Awake đó là nó chỉ được gọi một 1 lần suốt vòng đời của đối Nếu Awake đã được gọi nó sẽ không được gọi lại trên cùng một đối tượng
Awake được gọi nếu GameObject đang ở trạng thái hoạt động (enable bằng true)
Do đặc tính này của awake nên nó thường được sử dụng để
- khởi tạo biến
- khởi tạo state
- khởi tạo tham chiếu đối tượng
- …
Awake được gọi khi chuyển scene hoặc khi Instantiate
Không thể kiểm soát thứ tự giữa các Awake
Khi chuyển scene Awake của tất cả GameObject đều được gọi, vậy chúng được gọi theo thứ tự nào?
Trên thực tế thư tự gọi Awake là ngẫu nhiên không phải theo thứ tự sắp xếp của GameObject trong hierarchy như chúng ta nghĩ
Nói cách khác nếu bạn thiết kế code với ý đồ thực hiện Awake của B sau Awake của A, kết quả sẽ thay đổi mỗi lần vì vậy tránh làm điều này vì nó không chắc chắn Nếu bạn muốn làm vậy hãy làm như sau :
- Viết Awake cho A
- B không viết phương thức Awake
- B viết phương thức Initialize thay thế cho Awake
- thực hiện gọi Initialize của B bên trong Awake của A
Tóm lại bạn cần tránh viết các quy trình mà phụ thuộc vào thứ tự chúng được gọi.
Các tính năng của Awake được gọi nếu GameObject đang active ngay cả khi component deactive
Chú ý
-
Nếu bạn gọi LoadSceneAsync và đồng thời đặt allowSceneActivation bằng false bên trong Awake thì trạng thái allowSceneActivation của sẽ không bị thay đổi thành false bởi thiết kế của Unity và scene vẫn tự động chuyển. Thực tế là allowSceneActivation đã chuyển trạng thái thành false nhưng có một phương thức nội bộ khởi tạo của SceneManager của unity đã chạy sau phương thức Awake của bạn nên giá trị allowSceneActivation vẫn là true
-
Đây là một lỗi đã biết của Unity bạn có thể xem thêm thông tin ở đây
- Để khắc phục điều này bạn có thể thay thế việc dùng Awake sang sử dụng Start hoặc các event function khác