Unity••10 min•6 views••
Vòng đời của GameObject
Minh Khoa
Author
1. Cơ bản: Life Cycle cơ bản của một GameObject + MonoBehaviour
Khi một GameObject được tạo ra trong Scene và gắn script MonoBehaviour, nó sẽ đi qua một chuỗi vòng đời:
1.1 Tạo và kích hoạt
- Awake()
- Gọi một lần duy nhất khi script được load (trước cả khi scene start).
- Dùng để: khởi tạo biến, set up references (ví dụ:
GetComponent, load config). - Dù
GameObjectđang disable,Awakevẫn được gọi.
- OnEnable()
- Gọi mỗi khi GameObject hoặc component được enable.
- Nếu bạn disable rồi enable lại,
OnEnable()sẽ chạy lại. - Dùng để: đăng ký event, reset trạng thái tạm.
1.2 Vòng đời khi chạy
- Start()
- Gọi trước frame Update đầu tiên, nhưng sau Awake và OnEnable.
- Dùng để: thực hiện logic cần dữ liệu đã init đầy đủ.
- Nếu GameObject bị disable ở frame đầu tiên thì
Startsẽ chờ đến khi enable.
- Update()
- Gọi mỗi frame, phụ thuộc FPS.
- Dùng cho: logic gameplay (kiểm tra input, AI, animation state).
- LateUpdate()
- Gọi sau tất cả
Update()trong frame đó. - Dùng để: xử lý “theo sau” (camera follow, sync transform sau khi nhân vật đã di chuyển).
- Gọi sau tất cả
- FixedUpdate()
- Gọi theo tần suất cố định (mặc định 0.02s, tức 50 lần/giây).
- Dùng cho: physics (Rigidbody, Force, Collider).
- Nếu muốn game ổn định vật lý → code di chuyển rigidbody nên để ở đây.
1.3 Kết thúc vòng đời
- OnDisable()
- Gọi khi GameObject hoặc component bị disable.
- Dùng để: hủy đăng ký event, clear state, tránh memory leak.
- OnDestroy()
- Gọi khi GameObject bị Destroy hoặc scene bị unload.
- Dùng để: giải phóng tài nguyên, lưu trạng thái.
2. Thứ tự thực thi nâng cao (Script Execution Order)
Unity có thứ tự cụ thể khi chạy script trong 1 frame:
- FixedUpdate (0–n lần tùy Time.fixedDeltaTime).
- Update (gọi cho tất cả script).
- LateUpdate.
- Rendering (OnPreRender, OnRenderObject, OnPostRender, OnRenderImage).
- Gizmos (OnDrawGizmos cho Editor).
- Coroutines (IEnumerator với
yield).
⚡ Quan trọng: Unity cho phép chỉnh script execution order trong Project Settings > Script Execution Order.
3. Các sự kiện đặc biệt khác trong vòng đời
Ngoài chuỗi trên, có nhiều callback khác:
- OnApplicationPause(bool pause) → gọi khi app bị đưa ra background (mobile).
- OnApplicationFocus(bool focus) → gọi khi mất/tái focus.
- OnApplicationQuit() → gọi khi app tắt (editor playmode stop cũng gọi).
- OnValidate() → gọi trong Editor mỗi khi giá trị serialized thay đổi (Inspector).
- Reset() → gọi khi bạn gắn script lần đầu hoặc chọn Reset từ menu component.
4. Vòng đời của Coroutine
Coroutine (IEnumerator) có vòng đời riêng:
StartCoroutine()→ chạy song song với Update.yield return null→ đợi 1 frame.yield return new WaitForSeconds(t)→ đợi t giây thực.- Coroutine bị dừng nếu GameObject bị disable hoặc
StopCoroutine/StopAllCoroutinesgọi.
5. Vòng đời trong Editor
Nếu làm tool hoặc Editor script, còn có:
- [ExecuteInEditMode] → script chạy cả trong editor, không cần Play.
- OnDrawGizmos() → vẽ gizmo trong Scene view.
- OnValidate() → update khi chỉnh Inspector.
6. Quản lý vòng đời nâng cao
- Dependency Injection (Zenject/Extenject): inject dependency trong
Awakethay vìStart. - Pooling: tái sử dụng GameObject → tránh gọi
Awake/Startquá nhiều (dùngOnEnable/OnDisablethay vì Destroy). - Async (UniTask/Task): thay thế Coroutine cho flow rõ ràng hơn.
- Separation of Concern:
Awake: gán reference.OnEnable: đăng ký event.Start: logic gameplay init.OnDisable: gỡ event.OnDestroy: cleanup.
7. Minh họa vòng đời GameObject
Awake()
↓
OnEnable()
↓
Start()
↓
(Update → LateUpdate → FixedUpdate) [Loop đến khi disable/destroy]
↓
OnDisable()
↓
OnDestroy()
✅ Tóm lại:
- Awake: init biến (dù disable).
- OnEnable: đăng ký event, reset.
- Start: init logic gameplay.
- Update: mỗi frame.
- FixedUpdate: vật lý.
- LateUpdate: camera/cleanup sau Update.
- OnDisable: clear event.
- OnDestroy: cleanup cuối cùng.
