Khi lập trình phần mềm, hầu hết đi kèm với những bugs - lỗi lập trình. Lỗi có thể do nhiều nguyên nhân khác nhau nhưng mục tiêu cuối cùng của sản phẩm là loại bỏ thật nhiều lỗi để có thể đưa sản phẩm hoàn thiện ra thị trường.
Để phát hiện lỗi, các bộ công cụ phát triển phần mềm hiện nay tích hợp chức năng debug, giúp lập trình viên tìm kiếm, sửa lỗi được dễ dàng và hiệu quả hơn bằng các phương pháp trực quan.
Kiểm tra tính thực thi
Trước khi sửa lỗi chương trình phải khoanh vùng đoạn code bị lỗi, phạm vi càng thu hẹp càng tốt. Việc khoanh vùng và xác định đoạn code lỗi thuộc về kinh nghiệm lập trình.
Sau khi đã khoanh vùng phần code lỗi, cần xem xét tính thực thi của đoạn code bằng cách phát ra 1 thông điệp nào đó, ở đây sử dụng hàm Log
thuộc lớp Debug
trong Unity.

Nếu thông điệp không được hiển thị, 1 trong những trường hợp sau đã xảy ra:
- Script chưa được gắn vào 1
GameObject
nào trong chương trình. - Hàm chứa đoạn code thông điệp không được gọi.
- Thông điệp nằm trong nhánh code không được thực thi (thường gặp với các cấu trúc rẽ nhánh
if... else
,switch... case
, ...).
Để xử lý, cần xem xét cẩn thận và dựa vào logic của game để chỉnh sửa lại cho phù hợp.
Kiểm tra tính logic
Khi chắc chắn đoạn code được thực thi nhưng chương trình vẫn chạy không như mong muốn, tiến hành quan sát sự thay đổi của các đối tượng liên quan theo thời gian. Vẫn dùng hàm Log
thuộc lớp Debug, có thể theo dõi 1 hoặc nhiều đối tượng cụ thể để tìm ra nguyên nhân gây ra lỗi.
Việc khắc phục lỗi về logic game thuộc về khả năng đọc code và phân tích bài toán, các công cụ Debug chỉ giúp sửa lỗi được dễ dàng hơn, việc sửa lỗi sẽ phụ thuộc nhiều vào bản thân lập trình viên.
Các hàm quan trọng và chức năng
Unity cung cấp 1 loạt các hàm hỗ trợ debug tiện dụng thuộc lớp Debug
.
Log
Debug.Log
là hàm được sử dụng nhiều nhất trong kiểm tra và sửa lỗi chương trình, hàm Log
có chức năng hiển thị ra màn hình Console (Windows → Console) các thông tin về 1 đối tượng trong game.
Kiểu dữ liệu mà hàm nhận vào là Object
, do đó với mọi loại dữ liệu thì hàm đều có thể in ra cửa sổ Console của Unity Editor, tuỳ theo cách hiển thị của kiểu dữ liệu.
Các kiểu dữ liệu thường được lập trình viên sử dụng với hàm Log bao gồm int
, float
, string
, dữ liệu kiểu mảng
, ...
Các kiểu dữ liệu do Unity định nghĩa như Vector2
, Vector3
, Quaternion
, ... cũng được hiển thị chi tiết.
Ngoài hàm Log
nói trên, Unity còn cung cấp 1 số hàm Log
nâng cao nhưng ít phổ biến đối với lập trình viên chưa có nhiều kinh nghiệm.
Draw
Ngoài việc hiển thị ra màn hình Console giá trị của 1 đối tượng, Unity hỗ trợ vẽ 1 đường thẳng lên màn hình. Khi cần xem xét cụ thể, sử dụng hàm DrawLine
để vẽ, hàm có nguyên mẫu như sau:
public static void DrawLine(Vector3 start, Vector3 end, Color color = Color.white, float duration = 0.0f, bool depthTest = true);
Trong đó các giá trị color
, duration
và depthTest
đều mang sẵn giá trị mặc định. 1 đường thẳng sẽ được vẽ trong cửa sổ Scene, với 2 đầu mút được quy định rõ ràng.
Trong trường hợp cần quan sát hướng của đối tượng, sử dụng hàm DrawRay
, cách sử dụng hàm tương tự như với hàm DrawLine
:
public static void DrawRay(Vector3 start, Vector3 dir, Color color = Color.white, float duration = 0.0f, bool depthTest = true);
1 đường thẳng sẽ được vẽ từ điểm bắt đầu cho đến start + dir
. Ray (tia) là 1 đường thẳng vô hạn không có điểm kết thúc nhưng Unity Editor sẽ chỉ minh hoạ 1 phần của tia.
* 2 hàm Draw
thuộc lớp Debug
sẽ vẽ lên cửa sổ Scene, nếu muốn hiển thị trực tiếp lên màn hình Game, mở tuỳ chọn hiển thị Gizmo ở cửa sổ Game.
Break
Trong 1 số trường hợp cần chương trình tạm dừng lại để xem xét sự thay đổi của các đối tượng trong game, hàm Break
trong lớp Debug
giúp thực hiện công việc này.
Hàm Break
thực sự trở nên hữu ích khi cần dừng chương trình tại 1 thời điểm cụ thể, cũng có thể sử dụng công cụ Debugger có sẵn trong Visual Studio hay Mono Develop, nhưng sẽ không xem xét được các đối tượng 1 cách trực quan.
isDebugBuild
Khi đưa sản phẩm hoàn thiện ra thị trường, hiển nhiên không cần đến các đoạn code Debug nữa vì đã khắc phục triệt để các vấn đề liên quan, do đó nên loại bỏ các đoạn Debug này ra khỏi sản phẩm.
Với hàng chục, thậm chí hàng trăm file script với nhiều dòng code, việc xoá từng dòng Debug thủ công là điều gây lãng phí thời gian và công sức, đồng thời thể hiện sự thiếu chuyên nghiệp trong công việc. Vậy tại sao không sử dụng 1 điều kiện trước khi gõ dòng code Debug thông thường để kiểm soát việc này?
Trong lớp Debug
, Unity cung cấp cho 1 thuộc tính để kiểm tra trạng thái của sản phẩm - thuộc tính isDebugBuild
. Thuộc tính này sẽ trả về true
nếu như sản phẩm vẫn đang trong quá trình hoàn thiện (thường gọi là Beta Release). Trạng thái của sản phẩm có thể được tìm thấy tại cửa sổ Build Setting (Ctrl + Shift + B), check box "Development Build". Ngoài ra tại cửa sổ Unity Editor, thuộc tính này luôn mang giá trị là true
.
Cách sử dụng cùng với ví dụ minh hoạ cho việc sử dụng các hàm thuộc lớp Debug
, tham khảo phần demo ở cuối bài viết.
Download demo
