유니티 C# 코드 컨벤션Unity/Study2024. 6. 15. 18:31
Table of Contents
코드 컨벤션
한 프로젝트에서 여러 명이서 같이 작업을 할 때 준수해야 하는 명확한 규칙 또는 지침 세트를 제공하는 가이드이다.
코드 컨벤션 규칙을 준수하면 서로 작업한 코딩을 읽고, 관리하는 유지보수에 매우 용이하다.
회사의 프로젝트의 코드 컨벤션은 약간의 차이가 있긴 하지만, MSDN에서 제공하는 일반적인 C# 규칙을 따르는 게 기본이다.
이 문서는 부트 캠프를 진행하면서 팀원들과 유니티를 사용하면서 정한 코드 컨벤션을 정리한 문서이므로, 이 코드 컨벤션이 무조건 정답이 아니라는 것을 알아두면 되겠다.
줄 바꿈 규칙
private void FuncMethod() {
// NO!
}
private void FuncMethod()
{
// OK!
}
- 키워드나 함수, 클래스를 정의하는 등 새 괄호를 열 때는 줄바꿈을 한다
접근 제한자 명시
void Awake() { } // NO!
private void Awake() { } // OK!
- 접근 제한자를 분명하게 구분하고 이를 명시한다
명명 규칙
private int count; // NO!
private int _count; // OK!
[SerializeField] private string _name; // NO!
[SerializeField] private string name; // OK!
public int count { get; set; } // NO!
public int Count { get; set; } // OK!
public int GetValue(List<int> _list) { } // NO!
public int GetValue(List<int> list) { } // OK!
private void Awake()
{
int _count = 1; // NO!
}
private void Awake()
{
int count = 1; // OK!
}
- private, protected 필드는 ‘_’를 붙이고, 프로퍼티는 대문자로 시작한다
-
- [SerializeField] 속성을 가진 필드는 ‘_’ 없이 사용
- 매개변수나 로컬 변수 등은 그대로 쓴다
private int _idx; // NO!
private int _index; // OK!
private int Count() { } // NO!
private int GetCount() { } // OK!
private int GetCountEnemyInScreen() { } // OK!
private SpriteRenderer _sr; // NO! (이렇게 쓰기로 모두와 약속했다면 OK)
private SpriteRenderer _spriteRenderer // OK!
- 변수나 함수의 이름은 역할이 잘 드러나도록 지어준다
- 변수의 이름은 명사형으로, 함수의 이름은 동사형으로 지어준다
- 조금은 길어도 괜찮으니 축약하기보다는 풀네임을 써 준다
- 그런데 팀원들과 축약하는 걸로 약속했다면 사용해도 OK
필드 / 프로퍼티
public int count; // NO!
public int Count { get; set;} // OK!
public float Hp { // OK!
get => _hp;
set {
_hp = value;
// ...
}
}
private float _hp; // OK!
- 지나친 전역 변수 사용은 되도록 지양
- 필요한 필드는 되도록 private으로, 외부에서 접근해야 하는 경우 프로퍼티로 관리한다
주석
/// <summary>
/// 해당 메서드 간단 설명
/// </summary>
public void FuncMethod() { }
- 주석은 최대한 간단명료하게 작성한다
- 메서드의 주석은 /// Summary를 이용한다
인터페이스
public interface IAttackable { }
public interface IDamageable { }
- 형용사구로 인터페이스의 이름을 정의하고, 메서드 앞에 'I' 접두사를 사용한다
이벤트
public event Action OpeningDoor; // 이벤트 전
public event Action DoorOpened; // 이벤트 후
public event Action<int> PointsScored; // 점수를 버는 이벤트 명명
public event Action<CustomEventArgs> ThingHappened; // 어떠한 이벤트 발생에 대한 명명
// 이벤트 발생 메서드 예(OnDoorOpened, OnPointsScored 등)
public void OnDoorOpened()
{
DoorOpened?.Invoke();
}
public void OnPointsScored(int points)
{
PointsScored?.Invoke(points);
}
- 이벤트나 콜백의 경우, 어떤 상황에 관한 것인지 명시해준다
- 이벤트, 이벤트 처리 방법(구독자/관찰자) 및 발생 방법(게시자)에 대한 명명 체계를 선택한다
region 지시문
#region Properties
public int Count { get; set; }
public int Level { get; set; }
#endregion
#region Fields
// Collections.
private List<int> _numberList;
// Components.
private SpriteRenderer _spriteRenderer;
private BoxCollider2D _boxCollider2D;
// Events.
public event Action OnChangedResource;
#endregion
#region MonoBehaviours / Unity Flow
private void Awake() { }
private void Update() { }
#endregion
#region Init / Set
public void Initialize() { }
public void SetInfo() { }
#endregion
#region ...
// ...
#endregion
- 비슷한 속성의 코드들은 region 지시문을 통해 구분하여, 가독성을 크게 증가시킨다
마치며
여러 기타 규칙들이 존재하지만, 위에 코드 컨벤션만 지켜도 서로 코드를 이해하는데 큰 문제가 없었다.
코드 컨벤션 규칙을 준수하여 본인의 코딩 스타일도 가독성 좋게 개선하고, 팀원들 간의 협업도 용이하게 하도록 하자.
참고 링크
'Unity > Study' 카테고리의 다른 글
Update 사용 없이 Coroutine으로 게임 진행 구현 (0) | 2024.06.14 |
---|---|
유니티 실시간 딜레이 계산 (0) | 2024.01.24 |
유니티 로그라이크 방 타입에 맞는 오브젝트 생성 (0) | 2023.12.21 |
유니티 로그라이크 다음 방으로 이동 (0) | 2023.12.19 |
유니티 로그라이크 문으로 방 연결하기 (0) | 2023.12.18 |