본문 바로가기

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

유니티30_게임 제작 과정 08_아이템 관리자

Item Manager(아이템 관리자)

 

Item도 게임 중에 화면에 나타나게 해야 하므로 프리팹(Prefab)으로 만들어야 한다.

Bullet과 Enemy를 프리팹으로 만들고 관리 스크립트를 작성한 것과 같은 방법으로 한다.

 

 

Hierarchy창에서 SpeedUp과 Coin을 Prefabs폴더로 하나씩 끌어서 놓아 프리팹을 만든다.

 

Item관리 스크립트 만들기

Hierarchy창에 빈 게임오브젝트를 만들고 이름을 ItemManager로 바꾼다.

이 게임오브젝트에 추가할 컴퍼넌트(스크립트)를 작성한다.

 

Scripts폴더에 새 스크립트 파일을 만든다.

이름을 ItemManager로 바꾼 후 더블클릭하여 코드 편집기를 실행한다.

 

 

Enemy를 만들었던 PrefabManager 스크립트에서와 마찬가지로 ItemManager 클래스에는 Coin, SpeedUp 프리팹(Prefab)을 인스턴스(객체)로 만들어 Scene(화면)의 특정 위치에 불러오는 코드를 작성한다.

 

 

7번줄에서 ItemPrefabs라는 이름으로 GameObject타입의 배열(Array)을 선언한다.

Enemy를 구현할 때는 각자 필드를 만들어서 구현했는데 아이템은 배열을 사용했다.

 

15번줄에서 아이템을 생성하는 SpawnItem메서드는 매개변수로 게임오브젝트와 위치를 받는다.

17번줄에서 item이라는 게임오브젝트 타입의 변수에 전달 받은 인수를 매개변수로 인스턴스(객체)를 만들어 저장한다.

18번줄에서 만든 객체의 위치에 인수로 전달 받은 위치를 저장한다.

 

11번줄에서 SpawnItem메서드를 배열의 요소 2개를 위치와 함께 인수로 전달하여 실행한다.

 

스크립트를 저장한다.

 

 

ItemManager 스크립트를 컴퍼넌트에 추가한다.

아이템을 배열(Array)로 선언했으므로 배열의 크기(Size)를 2로 정한다.

배열의 첫번재 요소 Element 0 에 프리팹의 SpeedUp을 지정하고 Element 1에는 Coin을 선택한다.

 

 

프로젝트를 실행하면 위와 같이 아이템 2개가 지정한 위치에 만들어진다.

 

아이템 랜덤 생성

위와 같이 아이템을 생성하면 아이템이 항상 같은 위치에 만들어진다.

아이템이 만들어지는 위치를 매번 다르게 하려면 Random(랜덤)을 사용할 수 있다.

 

Struct(구조체)를 이용한 아이템 생성

 

변하지 않는 위치 값(Value)을 가진 객체를 생성해야 하므로 Struct(구조체)를 만들면 된다.

Struct 구조체는 다음과 같이 작성한다.

 

 

21번줄에 Coordinate(좌표)라는 struct(구조체)를 선언한다.

23~24번줄에 구조체 필드 x, y를 선언한다.

26번줄에 모든 필드를 매개변수로 하는 생성자를 만든다.

28~29번줄에 인수로 받은 x, y값을 필드에 저장한다.

32번줄에 Vector2타입의 GetPosition메서드를 만든다.

이 메서드는 저장된 필드 값으로 Vector2 객체를 생성하여 반환한다.

 

클래스 제일 윗부분에 조금 전에 만든 Coordinate 구조체를 이용하여 인스턴스(객체)를 만들어 배열에 저장한다.

 

7번줄에서  Coordinate 타입의 배열을 정의하고 Coordinates라는 이름의 변수에 객체를 만들어 저장한다.

9~15번줄에서 원하는 좌표를 전달하는 객체를 생성한다. 여기서는 7개를 만들어서 저장했다.

 

이 글 처음에 아이템을 테스트할 때는 18번줄 처럼 게임오브젝트 타입의 배열을 선언하고,

실제 구현은 Start메서드에서 24,25번줄 처럼 SpawnItem에 전달할 인수(요소 번호, 좌표 객체)를 하나씩 따로 만들었다.

 

하지만 이번에는 게임오브젝트 3개를 배열로 만들어 두고 그것의 요소(element)번호와 사용할 좌표 객체를 랜덤(Random)으로 정한다.

 

20번줄에서 게임오브젝트 타입의 배열을 정의하고 ItemPrefabs라는 변수에 new키워드로 요소가 3개인 게임오브젝트 배열 객체를 생성하여 저장한다. 그러면 변수에는 게임오브젝트[0] , [1] , [2] 가 들어가게 된다.

 

29번줄에서 게임오브젝트 타입의 변수 itemPrefab을 만들고 여기에 저장할 ItemPrefabs[ 요소 번호 ]를 정한다.

ItemPrefabs에 생성된 배열 요소 중 어떤 요소 번호를 선택할 것인지는 Random.Range( )메서드를 이용하여 정한다.

 

Random.Range ( ) 메서드는 정한 범위 내에서 랜덤수(임의의 수)를 선택하여 반환한다.

범위는 괄호 안에 (최솟값, 최댓값)으로 표시한다. 

 

int(정수)를 입력하면 최솟값은 포함하고 최댓값은 포함하지 않는다.

예를 들어 Random.Range(0, 5)는 0,1,2,3,4 중에서 랜덤수를 반환한다.

 

float(소수)인 경우는 최솟값, 최댓값 둘 다 포함하여 범위를 나타낸다.

Random.Range(-5.0f, 5.0f)는 -5.0 ~5.0 사이의 값 중에서 랜덤수를 반환한다.

 

29번줄에서는 최댓값을 ItemPrefabs의 Length(길이)로 정했다.

ItemPrefabs.Length는 배열 요소의 갯수이므로 3이다.

그러므로 ItemPrefabs[Random.Range(0, 3)]이므로 배열의 요소 번호는 최댓값을 뺀  0 , 1 , 2 중에서 랜덤으로 만들어진다.

 

30번줄에서는 Struct(구조체)로 만든 인스턴스(객체) 중에서 어떤 것을 선택할 지 결정한다.

Coordinates의 요소 번호를 Length로 정하고, 정해진 객체의 위치는 GetPosition메서드로 가져온다.

 

마지막으로 SpawnItem 메서드의 인수로 변수 itemPrefab과 itemPosition을 전달하여 인스턴스(객체)를 생성해서 Scene(화면)에 나타낸다.

 

그런데 게임오브젝트를 3개 만들려면 이 과정을  3번 반복해야 하므로 27번 줄에서 for 반복문을 이용하여 3번 반복한다.

 

스크립트를 저장한 후 테스트 해보자.

 

 

어떤 때는 게임오브젝트가 2개 나타나는 경우가 있다.

이것은 같은 좌표를 가진 게임오브젝트가 겹쳐졌기 때문이다.

확인해 보려면 31번 줄 SpawnItem( ) 아래 줄에 Debug.Log(itemPosition); 으로 좌표를 출력해 보면 된다.

 

끝.

Wraven...