본문 바로가기

Unity/▶ Game Development: 2D Game

[2D Game] #1. 2D 게임 프로젝트 생성

728x90
반응형

유니티 2D 프로젝트

유니티 2D 프로젝트와 3D 프로젝트에는 유의미한 차이는 없다. 유니티 프로젝트 생성 이후 언제든지 현재 프로젝트 설정을 2D3D 사이에 변경이 가능하다.

2D 프로젝트의 주요 특징

  • 이미지 파일을 스프라이트 타입으로 임포트 한다.
  • 기본 생성 카메라가 직교 모드를 사용한다.
  • 라이팅 설정 중 일부가 비활성화된다.
  • 씬 창이 2D 보인다.

우리는 2D 프로젝트를 사용하는 동안 물리와 렌더링에 관해서는 리지드 바디 2D와 같은 2D 컴포넌트를 주로 사용하게 된다.

 

하지만 프로젝트의 2D/3D 모드 설정과 같은 사용할 컴포넌트의 종류는 서로 상관이 없다. 게임 장르에 따라 2D 프로젝트에서 2D가 아닌 일반 컴포넌트를 사용해도 문제가 없다.

 

2D 컴포넌트는 Vector2로 동작하거나 Vector3로 동작하되 z 값을 무시한다. 하지만 실제 2D 오브젝트의 위치 값이 Vector2이 아니라 Vector3로 위치와 스케일을 저장하되 원근감이 없으니 z 값이 의미 없으니 Vector2로서 사용된다.

Uni-Run 프로젝트 생성

프로젝트가 열리면 [cmd+s]를 눌러 현재 활성화된 임시 씬을 Main이라는 이름으로 프로젝트에 저장한다. 씬 경로는 기본 경로인 프로젝트의 Asset 폴더를 그래로 사용한다.

해당 프로젝트는 이미 만들어진 소스 파일을 이용한다.

시작 지점 만들기

가장 먼저 캐릭터가 배치될 시작 지점을 구성한다. 시작 지점에는 캐릭터가 서 있을 기본 발판과 낙사 판정 영역을 만든다.

 

프로젝트에 미리 포함된 스프라이트 에셋을 사용해 시작 지점의 발판을 만든다. 스프라이트는 2D 그래픽과 UI를 그릴 때 사용하는 텍스처 에셋이다.

스프라이트:  2D 그래픽과 UI를 그릴 때 사용하는 텍스처 이미지 파일

 

  1. 프로젝트 창 > Sprites 폴더에서 Platform_Long 스프라이트를 하이어 라키 창으로 이동
  2. Platform_Long 게임 오브젝트의 이름을 Stat Platfrom으로 변경
  3. Stat Platfrom 게임 오브젝트의 위치를 (0,- 1, 0)으로 변경 
  4. Box Colider 2D 컴포넌트 추가

하이어 라키 창

이때 우리는 물리적인 표면을 추가하기 위해 박스 콜라이더 2D 컴포넌트를 사용했다.

데드존 만들기

플레이어 캐릭터가 점프하여 다음 발판에 착지하지 못하고 아래로 떨어지는 것을 감지하고, 플레이어 캐릭터가 죽게 하는 낙사 판정 영역을 만들어보자.

 

낙사 판정은 게임 화면의 하단 영역에 가로로 긴 트리거 콜라이더를 만들어 구현한다. 그렇게 데드존 게임 오브젝트를 만든 다음 Dead 태그를 할당한다. 트리거 콜라이더는 다음 포스팅을 참고한다.

https://udangtangtang-cording-oldcast1e.tistory.com/81

 

[Dodge] #4. 탄알 생성

탄알 게임 오브젝트를 생성하고 필요한 컴포넌트를 추가해보자. 탄알은 생성된 후 앞쪽 방향으로 일정 속도로 나아가며, 충돌한 오브젝트가 플레이어면 해당 게임 오브젝트를 파괴한다. 탄알

udangtangtang-cording-oldcast1e.tistory.com

Dead 태그는 플레이어 캐릭터를 죽게 하는 게임 오브젝트에 할당한 태그이다. Dead 태그를 가진 게임 오브젝트와 플레이어 캐릭터가 닿으면 플레이어 캐릭터가 사망하게 설정한다.

  1. Empty Create 생성
  2. 생성된 게임 오브젝트의 이름은 DeadZone, 위치를 (0, -8, 0)으로 변경
  3. Box Colider 2D 컴포넌트 추가
  4. Box Colider 2D 컴포넌트의 Is Trigger 체크, 사이즈는 (50, 2)로 변경

DeadZone 설정

캐릭터 스프라이트 편집

캐릭터 스프라이트 편집

준비된 소스 파일에는 각각의 스프라이트가 존재한다. 스프라이트 시트는 여러 이미지를 하나의 이미지 파일로 합친 것이다. 캐릭터가 연속적으로 움직이는 모습을 여러 이미지 파일로 만드는 것보다 한 이미지 파일로 합쳐서 관리하는 것이 관리도 편하고 성능이 좋다.

 

스프라이트 시트: 여러 이미지를 하나의 이미지 파일로 합친 것

 

유니티는 2D 프로젝트에서 이미지를 기본적으로 싱글 스프라이트 모드로 가져온다. 싱글 스프라이트에서 하나의 스프라이트 에셋은 하나의 스프라이트를 표현한다. 스프라이트를 멀티플 스프라이트 모드로 변경하면 하나의 스프라이트 에셋을 여러 개의 새별 스프라이트로 잘라 사용할 수 있다.

싱글 스프라이트 하나의 스프라이트를 표현
멀티플 스프라이트 하나의 스프라이트 에셋을 여러 개의 새별 스프라이트로 잘라 사용

캐릭터 게임 오브젝트 준비

캐릭터 게임 오브젝트로서 갖춰야 할 요건은 다음과 같다.

  • 물리 상호 작용
  • 조작을 감지하고 점프
  • 사망
  • 애니메이션 재생과 제어
  • 효과음 재생

플레이어 캐릭터가 될 게임 오브젝트를 만들고 필요한 컴포넌트를 추가한다. 먼저 캐릭터 스프라이트를 사용한 Player 게임 오브젝트를 만들고 Player 태그를 할당한다.

  1. 프로젝트 창에서 캐릭터 스프라이트에서 첫 번째 스프라이트를 하이어 라키에 드래그&드롭
  2. 생성된 캐릭터 오브젝트의 이름을 Player 태그를 Player로 변경
  3. Player 게임 오브젝트의 위치를 (-6, 2, 0)으로 변경

유니티 편집창

리지드 바디 2D 컴포넌트 추가

  1. Player 게임 오브잭트에 Rigdbody 2D 컴포넌트 추가
  2. Rigdbody 2D 컴포넌트의 Colision DetectionContinuous로 변경
  3. Rigdbody 2D 컴포넌트의 Constraints 펼치기 > Freeze Rotation의 Z 체크

하이어라키 / 인스펙터

리지드 바디 2D 컴포넌트의 충돌 감지 방식을 이산(Discrete)에서 연속(Continuos)으로 변경했다. 

이산(Discrete) 충돌 감지를 일정 시간 간격으로 끊어서 실행한다.
연속(Continuos) 움직이지 이전 위치와 움직인 다음 위치 사이에서 예상되는 충돌까지 함께 감지한다.
충돌 감지가 상대적으로 정확하지만 더 높은 성능을 요구한다.

Freeze Rotation의 Z 체크하여 캐릭터가 회전하는 상황을 예방한다.

콜라이더 2D 컴포넌트 추가

  1. Player 게임 오브젝트에 Circle Colider 2D 추가
  2. Circle Colider 2D 컴포넌트의 Offset을 (0, -0.57), Radius를 0.2로 변경
Offset Circle Colider 2D 컴포넌트의 위치
Radius Circle Colider 2D 컴포넌트의 반지름

박스 콜라이더 2D 컴포넌트를 사용한 이유는 Player 게임 오브젝트가 점프 후 각진 모서리에 안착 시 부드럽게 모서리를 타고 올라가기 위함이다.

오디오 소스

해당 프로젝트는 이미 만들어진 소스 파일을 이용한다.

 

오디오 소스 컴포넌트는 게임 오브젝트에 소리를 낼 수 있는 능력을 부여한다. Player 게임 오브젝트가 점프 소리를 내도록 오디오 소스 컴포넌트를 추가한다.

  1. Player 게임 오브젝트에 Audio Source 컴포넌트 추가
  2. Audio Source 컴포넌트에서 AudioClip 필드 옆의 선택 버튼 > 선택 창에서 jump 오디오 클립 클릭
  3. Audio Source 컴포넌트의 Play on Awake 체크 해제

하이어라키 / 인스펙터

Player 게임 오브젝트에 오디오 소스 컴포넌트를 추가하고, 미리 준비된 jump 오디오 클립을 해당 오디오 소스 컴포넌트가 재생할 오디오 클립으로 할당한다.

 

이때 오디오 소스 컴포넌트는 소리를 재생하는 부품이지 소리를 담은 파일 아니라는 점에 주의한다.

Play on Awake는 오디오 소스 컴포넌트가 활성화되었을 때 최초 1회 오디오를 자동 재생하는 옵션이다. 해당 설정이 활성화 되있을 시 시작과 동시에 점프 소리가 1회 무조건 재생되게 된다.

Play on Awake : 오디오 소스 컴포넌트가 활성화 되었을 때 최초 1회 오디오를 자동 재생하는 옵션

 

728x90
반응형
댓글