Coding Convention cho Unity - C#
1. Quy tắc đặt tên (Naming Conventions)
1.1 Biến và hằng số
- Biến cục bộ (Local variables): sử dụng camelCase, bắt buộc có access modifier.
private int playerScore; protected float moveSpeed;
- Biến thành viên (Fields):
- Luôn có access modifier, không dùng
_
trước biếnprivate
.
private int health;
- Nếu là
public
,protected
dùng PascalCase và bắt buộc quy định{ get; set; }
.
public int MaxHealth { get; set; } [SerializeField] private float moveSpeed;
- Luôn có access modifier, không dùng
- Hằng số: Dùng toàn bộ chữ hoa với
_
giữa các từ.public const float GRAVITY = 9.81f; private readonly int MAX_LIVES = 3;
1.2 Hàm và phương thức (Methods)
- Dùng PascalCase.
void MovePlayer(); int CalculateScore();
1.3 Class, Struct và Interface
- Class & Struct: PascalCase.
public class PlayerController {} public struct PlayerStats {}
- Interface: Bắt đầu với chữ
I
, dùng PascalCase.public interface IDamageable {}
1.4 Namespace
- Dùng PascalCase, nên có cấu trúc theo thư mục.
namespace Game.Core {} namespace Game.UI {}
1.5 Enum
- Dùng PascalCase và gán giá trị mặc định.
public enum GameState { Idle = 0, Playing = 1, Paused = 2, GameOver = 3 }
2. Quy tắc định dạng mã (Formatting)
2.1 Dấu ngoặc nhọn {}
- Mở dấu
{
trên cùng dòng với khai báo.if (isRunning) { Run(); }
- Với khối code một dòng, luôn sử dụng
{}
.if (isJumping) { Jump(); }
2.2 Khoảng trắng
- Dùng 2 dấu cách (không dùng tab).
- Giữa các toán tử, thêm khoảng trắng.
int sum = a + b;
- Không có khoảng trắng trước dấu
(
trong phương thức.void Attack(int damage) {}
3. Quy tắc tổ chức mã (Code Organization)
3.1 Thứ tự trong Class
- Fields
- Properties
- Unity Methods (Start, Update, FixedUpdate, LateUpdate, ...)
- Methods (Public → Private)
- Event Handlers
Ví dụ:
public class Player : MonoBehaviour {
// Fields
private int health;
// Properties
public int Health { get; set; }
// Unity Methods
private void Start() {
Debug.Log("Game Started");
}
private void Update() {
Move();
}
// Methods
public void TakeDamage(int amount) {
health -= amount;
}
}
3.2 Quy tắc sử dụng MonoBehaviour
- Tránh sử dụng
Find()
,FindObjectOfType()
trongUpdate()
vì hiệu suất kém. - Dùng
SerializeField
thay vìpublic
cho biến cần hiển thị trên Inspector.
4. Bình luận và Tài liệu (Comments & Documentation)
- Sử dụng
///
để thêm mô tả.
/// <summary>
/// Di chuyển người chơi theo hướng chỉ định.
/// </summary>
/// <param name="direction">Hướng di chuyển.</param>
public void Move(Vector3 direction) {}
- Chỉ bình luận những đoạn code khó hiểu hoặc cần giải thích.
// Giảm máu của người chơi khi bị tấn công
health -= damage;
5. Xử lý sự kiện và delegate
- Tên event dùng PascalCase, có hậu tố
Event
.
public event Action OnPlayerDeathEvent;
- Khi gọi event, kiểm tra
null
.
OnPlayerDeathEvent?.Invoke();
6. Sử dụng ScriptableObject
- Dùng
ScriptableObject
để lưu dữ liệu chung thay vìSingleton
.
[CreateAssetMenu(fileName = "GameSettings", menuName = "Game/GameSettings")]
public class GameSettings : ScriptableObject {
public float volume;
public int maxEnemies;
}
7. Best Practices
- Sử dụng
readonly
hoặcconst
cho các biến không thay đổi. - Tránh sử dụng
static
trừ khi cần thiết. - Tránh sử dụng
string
so sánh trực tiếp (==
), thay vào đó dùngenum
hoặcnameof
. - Sử dụng
Linq
cẩn thận, tránh dùng trongUpdate()
. - Luôn kiểm tra
null
trước khi truy cập đối tượng. - Sử dụng LogMe thay vì Debug
8. Hướng dẫn import Convention Rule cho Visual Studio 2019 và Rider
Visual Studio 2019
- Mở Visual Studio 2019.
- Vào
Tools
→Options
. - Chọn
Text Editor
→C#
→Code Style
. - Chỉnh sửa theo quy tắc đặt tên và format đã đề cập.
- Lưu lại và áp dụng.
Rider
- Mở Rider.
- Vào
File
→Settings
. - Chọn
Editor
→Code Style
→C#
. - Cấu hình quy tắc đặt tên, format theo convention.
- Lưu lại và áp dụng.
Tài liệu này giúp duy trì mã nguồn thống nhất, dễ bảo trì và tối ưu hiệu suất trong Unity C#. Việc tuân theo coding convention sẽ giúp dự án của bạn dễ đọc, dễ mở rộng và chuyên nghiệp hơn.