본문 바로가기

Game/Unity & C#

1장 C# 복습 / 2장 디버깅 / 3장 싱글턴과 정적 멤버, 게임오브젝트와 월드

1장 C# 복습

 

1. C#을 선택하는 이유

- 각 언어들에 절대적인 우월함이나 부족함이 존재하지는 않는다. 모든 언어는 각각의 이점과 쓰임새가 있고, 유니티에서 사용되는 모든 언어는 게임을 만드는 데 있어 똑같이 쓸 만한 언어이다.

- 개발자들이 유니티를 접할 때 C#을 선택하는 경우 기존에 만들어진 자료 대부분에 가장 손쉽게 접근할 수 있기 때문이다.

- C#은 다른 분야의 애플리케이션 개발에 큰 영향력을 가지고 있는 관계로 대부분의 유니티 튜토리얼은 C#을 염두에 두고 만들어졌다.

- C#은 유니티에서도 사용하는 닷넷 프레임워크의 역사와 함께한다.

- C#은 게임 개발 분야에 큰 영향력을 지닌 C++과 가장 닮아있기도 하다.

- C#을 배움으로써 현재의 게임 업계에서 유니티 프로그래머에게 요구하는 것과 같은 기술을 독자가 사용하게 될 가능성이 커진다고 할 수 있다.

2. 주석 XML 템플릿

- 함수 제목 위에 ///를 입력하면 XML 주석이 자동으로 생성된다.

3. SendMessage & BroadcastMessage

- 이 함수들은 실행할 함수의 이름을 문자열의 값으로 지정해 실행할 수 있게 해준다.

 

 

2장 디버깅

 

1. ToString 메소드 재정의
- ToString은 오브젝트를 사람이 읽을 수 있는 문자열로 변환해 콘솔에 출력할 수 있도록 해준다.
- C#의 모든 클래스는 기본적으로 ToString 메소드를 상속한다.
- 즉 상속과 다형성을 이용할 수 있어 독자가 만드는 클래스의 ToString 메소드를 필요에 따라 더 가독성 좋고 정확하게 클래스 멤버를 디버깅 문자열로 표시할 수 있도록 재정의(override)해 사용자화할 수 있다는 이야기다.

 

2. 전처리기 사용
- 임의의 전역 선언(global define)은 특정 단락을 제외하는 것을 활성화 혹은 비활성화 할 수 있도록 해주는 특별한 전처리기(preprocessor) 플래그다.
- 전역 선언을 하려면 애플리케이션 메뉴의 Edit -> Project Settings -> Player 를 선택한다. 그런 다음 Configuration -> Scripting Define Symbols 필드에 변경하려는 선언의 이름을 입력한 후 Enter
- 선언을 제거할 때에는 접두사로 '/'를 붙이면 된다.
- 복수의 선언을 추가할 때는 사이에 세미콜론을 추가해 구분하면 된다.

3. 시각적 디버깅
- 추상적인 디버깅이나 데이터를 문자로 표시하는 디버깅은 일반적으로 적당한 방법이지만 항상 바람직하지는 않다.
- 때때론, 1000개의 글자보다 그림 하나가 낫다.
- 유니티에서는 충돌체의 와이어프레임 바운딩 박스(bounding box)나 카메라의 프러스텀(frustum)같은 많은 기즈모(gizmo)를 자동으로 제공하고 있다.
- DrawRay, DrawWireSphere 등의 명령어를 사용해서 그릴 수 있다.

4. 오류 기록

- 게임을 테스터에게 배포하기 위해 컴파일 및 빌드를 하는 시점엔 게임 플레이 중 오류와 예외가 일어났는지, 그리고 언제 일어났는지를 기록할 방법이 필요하다.
- 한 가지 방법은 로그(기록) 파일을 이용하는 것이다. 로그 파일은 게임의 실행시점에 컴퓨터에 사람이 읽을 수 있는 형태로 생성하는 텍스트 파일로서 발생하는 모든 오류에 대해 자세한 내용을 기록한다.
- 한 가지 방법은 내장된 Application 클래스를 이용함으로써 델리게이트를 통해 예외 통지를 받는 방법이다.

 

* C#의 델리게이트란 무엇일까?

- 변수를 하나 만들고 여기에 일반적인 값 대신 함수에 대한 참조를 할당한다고 생각해보자. 이렇게 하고 나면 나중에 이 변수를 불러서 함수처럼 함수의 참조를 호출할 수 있게 된다. 이후에 새로운 함수나 기존의 다른 함수에 대한 참조를 변수에 다시 할당할 수도 있다. 이것이 델리게이트가 기본적으로 작동하는 방식이다.
- C++에 대입해서 생각해보면 델리게이트는 실질적으로 함수 포인터에 대응하는 것으로 생각하면 된다. 이와 같이 델리게이트는 함수를 참조해 부르기 위한 특별한 형식이다. 델리게이트는 확장 가능한 콜백 시스템이나 이벤트 통보를 만들기에 이상적이다. 예를 들면, 델리게이트 형식의 리스트나 배열을 만들게 되면, 서로 다른 형식을 가진 수많은 클래스가 이 리스트에 추가됨으로써 콜백을 받도록 등록할 수 있다.

 

5. 에디터 디버깅

- 디버그 모드를 켜고 디버깅을 하자

 

6. 프로파일러

- 유니티 프로 버전에서만 사용이 가능하다.
- 메뉴의 Window -> Profiler 를 클릭해서 사용할 수 있다.

 

3장 싱글턴과 정적 멤버, 게임오브젝트와 월드

- 유니티의 모든 레벨이나 게임 월드는 '씬' 형태로 표시되며, 씬은 x, y, z축으로 이루어진 데카르트 3D 좌표계에 위치한 게임오브젝트들의 집합이다. 씬의 크기 단위는 유니티의 단위로 표시되며, 이 단위는 미터에 대응한다.

 

1. 게임오브젝트

- 게임오브젝트(GameObject)는 기본적인 단위나 씬 안의 개체 등 여러 가지 의미를 가진다. 게임오브젝트는 일상에서의 모든 '것'에 대응하는 개념이다.
- 컴포넌트는 기본적으로 MonoBehaviour에서 파생한 클래스로서 씬 안의 게임오브젝트에 붙어 동작을 변화시킬 수 있다.

 

2. 컴포넌트 상호작용

1) GetComponent

2) GetComponents

3) GetComponentsInChildren

4) GetComponentsInParent

 

* localPosition과 position의 차이

- localPosition : 오브젝터 인스펙터의 트랜스폼 컴포넌트에서 보이는 position. localPosition은 부모의 위치, 혹은 부모가 없는 경우 월드의 원점을 기준으로 한다.

- position : 오브젝트의 위치를 항상 월드의 원점을 기준으로 한다.

 

3. 게임오브젝트와 월드

- 유니티의 또 다른 중추적인 기능으로 스크립트에서 씬 안의 오브젝트를 검색하는 기능이 있다(특히 런타임에 인스턴스화된 오브젝트). '플레이어 오브젝트 가져오기'나 '씬 안의 모든 적 가져오기'와 같은 것들은 적이나 능력치 향상 아이템을 재생성하거나, 플레이어의 위치를 변경하거나, 오브젝트 간 충돌을 검사하는 등 여러 가지 기능을 위해 꼭 필요하다. 지정한 게임오브젝트의 참조를 얻기 위해 유니티는 게임오브젝트 클래스에 연관한 함수 세트를 제공한다. 이 함수들은 유용하지만 호출 비용이 비싸므로 가능하면 Start나 Awake와 같은 일회성 이벤트에서 부르도록 해야한다.

 

4. 소멸되지 않는 오브젝트

- DontDestroyOnLoad 함수를 이용해서 계속 유지되는 오브젝트를 쉽게 만들 수 있다.

 

5. 싱글턴 오브젝트와 정적 멤버

- 어떤 클래스들은 인스턴스화하는 방법에 있어 다른 클래스와 근본적으로 다른 점을 가지고 있다. 대부분의 클래스는 프로퍼티와 동작의 집합을 위한 원형을 선언해 게임오브젝틏럼 씬에 여러 번 인스턴스화 할 수 있다.

- 싱글턴은 대개 여러 씬에 걸쳐 지속적으로 유지되는 오브젝트다. 싱글턴을 싱글턴으로 만드는 기본적인 요소는 항상 메모리에 클래스의 인스턴스가 하나만 존재한다는 것뿐이다. 

'Game > Unity & C#' 카테고리의 다른 글

5장 카메라, 렌더링, 씬 (1)  (0) 2019.07.01
4장 이벤트 주도적 프로그래밍  (0) 2019.06.01
unity Lambert & Blinn phong  (0) 2019.05.19
unity SurfaceOutputStandard  (0) 2019.05.19
unity uv & vertex color  (0) 2019.05.19