Under Construction

Prometheus Lab

Portfolio & Resources

Back to Blog
Unity10 min6 views

Vòng đời của GameObject

Author

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).
    • GameObject đang disable, Awake vẫ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ì Start sẽ 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).
  • 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:

  1. FixedUpdate (0–n lần tùy Time.fixedDeltaTime).
  2. Update (gọi cho tất cả script).
  3. LateUpdate.
  4. Rendering (OnPreRender, OnRenderObject, OnPostRender, OnRenderImage).
  5. Gizmos (OnDrawGizmos cho Editor).
  6. 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/StopAllCoroutines gọ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 Awake thay vì Start.
  • Pooling: tái sử dụng GameObject → tránh gọi Awake/Start quá nhiều (dùng OnEnable/OnDisable thay 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.

image.png