Hôm nay là một trick ngắn về việc giảm thiểu các Compiler Warning trong quá trình code, với MonoDevelop (hoặc Visual, mình thì thích MonoDevelop hơn, nhẹ gọn).
Compiler Warning là cái gì ?
Mấy cái gì đơn giản, quen thuộc rồi thì mình không nói dài dòng nữa hé. Đây là mấy cái Warnings “vàng vàng” mà mọi người hay thấy trong Console Window của Unity, hoặc ngay trong MonoDevelope.
Warning thì không phải là lỗi code, chỉ là báo động rằng code có vấn đề. Nhìn chung, để mà làm dev thực thụ, thì mình nên treat tất các các warning trong code. Để làm gì ?
- Đảm bảo code “sạch”, không có code dư thừa (unreachable code block)
- Không tồn tại các biến không dùng (variable never use)
- Không sử dụng các API bị obsoleted
- …
Warning message trong MonoDevelop và trong Console Window của Unity khác nhau ???
Nếu để ý, các bạn sẽ thấy không phải lúc nào warning message trong Console Window của Unity là giống nhau. Còn nếu để ý nữa, mấy bạn sẽ thấy, dù đã bấm F7 để build trong MonoDevelop rồi, nhưng qua Unity, nó vẫn tốn vài giây để compile lại scripts. Vì sao lại có những khác biệt này? Câu trả lời, bởi vì MonoDevelop và UnityEditor sử dụng 2 compiler khác nhau.
MonoDevelop sử dụng Compiler của .NET, và đúng version như các bạn config trong MonoDevelop (3.5, 4.0 …). Compiler này thì thường ở trong “C:WindowsMicrosoft.NETFramework“, đây là lý do vì sao phải cài .NET Framework mới chạy được Mono đó.
Và trong project, các file dll được build ra từ Mono sẽ nằm ở <ProjectDir>obj. Và đống dll này chỉ … mang tính minh họa, không được đưa vào gói build. Ông nào thích tọc mạch khám phá thì lấy ILSPY nghịch đống dll này, sẽ thấy .NET version đúng như config trong MonoDevelop (3.5, 4.0 ..)
UnityEditor thì sử dụng Mono compiler (mà chắc nhiều người cũng biết hết rồi). Là một thư viện mã nguồn mở, đc viết lại từ C#, và có hầu hết API của C# (hiện tại thì chỉ tính từ .NET 2.0 trở lui thôi nhé, tương lai Unity có kế hoạch update Mono Compiler lên, sẽ đc nhiều API tương đương ở .Net version cao hơn)
Và những file dll đc build ra từ UnityEditor sẽ nằm ở <Project>LibraryScriptAssemblies. Và đống dll này mới là những file dll được đưa vào gói Build sau cùng. Ai rãnh thích lấy ILSPY phá ra sẽ thấy .NET version là 2.0, đúng như config trong UnityEditor.
Ngoài lề chút, nếu như ở platform khác (Android, IOS …) sẽ có thêm tùy chọn IL2CPP, với cách này thì gói BUild của bạn sẽ không có các file dll (đọc link mình đưa + google thêm để hiểu hé). Note thêm chớ không lại có ông hỏi “Sao tao build ra IOS làm quái gì có file dll nào?” =))).
Có những thể loại Compiler Warning nào?
Nhiều lắm, ai muốn tìm hiểu list các thể loại warning thì vào chỗ này C# Compiler Warning and Errors, đọc thêm cho chi tiết hé.
Như mình đề cập ở trên, vì UnityEditor và MonoDevelop dùng 2 compiler khác nhau nên đôi lúc warning nó khác nhau, thường là MonoDevelop sinh ra những warning thừa, nên ta hay tìm cách hạn chế. Warning trong UnityEditor thì nên treat hết, còn của MonoDevelop thì có vài cái bị thừa. Cơ bản thì hay gặp mấy loại này :
0649 : Field never assign to, alway have default value null. Cái này hay gặp đối với các filed được đánh dấu bằng [SerializeField]. Cái này nên loại ra, cho bớt phiền phức :v. 0414 : private field assigned but not used 0219 : variable assigned but not used.
Mỗi cái 0649 trên là phiền nhứt thôi, còn lại chịu khó treat hết đi nhá =)))).
Các cách để disable Compiler Warnings ?
Config cho từng project trong MonoDevelop?
Config như trong hình bên dưới :
Cách này cũng ổn, nhưng bạn sẽ thất vọng, vì mỗi lần thêm mới / xóa / di chuyển script … thì những config này “tự dưng” biến mất !?$? Và đống warning vẫn văng ra lại như thường. Lý do bởi vì : Unity sẽ generate lại các file *.csproj, *.sln mỗi khi có sự thay đổi về add/move/delete script , hoặc thêm bớt các Precompile Define symbol. Và mỗi lần như thế, những config các bạn đã thêm sẽ bị reset hết. (bleu bleu 😛 )
Config cho từng file script
Cái này thì chắc không quá xa lạ với mấy ông đã quen xài C# với Visual. Bằng cách sử dụng Preprocessor #pragma. Việc này sẽ thông bao cho compiler không “phun” các warning message cho từng file được chỉ định
Cách này cũng ổn, chỉ có điều là cực lắm, file nào cũng phải thêm cái dòng này lên đầu hết, Copy Paste lè lưỡi chưa xong.
Can thiệp vào quá trình generate các file *.csproj
Keke, thể hiện đẳng cấp xài Unity là đây chớ đâu. Mấy bạn đặt file này vào thư mục có tên Editor ở bất kì đâu trong project nhé.
Đọc qua chắc cũng dễ hiểu quá rồi hé, không cần giải thích thêm gì hé. Chỉ cần để ý mấy dòng quan trọng sau :
- Script phải đặt trong thư mục Editor, vì đây là editor script
- Class kế thừa từ AssetPostprocessor, để Unity gọi đến một số phương thức đặc biệt trong đó, danh sách các phương thức đó thì có thể xem ở ngay Unity Manual.
- Hàm OnGeneratedCSProjectFiles() mình vô tình biết qua một post trên UnityForum, nhưng cũng không hiểu sao lại không có trong document của Unity. Nhưng yên tâm là phương thức đó sẽ được gọi mỗi khi Unity generate ra các file CSProject.
Sẵn cũng coi như giới thiệu thêm 1 “loại hình” Editor code can thiệp vào khâu xử lý asset của Unity. Chú nào thích thì tiếp tục mày mò thêm hé. Trong các project mình đều thêm file WarningDisable này vào, đỡ phiền toái trong lúc xài Mono, share cho mọi người dùng cho zui.