클린코드 특강
1. 기이한 이름(Mysterious Name)
변수명, 함수명 등 이름만 보고도 무슨 일을 하는지 알아야 한다.
이름이 잘 안 떠오르면 설계가 잘못되진 않았는지 생각해봐야한다.
int f; // 안좋은예시
int firstName; // 좋은 예시
2. 중복 코드(Duplicated Code)
DRY(Don't Repeat Yourself) 원칙. 리팩토링의 기본
중복된 코드는 함수로 만들어야 한다.
상속도 잘 활용하는 것이 좋다.
3. 긴 함수(Long Function)
짧은 함수: 재사용성 좋음, 코드 이해도에도 좋음 -> 공유에 좋음
짧은 함수를 여러 개 호출하는 구조가 긴 함수보다 좋다.
코드 줄이 길어지더라도 하나의 역할을 하는 함수를 여러 개 작성, 사용하는 것이 더 좋다.
알고리즘 코드를 짤 때에는 1. 성능 2. 가독성 이 중요하므로
알고리즘의 코드를 짤 때에도 짧은 함수를 사용하는 것이 좋다.
4. 전역 변수의 남용(Global Data)
전역 변수: 어디서나 변경 가능, 변경 시점을 추적하기 힘듦, 디버깅 어려워짐 => 버그의 원인
변수를 캡슐화하는 것을 습관화하자
싱글톤 패턴을 싫어하는 사람들은 싱글톤 객체가 사실상 전역변수이다라고 주장하는 사람도 있다.
캡슐화 개념자체가 전역변수를 막는데에도 있다.
전역 변수를 사용하게 되는 상황도 있음 - 웬만해선 사용하지 않는다.
1. DB설정, 게임 설정값, 환경 변수
- 모든 곳에서 참조를 해야하기 때문에
2. 싱글톤
- 대표적인 전역변수 사용 예시
3. DB 캐쉬 저장
5. 주석의 남용(Comments)
올바른 주석은 좋지만 코드만으로 명확하게 이해되는 코드가 최고다.
주석: 코드 변명 장치에 가까움
함수의 의도 등을 주석으로 남기는 것은 좋다
무조건 사용하지 말라는 것이 아닌, 적재적소에 사용하는 것이 좋다.
함수 이름 잘 정하는 팁
쉬운영어로 작성하자 - 아무도 모르는 영어단어를 사용하지 말자
동사가 앞 목적어가 뒤 (사실 그렇게 중요하진 않음)
게임 개발 숙련 강의 정리
[Range(min, max)] 어트리뷰트
[Range(1, 100)] public int maxHealth;
[Range(1f, 100f)] public float speed;
[Range(1,100)] 어트리뷰트를 지정하면 해당 변수는
1에서 100까지의 값만을 가질 수 있다.
Inspector에서 이 값을 조절할 때 설정한 범위를 벗어나지 못한다.
ScriptableObject
[CreateAssetMenu(fileName = "DefaultAttackData", menuName = "TopDownController/Attacks/Default", order = 0)]
CreateAssetMenu
ScriptableObject 파생 유형을 Assets/Create 하위 메뉴에 자동으로 나열하여 해당 유형의 인스턴스를 .asset 파일로 쉽게 생성하고 프로젝트에 저장할 수 있도록 표시
fileName
이 유형의 새로 생성된 인스턴스에서 사용되는 기본 파일 이름
menuName
Assets/Create메뉴에 표시되는 이 유형의 표시 이름
order
Assets/Create 메뉴 내 메뉴 항목의 위치 (int형, 0 이면 맨 위)
[Serializable]
클래스 변수를 사용한 곳에선 해당 클래스의 구조를 모르는 상태이기 때문에
클래스 변수를 [SerializeField]로 설정해줘도 인스펙터 창에서 보이지 않는다.
클래스 위에 [Serializable]을 달아서 직렬화가 가능한 상태로 만들어준 후
클래스 변수에 [SerializeField]를 설정해주면 Inspector창에서 클래스의 구조가 보이고, 변수값을 설정해줄 수 있게 된다.
Quaternion * Vector
Vector2 v;
float degree;
Quaternion.Euler(0, 0, degree) * v;
v 벡터를 degree만큼 Z축으로 회전시켜라
GetComponentInChildren
"나를 포함해서" 자식까지 이 컴포넌트가 붙어있는지 검사한다.
나(gameObject)에 해당 컴포넌트가 붙어있으면 내 컴포넌트를 불러오고, 없으면 자식의 컴포넌트를 불러온다.
transform.right
transform.up, transform.forward, .. 등등은 자신의 월드 좌표 up, forward 등을 반환한다.
transform.right = _direction;
월드 좌표기준 right값을 _direction으로 바꿔주는 코드
비트 연산
levelCollisionLayer.value == (levelCollisionLayer.value | (1 << collision.gameObject.layer))
1 << collision.gameObject.layer는 해당 레이어를 나타내는 비트만 1로 설정된 값을 생성
| (OR)를 사용해서 두 레이어 마스크 합치고 결과를
levelCollisionLayer와 비교
비교한값이 true면 지정해준 layer와 충돌을 했다는 뜻이고
false면 지정해준 layer와 충돌을 하지 않았다는 뜻
tag, name등을 이용해 비교하는 방법도 있지만
layer를 사용하는 방법이 굉장히 빠르기 때문에 자주 사용됨
collision.ClosestPoint()
가장 가까운 포지션을 받아오는 ClosestPoint()
OnTriggerEnter2D(Collider2D collision)
{
collsiion.ClosestPoint(transform.position);
}
비주얼 스튜디오 클래스 다이어그램
Trail Renderer 한 번 써보기..
'내일배움캠프(Unity)' 카테고리의 다른 글
클린 코드 특강2 (0) | 2023.12.12 |
---|---|
게임 개발 숙련 강의 정리2 (0) | 2023.12.11 |
TIL - 코드리뷰 및 팀프로젝트 발표 (0) | 2023.12.07 |
TIL - InvalidOperationException (0) | 2023.12.06 |
TIL - 팀프로젝트 (0) | 2023.12.05 |