MonoBehaviour và ScriptableObject Tiêu chí MonoBehaviour ScriptableObject Bản chất Component gắn lên GameObject trong Scene/Prefab Asset dữ liệu độc lập (không gắn GameObject) Vòng đời Theo GameObject: Awake → OnEnable → Start → Update… → OnDisable/ OnDestroy Theo Asset: tồn tại như file .asset; không có loop mặc định Khởi tạo Tạo qua AddComponent() hoặc trên Prefab/Scene Tạo file bằng Create > ScriptableObject hoặc CreateInstance() Chứa gì Logic/Hành vi + tham chiếu Component/Transform trong Scene Dữ liệu; có thể chứa logic nhẹ (không phụ thuộc Scene) Update loop Có ( Update, FixedUpdate, LateUpdate…) Không Serialization Serialize theo Scene/Prefab Serialize thành asset; dễ chia sẻ giữa nhiều scene Tham chiếu Scene Truy cập trực tiếp GameObject/Component Không nên giữ tham chiếu trên scene (dễ null/leak); giữ data thuần Dùng lại/chia sẻ Instance gắn với từng GameObject Một asset dùng cho nhiều đối tượng/scene (data-driven) Bộ nhớ/GC Tạo/hủy theo vòng đời object trong Scene Ít cấp phát runtime; phù hợp giảm trùng lặp dữ liệu Use-case chính Controller, behaviour, input, AI, UI view, spawn… Config, stat, item database, lookup table, event channel, state container Làm việc trong Editor Thường test trong Play Mode Dễ chỉnh sửa/so sánh như asset Phụ thuộc Phụ thuộc Scene/Prefab hierarchy Độc lập với Scene; tốt cho DI/data pipeline Hạn chế Khó chia sẻ state giữa nhiều scene nếu không singleton/DI Không có lifecycle update; không tham chiếu scene trực tiếp Dùng khi Cần logic chạy mỗi frame, tương tác thế giới Cần dữ liệu chung/cấu hình tái sử dụng, tách data khỏi logic.