
Các phương pháp hay nhất về định dạng cho kịch bản C# trong Unity
Trang web này đã được dịch bằng máy để thuận tiện cho bạn. Chúng tôi không thể đảm bảo tính chính xác hoặc độ tin cậy của nội dung được dịch. Nếu bạn có thắc mắc về tính chính xác của nội dung được dịch, vui lòng tham khảo phiên bản tiếng Anh chính thức của trang web.
Mặc dù có thể không có một cách duy nhất đúng để định dạng mã C# của bạn, việc thống nhất một phong cách nhất quán trong nhóm của bạn có thể dẫn đến một cơ sở mã sạch hơn, dễ đọc hơn và có khả năng mở rộng hơn. Trang này cung cấp các mẹo và những cân nhắc chính cần ghi nhớ cho các lớp học, phương pháp và nhận xét của bạn khi tạo hướng dẫn phong cách của riêng mình.
Lưu ý: Các khuyến nghị được chia sẻ ở đây dựa trên những khuyến nghị do Microsoft cung cấp. Các quy tắc hướng dẫn phong cách mã tốt nhất là những quy tắc phù hợp với nhu cầu của nhóm bạn.
Bạn có thể tìm thấy ví dụ về hướng dẫn phong cách mã tại đây hoặc tải xuống sách điện tử đầy đủ, Sử dụng hướng dẫn phong cách C# cho mã game sạch và có thể mở rộng (phiên bản Unity 6).
Định dạng mã của bạn
Cùng với việc đặt tên, định dạng giúp giảm sự phỏng đoán và cải thiện độ rõ ràng của mã. Bằng cách tuân theo một hướng dẫn phong cách tiêu chuẩn, đánh giá mã sẽ ít tập trung vào việc mã trông như thế nào mà tập trung nhiều hơn vào những gì nó làm.
Bỏ qua, mở rộng hoặc sửa đổi các quy tắc ví dụ này để phù hợp với nhu cầu của nhóm bạn.
Trong mọi trường hợp, hãy xem xét cách nhóm của bạn sẽ thực hiện từng quy tắc định dạng và sau đó yêu cầu mọi người áp dụng nó một cách đồng nhất. Tham khảo lại phong cách của nhóm bạn để giải quyết bất kỳ sự khác biệt nào.
Hãy xem xét từng gợi ý định dạng mã sau khi thiết lập hướng dẫn phong cách phát triển Unity của bạn.
Thuộc tính
Một thuộc tính cung cấp cơ chế linh hoạt để đọc, ghi hoặc tính toán các giá trị của lớp. Các thuộc tính hoạt động như thể chúng là các biến thành viên công khai, nhưng trên thực tế chúng là các phương thức đặc biệt được gọi là accessors. Mỗi thuộc tính có một phương thức get và set để truy cập một trường riêng tư, được gọi là backing field.
Bằng cách này, thuộc tính encapsulates dữ liệu, che giấu nó khỏi những thay đổi không mong muốn của người dùng hoặc các đối tượng bên ngoài. Getter và setter mỗi cái có bộ điều chỉnh truy cập riêng, cho phép thuộc tính của bạn có thể đọc-ghi, chỉ đọc, hoặc chỉ ghi.
Bạn cũng có thể sử dụng các bộ truy cập để xác thực hoặc chuyển đổi dữ liệu (ví dụ: xác minh rằng dữ liệu phù hợp với định dạng ưa thích của bạn hoặc thay đổi một giá trị thành một đơn vị cụ thể).
Cú pháp cho các thuộc tính có thể khác nhau, vì vậy hướng dẫn phong cách của bạn nên xác định cách định dạng chúng. Sử dụng các mẹo này để giữ cho các thuộc tính nhất quán trong mã của bạn.
Các thuộc tính có dạng biểu thức
Sử dụng các thuộc tính có thân biểu thức cho các thuộc tính chỉ đọc một dòng (=>): Điều này trả về trường hỗ trợ riêng tư.
// VÍ DỤ: Các thuộc tính có dạng biểu thức
public class PlayerHealth
{
// trường dữ liệu riêng tư
private int maxHealth;
// chỉ đọc, trả về trường cơ sở
public int MaxHealth => maxHealth;
// tương đương với:
// public int MaxHealth { get; private set; }
}
Thuộc tính tự triển khai
Mọi thứ khác sử dụng cú pháp cũ hơn { get; set; } cú pháp: Nếu bạn chỉ muốn lộ một thuộc tính công khai mà không chỉ định trường hỗ trợ, hãy sử dụng Thuộc tính Tự động Triển khai. Áp dụng cú pháp biểu thức cho các bộ truy cập set và get. Hãy nhớ đặt setter là private nếu bạn không muốn cấp quyền ghi. Căn chỉnh dấu đóng với dấu mở cho các khối mã nhiều dòng.
// VÍ DỤ: Các thuộc tính có dạng biểu thức
public class PlayerHealth
{
// trường dữ liệu nền
private int _maxHealth;
// triển khai rõ ràng getter và setter
public int MaxHealth
{
get => _maxHealth;
set => _maxHealth = value;
}
// chỉ ghi (không sử dụng trường đệm)
public int Health { private get; set; }
// chỉ ghi, không có bộ đặt giá trị rõ ràng
public SetMaxHealth(int newMaxValue) => _maxHealth = newMaxValue;
}
Serialization
Serialization script là quá trình tự động chuyển đổi các cấu trúc dữ liệu hoặc trạng thái đối tượng thành một định dạng mà Unity có thể lưu trữ và tái tạo sau này. Vì lý do hiệu suất, Unity xử lý Serialization khác với các môi trường lập trình khác.
Các trường được tuần tự hóa xuất hiện trong Inspector, nhưng bạn không thể tuần tự hóa các trường tĩnh, hằng số hoặc chỉ đọc. Chúng phải là công khai hoặc được gắn thẻ với thuộc tính [SerializeField]. Unity chỉ Serialization một số loại trường nhất định, vì vậy hãy tham khảo trang tài liệu để biết bộ quy tắc Serialization đầy đủ.
Quan sát một vài nguyên tắc cơ bản khi làm việc với các trường được tuần tự hóa:
- Sử dụng thuộc tính [SerializeField]: Thuộc tính SerializeField có thể hoạt động với các biến private hoặc protected để chúng xuất hiện trong Inspector. Điều này đóng gói dữ liệu tốt hơn so với việc đánh dấu biến public và ngăn một đối tượng bên ngoài ghi đè lên các giá trị của nó.
- Sử dụng thuộc tính Range để đặt giá trị tối thiểu và tối đa: Thuộc tính [Range(min, max)] rất hữu ích nếu bạn muốn giới hạn những gì người dùng có thể gán cho một trường số. Nó cũng tiện lợi thể hiện trường đó dưới dạng thanh trượt trong Inspector.
- Nhóm dữ liệu trong các lớp hoặc struct có thể tuần tự hóa để làm sạch Inspector: Định nghĩa một lớp hoặc cấu trúc công khai và đánh dấu nó bằng thuộc tính [Serializable]. Định nghĩa các biến công khai cho mỗi loại bạn muốn hiển thị trong Inspector.
Tham chiếu lớp có thể tuần tự hóa này từ một lớp khác. Các biến kết quả xuất hiện trong các đơn vị có thể thu gọn trong Inspector.

MỘT LỚP HOẶC CẤU TRÚC CÓ THỂ TUẦN TỰ HÓA CÓ THỂ GIÚP TỔ CHỨC NGƯỜI KIỂM TRA.
// VÍ DỤ: Một lớp có thể tuần tự hóa cho PlayerStats
using System;
using UnityEngine;
public class Player : MonoBehaviour
{
[Serializable]
public struct PlayerStats
{
public int TốcĐộDiChuyển;
public int ĐiểmMáu;
public bool HasHealthPotion;
}
// VÍ DỤ: Trường riêng tư hiển thị trong Inspector.
[SerializeField]
private PlayerStats _stats;
}
Kiểu dấu ngoặc nhọn hay thụt lề
Có hai kiểu thụt lề phổ biến trong C#:
- Allman style, còn được gọi là phong cách BSD (từ BSD Unix), đặt các dấu ngoặc nhọn mở trên một dòng mới.
- Kiểu K&R style, hay "kiểu dấu ngoặc duy nhất đúng", giữ dấu ngoặc mở trên cùng dòng với tiêu đề trước đó.
Cũng có các biến thể về kiểu thụt lề này. Các ví dụ trong hướng dẫn này sử dụng phong cách Allman từ Microsoft Framework Design Guidelines. Bất kể bạn chọn đội nào, hãy đảm bảo mọi người tuân theo cùng một kiểu thụt lề và dấu ngoặc.
// VÍ DỤ: Phong cách Allman hay BSD đặt dấu ngoặc nhọn mở trên dòng mới.
void Hiển thịConTrỏChuột(bool hiển thịChuột)
{
nếu (!showMouse)
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
else
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
}
// VÍ DỤ: Kiểu K&R đặt dấu ngoặc nhọn mở ở dòng trước.
void Hiển thịConTrỏChuột(bool hiển thịChuột){
nếu (!showMouse) {
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
ngược lại {
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
}
Quyết định một thụt lề đồng nhất
Thụt lề thường là hai hoặc bốn khoảng trắng. Hãy yêu cầu mọi người trong nhóm của bạn đồng ý về một cài đặt trong tùy chọn Trình chỉnh sửa mà không gây ra một cuộc chiến tranh nảy lửa về tab so với khoảng trắng. Lưu ý rằng Visual Studio cung cấp tùy chọn chuyển đổi tab thành khoảng trắng.
Trong Visual Studio (Windows), điều hướng đến Tools > Options > Text Editor > C# > Tabs.
Trên Visual Studio cho Mac, điều hướng đến Preferences > Source Code > C# Source Code. Chọn Kiểu Văn bản để điều chỉnh cài đặt.

CÀI ĐẶT TAB TRONG VISUAL STUDIO CHO WINDOWS
Đừng bỏ dấu ngoặc nhọn
Đừng bỏ qua dấu ngoặc nhọn – ngay cả đối với các câu lệnh một dòng. Dấu ngoặc nhọn giúp tăng tính nhất quán, điều này làm cho mã của bạn dễ đọc và dễ bảo trì hơn. Trong ví dụ này, các dấu ngoặc nhọn phân tách rõ ràng hành động, DoSomething, khỏi vòng lặp.
Nếu sau này bạn cần thêm một dòng Gỡ lỗi hoặc chạy DoSomethingElse, các dấu ngoặc sẽ đã ở sẵn. Giữ mệnh đề trên một dòng riêng biệt cho phép bạn dễ dàng thêm điểm dừng.
// VÍ DỤ: Giữ dấu ngoặc nhọn để rõ ràng...
for (int i = 0; i < 100; i++) { DoSomething(i); }
// … và/hoặc giữ mệnh đề trên một dòng riêng.
for (int i = 0; i < 100; i++)
{
DoSomething(i);
}
// AVOID: Bỏ dấu ngoặc nhọn
for (int i = 0; i < 100; i++) DoSomething(i);
Giữ dấu ngoặc nhọn để rõ ràng trong các câu lệnh nhiều dòng
Đừng xóa dấu ngoặc nhọn khỏi các câu lệnh nhiều dòng lồng nhau. Việc loại bỏ dấu ngoặc nhọn trong trường hợp này sẽ không gây ra lỗi, nhưng có thể gây nhầm lẫn. Sử dụng dấu ngoặc nhọn để rõ ràng, ngay cả khi chúng là tùy chọn. Các dấu ngoặc cũng đảm bảo rằng các thay đổi, chẳng hạn như thêm logic mới, có thể được thực hiện một cách an toàn mà không cần phải tái cấu trúc cấu trúc xung quanh.
// VÍ DỤ: Giữ dấu ngoặc nhọn để rõ ràng.
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
ExampleAction();
}
}
// AVOID: Loại bỏ dấu ngoặc nhọn khỏi các câu lệnh nhiều dòng lồng nhau
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
ExampleAction();Chuẩn hóa các câu lệnh switch
Định dạng có thể khác nhau, vì vậy hãy ghi lại các tùy chọn của nhóm bạn trong hướng dẫn phong cách và chuẩn hóa các câu lệnh switch của bạn cho phù hợp.
Đây là một ví dụ về việc bạn thụt lề các câu lệnh case. Nhìn chung, người ta khuyên nên bao gồm cả trường hợp mặc định. Ngay cả khi trường hợp mặc định không cần thiết (ví dụ, trong các trường hợp tất cả các khả năng đều được bao phủ), việc bao gồm một trường hợp đảm bảo rằng mã được chuẩn bị để xử lý các giá trị không mong muốn.
// VÍ DỤ: Thụt lề các trường hợp từ câu lệnh switch.
switch (someExpression)
{
trường hợp 0:
DoSomething();
break;
trường hợp 1:
DoSomethingElse();
break;
trường hợp 2:
int n = 1;
DoAnotherThing(n);
break;
}
Khoảng cách ngang
Một điều đơn giản như khoảng cách có thể cải thiện giao diện mã của bạn trên màn hình. Các tùy chọn định dạng cá nhân của bạn có thể khác nhau, nhưng hãy thử các gợi ý sau để cải thiện khả năng đọc.
Thêm khoảng trắng
Thêm khoảng trắng để giảm mật độ mã.Khoảng trắng bổ sung có thể tạo cảm giác phân tách trực quan giữa các phần của một dòng, cải thiện khả năng đọc.
// VÍ DỤ: Thêm khoảng trắng để các dòng dễ đọc hơn.
for (int i = 0; i < 100; i++) { DoSomething(i); }
// AVOID: Khôngkhoảngtrắng
for(inti=0;i<100;i++){DoSomething(i);}
Khoảng cách sau dấu phẩy
Sử dụng một khoảng trắng sau dấu phẩy giữa các đối số hàm.
// VÍ DỤ: Sử dụng một khoảng trắng sau dấu phẩy giữa các đối số.
CollectItem(myObject, 0, 1);
// AVOID:
CollectItem(myObject,0,1);
Không có khoảng trắng sau dấu ngoặc đơn
Đừng thêm khoảng trắng sau dấu ngoặc đơn và đối số hàm.
// VÍ DỤ: Không có khoảng trắng sau dấu ngoặc đơn và đối số hàm
DropPowerUp(myPrefab, 0, 1);
//AVOID:
DropPowerUp( myPrefab, 0, 1 );
Không có khoảng trắng giữa hàm và dấu ngoặc đơn
Không dùng khoảng trắng giữa tên hàm và dấu ngoặc đơn.
// VÍ DỤ: Bỏ khoảng trắng giữa tên hàm và dấu ngoặc đơn.
DoSomething()
// AVOID:
DoSomething ()
Tránh khoảng trắng bên trong dấu ngoặc
Cố gắng hết sức, tránh khoảng trắng bên trong dấu ngoặc.
// VÍ DỤ: Bỏkhoảngtrắngbêntrongdấungoặc
x = dataArray[index];
// AVOID:
x = dataArray[ index ];
Khoảng cách trước các điều kiện kiểm soát luồng
Sử dụng một khoảng trắng trước các điều kiện kiểm soát luồng và thêm một khoảng trắng giữa toán tử so sánh luồng và dấu ngoặc đơn.
// VÍ DỤ: Sử dụng khoảng trắng trước điều kiện; tách các dấu ngoặc đơn bằng một khoảng trắng.
while (x == y)
// AVOID:
while(x==y)
Khoảng cách với các toán tử so sánh
Sử dụng một khoảng trắng trước và sau các toán tử so sánh.
// VÍ DỤ: Sử dụng khoảng trắng trước điều kiện; tách các dấu ngoặc đơn bằng một khoảng trắng.
if (x == y)
// AVOID:
if (x==y)
Mẹo về khả năng đọc
Giữ các dòng ngắn. Xem xét khoảng trắng ngang: Quyết định chiều rộng dòng tiêu chuẩn (80-120 ký tự). Chia một dòng dài thành các câu lệnh nhỏ hơn thay vì để nó mở rộng.
Giữ nguyên thụt lề/hệ thống phân cấp: Thụt lề mã của bạn để tăng khả năng đọc.
Đừng sử dụng căn chỉnh cột trừ khi cần thiết cho khả năng đọc: Kiểu khoảng cách này căn chỉnh các biến nhưng có thể gây khó khăn cho việc ghép kiểu với tên.
Tuy nhiên, căn chỉnh cột có thể hữu ích cho các biểu thức bitwise hoặc các cấu trúc dữ liệu có nhiều dữ liệu. Chỉ cần lưu ý rằng điều đó có thể tạo thêm công việc cho bạn để duy trì sự thẳng hàng của cột khi bạn thêm nhiều mục hơn. Một số trình tự động định dạng cũng có thể thay đổi phần nào của cột được căn chỉnh.
// VÍ DỤ: Một khoảng trắng giữa loại và tên
public float TốcĐộ = 12f;
public float Gravity = -10f;
public float JumpHeight = 2f;
public Transform GroundCheck;
public float GroundDistance = 0.4f;
public LayerMask GroundMask;
// AVOID: Căn chỉnh cột
public float Speed = 12f;
public float Gravity = -10f;
public float JumpHeight = 2f;
public Transform GroundCheck;
public float GroundDistance = 0.4f;
public LayerMask GroundMask;
Khoảng cách dọc và các vùng
Bạn cũng có thể tận dụng khoảng cách dọc. Giữ các phần liên quan của kịch bản lại với nhau và tận dụng các dòng trống. Hãy thử những gợi ý này để sắp xếp mã của bạn từ trên xuống dưới:
- Nhóm các phương pháp phụ thuộc vào nhóm và/hoặc các phương pháp tương tự lại với nhau: Mã cần phải logic và mạch lạc. Giữ các phương thức thực hiện cùng một việc gần nhau, để người đọc logic của bạn không phải nhảy qua nhảy lại trong tệp.
- Sử dụng khoảng trắng dọc để tận dụng nhằm tách các phần riêng biệt trong lớp của bạn: Ví dụ, bạn có thể thêm hai dòng trống giữa:
- Khai báo biến và phương thức
- Các lớp và Giao diện
- các khối if-then-else (nếu giúp dễ đọc)
Giữ điều này ở mức tối thiểu và ghi chú trong hướng dẫn phong cách của bạn nếu có thể.
Sử dụng các vùng trong mã của bạn
Chỉ thị #region cho phép bạn thu gọn và ẩn các phần mã trong các tệp C#, giúp các tệp lớn dễ quản lý và dễ đọc hơn.
Tuy nhiên, nếu bạn làm theo lời khuyên chung cho các Lớp từ hướng dẫn này, kích thước lớp của bạn sẽ dễ quản lý và chỉ thị #region là thừa thãi. Hãy chia mã của bạn thành các lớp nhỏ hơn thay vì giấu các khối mã đằng sau các vùng. Bạn sẽ ít có xu hướng thêm một khu vực nếu tệp nguồn ngắn.
Lưu ý: Nhiều nhà phát triển coi regions to be code smells or anti-patterns. Quyết định với tư cách là một đội về phe nào trong cuộc tranh luận.
Định dạng mã trong Visual Studio
Đừng tuyệt vọng nếu các quy tắc định dạng này có vẻ quá tải. Các IDE hiện đại giúp thiết lập và thực thi chúng một cách hiệu quả. Bạn có thể tạo một mẫu các quy tắc định dạng và sau đó chuyển đổi các tệp dự án của mình cùng một lúc.
Để thiết lập các quy tắc định dạng cho trình chỉnh sửa kịch bản:
- Trong Visual Studio(Windows), điều hướng đến Tools > Options. Tìm Trình soạn thảo văn bản > C# > Định dạng kiểu mã. Sử dụng các cài đặt để sửa đổi các tùy chọn Chung, Thụt lề, Dòng mới, Khoảng cách và Ngắt dòng.
- Trong Visual Studio cho Mac, chọn Visual Studio > Preferences, sau đó điều hướng đến Source Code > Code Formatting > C# source code. Chọn Chính sách ở trên cùng. Sau đó đặt khoảng cách và thụt lề của bạn trong tab Kiểu văn bản. Trong tab Format của C#, điều chỉnh các cài đặt Indentation, New Lines, Spacing và Wrapping.
Nếu bất cứ lúc nào bạn muốn buộc tệp script của mình tuân thủ hướng dẫn phong cách:
- Trong Visual Studio (Windows), chuyển đến Edit > Advanced > Format Document (phím tắt Ctrl + K, Ctrl + D). Nếu bạn chỉ muốn định dạng khoảng trắng và căn chỉnh tab, bạn cũng có thể sử dụng Run Code Cleanup (Ctrl + K , Ctrl + E) ở cuối trình soạn thảo.
- Trong Visual Studio cho Mac, đi tới Edit > Format Document (Ctrl + I phím tắt)
Trên Windows, bạn cũng có thể chia sẻ cài đặt trình soạn thảo của mình từ Tools > Import and Export Settings. Xuất một tệp với định dạng mã C# của hướng dẫn phong cách và sau đó yêu cầu mọi thành viên trong nhóm nhập tệp đó.
Visual Studio giúp bạn dễ dàng tuân theo hướng dẫn phong cách. Định dạng sau đó trở nên đơn giản như sử dụng phím tắt.
Lưu ý: Bạn có thể cấu hình tệp EditorConfig thay vì nhập và xuất cài đặt Visual Studio. Làm điều này cho phép bạn chia sẻ định dạng dễ dàng hơn giữa các IDE khác nhau, và nó còn có lợi ích là làm việc với Version Control. Xem các tùy chọn quy tắc kiểu .NET code style để biết thêm thông tin.
Mặc dù điều này không cụ thể cho mã sạch, hãy chắc chắn xem 10 cách tăng tốc quy trình làm việc lập trình của bạn trong Unity với Visual Studio. Mã sạch dễ định dạng và tái cấu trúc hơn nhiều nếu bạn áp dụng các mẹo năng suất này.

CỬA SỔ XEM TRƯỚC HIỂN THỊ CÁC LỰA CHỌN HƯỚNG DẪN PHONG CÁCH CỦA BẠN.
Thiết lập tệp .editorconfig
Để thiết lập tệp .editorconfig trong Visual Studio Code, hãy làm theo các bước sau:
- Trong thư mục gốc của dự án, tạo một tệp mới có tên .editorconfig.
- Mở tệp .editorconfig và thêm các cài đặt cấu hình mong muốn của bạn.
Đây là một ví dụ cấu hình cho C#:
# tệp EditorConfig ở trên cùng
root = true
# Các dòng mới kiểu Unix với một dòng mới kết thúc mỗi tệp
[*]
end_of_line = lf
insert_final_newline = true
# 4 space indentation
[*.cs]
indent_style = space
indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
# Thụt lề Tab cho Makefile
[Makefile]
indent_style = tab
# Cài đặt cụ thể cho các tệp JSON
[*.json]
indent_style = space
indent_size = 2
Nhận thêm mẹo về phong cách mã
Tìm hiểu thêm về các quy ước đặt tên tại đây hoặc xem sách điện tử đầy đủ. Bạn cũng có thể khám phá ví dụ về hướng dẫn phong cách mã chi tiết của chúng tôi.