10 lỗi Unity người mới thường gặp và cách sửa
Người mới thường gặp một nhóm lỗi lặp lại: thiếu reference, sai 2D/3D, Scene chưa nằm trong build, prefab override khó hiểu, UI vỡ kích thước và build không có asset. Biết quy trình kiểm tra quan trọng hơn nhớ từng lỗi. Bài tổng hợp 10 lỗi theo thứ tự kiểm tra: Console, Inspector, Hierarchy, layers, Scene, package và build target. Mỗi lỗi có dấu hiệu, nguyên nhân thường gặp và cách xác nhận.
ASCENO / UNITY DIAGNOSTIC NOTES · 68
10 lỗi Unity người mới thường gặp và cách sửa
10 Common Unity Beginner Mistakes and How to Fix Them
Đây là bài chẩn đoán, không phải danh sách mẹo nhớ nhanh. Mỗi lỗi bên dưới gắn với một triệu chứng có thể tái hiện, một nơi kiểm tra cụ thể và một hành động sửa có thể kiểm chứng.
Mục tiêu học tập
- Phân biệt lỗi compile, reference, lifecycle, physics, Scene, Prefab, UI và build.
- Biết mở đúng cửa sổ thay vì chụp một Scene chung chung.
- Tái hiện từng lỗi trong một Scene nhỏ và ghi lại bằng chứng.
1. Bản đồ 10 lỗi
Hãy xem mười lỗi như mười giả thuyết khác nhau. Không có một ảnh Scene hay một dòng code nào tự giải thích được tất cả; mỗi nhóm cần bằng chứng riêng.

2. Triệu chứng → lớp kiểm tra
Đọc cột dấu hiệu trước, sau đó mở đúng nơi kiểm tra. Nếu chưa tái hiện được dấu hiệu, chưa nên kết luận nguyên nhân.
- 01 · Console bị bỏ qua — Có dòng đỏ nhưng sửa mò → Window > General > Console; đọc lỗi đầu tiên và stack trace
- 02 · Script không compile — Không vào Play được hoặc callback không chạy → Console và file/dòng có lỗi CS
- 03 · Thiếu reference — NullReferenceException → Inspector của object đang chọn
- 04 · Object bị tắt — Script có vẻ không chạy dù object vẫn nằm trong Scene → Active của GameObject và enabled của Component
- 05 · Nhầm 2D / 3D — Collision hoặc Trigger không gọi → Rigidbody, Collider và hậu tố callback
- 06 · Sai Tag / Layer — CompareTag false hoặc va chạm bị bỏ qua → Tag, Layer và Layer Collision Matrix
- 07 · Scene chưa nằm trong build — LoadScene lỗi hoặc bản build mở sai Scene → Build Profile / danh sách Scenes
- 08 · Prefab override — Instance và asset gốc cho kết quả khác nhau → Overrides trong Inspector
- 09 · UI sai kích thước — UI lệch hoặc ra khỏi màn hình khác độ phân giải → Canvas Scaler, RectTransform, anchor và pivot
- 10 · Package / build thiếu — Type, namespace hoặc asset mất khi build → Package Manager, Console và thư mục output

3. Cây quyết định chẩn đoán
Bắt đầu từ triệu chứng quan sát được, không bắt đầu từ linh cảm về dòng code. Đi theo nhánh cho đến khi có một bằng chứng có thể đọc được.

4. Bản đồ bằng chứng trong Unity
Ảnh 1 là bằng chứng Unity thật để bắt đầu thao tác. Hình 4 chỉ là sơ đồ không chữ mô tả đường đi của bằng chứng: từ object, qua cấu hình, đến log và đầu ra. Các tên cửa sổ và thao tác cụ thể được giải thích bằng chữ ngay bên dưới, không bị khóa trong ảnh.

5. Kiểm tra Hierarchy
- Chọn đúng object mà log hoặc hành vi đang nói đến; tên object phải đọc được trong Hierarchy.
- Kiểm tra Active của GameObject và enabled của Component script.
- Với Prefab, phân biệt asset trong Project và instance trong Scene.
- Với Scene/load, xác nhận object đang ở Scene hiện tại chứ không phải Scene khác.

6. Kiểm tra Inspector
- Reference null: tìm field SerializeField và kéo đúng object vào.
- Physics: ghép Rigidbody/Collider cùng hệ 2D hoặc 3D; kiểm tra Is Trigger.
- Tag/Layer: đọc giá trị thật và Layer Collision Matrix, không đoán từ màu.
- Prefab/UI: kiểm tra Overrides, Canvas Scaler, RectTransform, anchor và pivot.

7. Đọc Console đúng cách
Bấm Clear, tái hiện một lần, đọc lỗi đỏ đầu tiên, rồi click để xem stack trace và file/dòng. Ảnh 1 cho thấy Console native của Unity; hình 7 chỉ giản lược quan hệ quan sát từ tín hiệu đến kết luận để người đọc theo dõi mà không phụ thuộc ngôn ngữ.

8. Thứ tự kiểm tra bằng code và Editor
Thứ tự dưới đây giúp tránh sửa gameplay trong khi script còn lỗi compile hoặc reference chưa được gán. Code không thay thế việc đọc Inspector và Console.
// Diagnostic order for a Unity failure
1. Clear Console and read the first error
2. Fix compiler errors before pressing Play
3. Inspect Active, Component, reference, Tag, and Layer
4. Match the 2D/3D physics pair and callback
5. Check Scene list, Prefab Overrides, and Canvas settings
6. Resolve packages and verify the build output

9. Mười thí nghiệm tái hiện
- 01 · Tái hiện “Console bị bỏ qua”: mở Window > General > Console; đọc lỗi đầu tiên và stack trace, đổi một điều kiện, chạy lại và ghi Có dòng đỏ nhưng sửa mò.
- 02 · Tái hiện “Script không compile”: mở Console và file/dòng có lỗi CS, đổi một điều kiện, chạy lại và ghi Không vào Play được hoặc callback không chạy.
- 03 · Tái hiện “Thiếu reference”: mở Inspector của object đang chọn, đổi một điều kiện, chạy lại và ghi NullReferenceException.
- 04 · Tái hiện “Object bị tắt”: mở Active của GameObject và enabled của Component, đổi một điều kiện, chạy lại và ghi Script có vẻ không chạy dù object vẫn nằm trong Scene.
- 05 · Tái hiện “Nhầm 2D / 3D”: mở Rigidbody, Collider và hậu tố callback, đổi một điều kiện, chạy lại và ghi Collision hoặc Trigger không gọi.
- 06 · Tái hiện “Sai Tag / Layer”: mở Tag, Layer và Layer Collision Matrix, đổi một điều kiện, chạy lại và ghi CompareTag false hoặc va chạm bị bỏ qua.
- 07 · Tái hiện “Scene chưa nằm trong build”: mở Build Profile / danh sách Scenes, đổi một điều kiện, chạy lại và ghi LoadScene lỗi hoặc bản build mở sai Scene.
- 08 · Tái hiện “Prefab override”: mở Overrides trong Inspector, đổi một điều kiện, chạy lại và ghi Instance và asset gốc cho kết quả khác nhau.
- 09 · Tái hiện “UI sai kích thước”: mở Canvas Scaler, RectTransform, anchor và pivot, đổi một điều kiện, chạy lại và ghi UI lệch hoặc ra khỏi màn hình khác độ phân giải.
- 10 · Tái hiện “Package / build thiếu”: mở Package Manager, Console và thư mục output, đổi một điều kiện, chạy lại và ghi Type, namespace hoặc asset mất khi build.

10. Bảng lỗi → nơi kiểm tra → cách sửa
- 01 · Console bị bỏ qua | Có dòng đỏ nhưng sửa mò | Window > General > Console; đọc lỗi đầu tiên và stack trace | Đọc chính xác lỗi trước khi sửa; xoá log cũ rồi tái hiện
- 02 · Script không compile | Không vào Play được hoặc callback không chạy | Console và file/dòng có lỗi CS | Sửa lỗi compile đầu tiên; gameplay chưa đáng kiểm tra khi script còn đỏ
- 03 · Thiếu reference | NullReferenceException | Inspector của object đang chọn | Kéo đúng object vào field SerializeField hoặc thêm guard null
- 04 · Object bị tắt | Script có vẻ không chạy dù object vẫn nằm trong Scene | Active của GameObject và enabled của Component | Bật đúng cả object lẫn Component rồi chạy lại
- 05 · Nhầm 2D / 3D | Collision hoặc Trigger không gọi | Rigidbody, Collider và hậu tố callback | Ghép cùng hệ 2D hoặc 3D; không trộn OnTriggerEnter với Collider2D
- 06 · Sai Tag / Layer | CompareTag false hoặc va chạm bị bỏ qua | Tag, Layer và Layer Collision Matrix | Kiểm tra đúng tên Tag và cặp Layer trước khi đổi code
- 07 · Scene chưa nằm trong build | LoadScene lỗi hoặc bản build mở sai Scene | Build Profile / danh sách Scenes | Thêm Scene, kiểm tra thứ tự và lưu lại profile
- 08 · Prefab override | Instance và asset gốc cho kết quả khác nhau | Overrides trong Inspector | Apply khi muốn ghi về asset; Revert khi muốn bỏ thay đổi cục bộ
- 09 · UI sai kích thước | UI lệch hoặc ra khỏi màn hình khác độ phân giải | Canvas Scaler, RectTransform, anchor và pivot | Đặt reference resolution và anchor theo vùng thay đổi
- 10 · Package / build thiếu | Type, namespace hoặc asset mất khi build | Package Manager, Console và thư mục output | Resolve dependency, kiểm tra platform và mở thử artifact sau build

Góc nhìn ASCENO: Debug không phải đoán nhanh. Người làm game tốt tạo ra bằng chứng nhỏ, loại trừ từng khả năng và ghi lại cách tái hiện.
