본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티unity로 게임 만들기

유니티29_게임 제작 과정 07_아이템 만들기

지금까지 살펴본 C# 구문을 이용해서 슈팅 게임을 계속 만들어 본다.

 

Item 만들기

 

게임에서 Item(아이템)은 다양한 역할이 있다.

이 게임에서는 아이템을 먹으면(충돌하면) Ship의 속도를 높이는 것과 coin(동전) 2가지 아이템을 만든다.

이 2가지 아이템은 공통으로 가지는 행위(메서드)가 있다.

 

  • 아이템을 작동하다
  • 아이템을 몇 초 후 사라지게 하다.

그러므로 이 추상 행위를 가진 추상클래스를 만들고 행위는 해당 아이템 스크립트에서 아이템에 맞게 구현하면 된다.

 

추상클래스 만들기

 

유니티에서 Practice Shooting Game 프로젝트를 불러온다.

Assets의 Scripts 폴더에 Item.cs 스크립트를 만든다.

스크립트를 아래와 같이 입력한다.

 

 

7~8번줄에서 추상메서드를 정의하면 클래스는 반드시 추상클래스가 되어야 한다.

*DestroyAfterTime : 시간이 지난 후 파괴하다

*RunItem : 아이템을 실행하다

 

이 추상클래스 Item은 모든 아이템의 부모클래스가 된다.

추상메서드는 각 아이템 스크립트에서 구현한다.

 

SpeedUp 아이템 스크립트

첫번째 아이템인 Ship의 속도를 높이는 SpeedUp 스크립트를 만든다.

Assets의 Scripts 폴더에 SpeedUp.cs 스크립트를 만든다.

스크립트를 아래와 같이 입력한다.

 

 

SpeedUp클래스는 Item 클래스를 상속받는다.

추상클래스를 override를 사용해서 구현해야 한다.

4초 후에 SpeedUp 아이템을 사라지게 하려면 이전에 Bullet을 사라지게 할 때 사용한 Invoke( )메서드를 사용한다.

 

Coin 아이템 스크립트

두번째 아이템인 동전 아이템 스크립트를 만든다.

Assets의 Scripts 폴더에 Coin.cs 스크립트를 만든다.

스크립트를 아래와 같이 입력한다.

 

 

이제 아이템들이 4초 후에 사라지게 하려면 부모클래스인 Item클래스의 Start메서드에서 추상메서드를 호출한다.

 

추상메서드 DestroyAfterTime메서드가 호출되면 각 아이템에 구현된 내용대로 4초 후에 각 게임오브젝트가 파괴된다.

 

GameObject 만들기

 

일단 게임오브젝트에서 사용할 기본 스크립트는 만들었다.

4초 후에 사라지는 메서드가 작동하는 지 테스트한다.

 

유니티에서 스크립트를 연결한 게임오브젝트를 만든다.

Hierarchy창에서 Create Empty로 GameObject 2개를 만들고 이름을 SpeedUp, Coin으로 정한다.

 

Inspector창에서 컴퍼넌트를 추가한다.

 

Sprite Renderer , Coin Script를 추가하고 Position(위치)도 적당하게 잡아준다.

스프라이트 모양은 Knob로 선택하고 색도 정해준다.

 

게임을 실행하면 4초 후에 두 아이템이 사라지는 지 확인한다.

 

SpeedUp 아이템 RunItem메서드 구현

먼저 SpeedUp 아이템의 RunItem메서드를 구현한다.

RunItem메서드의 실행 내용은 다음과 같다.

 

  1. Ship이 이 아이템과 충돌할 때 실행한다.
  2. 이동 키를 조작할 때의 속도를 높이기 위해 필드 speed 값을 높인다.
  3. 아이템은 사라진다.

충돌을 구현하려면 필요한 컴퍼넌트를 추가해야 한다.

여기서는 앞에서 사용했던 것을 SpeedUp 게임오브젝트에 추가한다.

 

Circle Collider 2D

Rigidbody 2D

 

이제 스크립트를 완성한다.

 

 

26번줄 부터 충돌이 일어났을 때 태그를 비교해서 Ship이면 RunItem메서드가 실행하도록 한다.

 

RunItem메서드가 실행되면 게임오브젝트 Ship에 장착된 Ship Control 스크립트 컴퍼넌트의 speed필드 값을 수정해야 하므로 게임오브젝트 Ship에 있는 Ship Control 컴퍼넌트에 접근해서 그 안에 정의된 필드값을 높이면 된다.

 

먼저 14번줄에서 GameObject타입의 변수 shipObject를 만들고 여기에 저장한다.

(가져와서 저장할 GameObject는)

Find(찾다) 메서드를 이용하여 Ship이라는 이름을 가진 GameObject를 찾아서 가져온다.

 

15번줄에서 ShipControl타입의 변수 shipControl에 저장한다.

(가져와서 저장할 컴퍼넌트는)

게임오브젝트 Ship을 저장하고 있는 변수shipObject에서 GetComponent(컴퍼넌트 가져오다) 메서드를 이용하여 컴퍼넌트로 추가된 ShipControl 스크립트를 가져온다.

 

16번줄에서 ShipControl 스크립트를 저장하고 있는 변수shipControl의 필드 speed 값에 1.5f를 곱한 후 다시 speed에 저장한다.

 

18번줄에서 speed를 올린 후 DestroyObject메서드를 이용하여 게임오브젝트SpeedUp 을 없앤다.

 

 

실행 후 이동키를 움직여 SpeedUp 게임오브젝트를 먹으면(충돌하면) Speed 값이 0.01에서 0.015로 변하는 것을 확인할 수 있다.

 

 

Coin 아이템 RunItem메서드 구현

Coin 아이템도 마찬가지로 충돌을 구현하기 위해 Rigidbody와 Circle Collider 컴퍼넌트를 추가한다.

 

 

스크립트는 Ship과 충돌했을 때 특별한 메서드는 나중에 구현하기로 하고 일단 게임오브젝트를 없애는 것으로 코딩해 둔다.

 

 

Layer Collision Matrix (레이어 충돌 매트릭스)

*matrix : (가로, 세로로 나열한) 행렬

 

게임에서 충돌에 사용하는 Collider(콜라이더)가 많아지면 게임오브젝트 상호간에 불필요한 충돌이 생길 수 있다.

이런 경우 충돌을 통제할 수 있는 도구Layer(레이어, 층)이다.

 

레이어(layer)는 유리 상자를 2개 쌓고 각 유리 상자 안에 뱀과 쥐를 넣어 두고 윗쪽을 화면이라고 생각하고 바라보는 것과 같다. 뱀과 쥐는 바라보는 시야에 겹치지만 서로 충돌하지 않는다.

 

게임에서도 충돌해서는 안되는 게임오브젝트 끼리는 레이어 층 별로 나누어 충돌하지 않도록 하는 구조이다.

 

레이어는 Tag옆에 있다.

처음에는 기본(Default) 값으로 설정되어 있다.

 

지금까지 충돌체( Collider )를 가지고 있는 게임오브젝트는 Ship , Bullet , Enemy , Item이다.

이 4종류의 레이어 목록을 만들어 본다.

Tag에서 목록을 추가한 방법과 같이 레이어 이름을 짓고 게임오브젝트를 해당 레이어로 선택하면 된다.

 

 

레이어를 추가로 만들었다.

 

이제 Ship의 Layer를 클릭한 후 Ship으로 레이어를 바꿔준다.

다른 게임오브젝트도 해당 레이어를 찾아 바꿔준다.

Bullet과 Enemy는 Prefabs폴더에서 더블 클릭한 후 바꿔준다.

 

충돌 설정하기

서로 충돌을 회피하도록 설정하는 것은 Edit메뉴의 Project Settings에서 할 수 있다.

메뉴를 클릭하면 아래와 같은 창이 뜬다.

 

 

Ship과 Bullet이 서로 충돌하지 않도록 하려면 행렬에서 두 축이 만나는 지점의 체크를 해제하면 된다.

 

위와 같이 하면 게임오브젝트의 Layer를 Bullet으로 지정한 것과 Ship으로 지정한 것은 서로 충돌하지 않는다.

 

최종적으로 다음과 같이 설정할 수 있다.

 

레이어 층별로 충돌을 통제하는 것은 게임 기능에서도 아주 유용하며, 불필요한 연산을 하지 않게 되어 게임의 성능 향상을 위해서도 꼭 필요한 설정이다.

 

끝.

다음 글에서는 item을 관리하는 스크립트를 만든다.

 

Wraven...