Search…

Kỹ Thuật Debug trong Unity

25/09/20205 min read
Hướng dẫn các thao tác và kỹ thuật debug code trong Unity.

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.

ss_1

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, durationdepthTest đề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

STDIO_UnityDebug.zip

ss_2
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024