클린코드 특강

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에서 이 값을 조절할 때 설정한 범위를 벗어나지 못한다.

Range를 사용하면 슬라이드바가 나와 값을 설정할 때 편하다.

 

 

ScriptableObject

[CreateAssetMenu(fileName = "DefaultAttackData", menuName = "TopDownController/Attacks/Default", order = 0)]

 

CreateAssetMenu

ScriptableObject 파생 유형을 Assets/Create 하위 메뉴에 자동으로 나열하여 해당 유형의 인스턴스를 .asset 파일로 쉽게 생성하고 프로젝트에 저장할 수 있도록 표시

 

fileName

이 유형의 새로 생성된 인스턴스에서 사용되는 기본 파일 이름

 

menuName

Assets/Create메뉴에 표시되는 이 유형의 표시 이름

 

order

Assets/Create 메뉴 내 메뉴 항목의 위치 (int형, 0 이면 맨 위)

 

Scriptable Object 생성
생성된 ScriptableObject
ScriptableObject의 Inspector창

 

 

[Serializable]

클래스 변수를 사용한 곳에선 해당 클래스의 구조를 모르는 상태이기 때문에

클래스 변수를 [SerializeField]로 설정해줘도 인스펙터 창에서 보이지 않는다.

 

클래스 위에 [Serializable]을 달아서 직렬화가 가능한 상태로 만들어준 후

클래스 변수에 [SerializeField]를 설정해주면 Inspector창에서 클래스의 구조가 보이고, 변수값을 설정해줄 수 있게 된다.

Serializable 설정해준 class
Serializable을 해준 클래스를 갖다 쓰는 Script의 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