이 강좌는 유니티와 프로그래밍 언어를 전혀 모르는 분들을 대상으로 작성되었습니다.
아래 내용은 총알 피하기 1편에서부터 이어집니다.
1. 총알 프리팹(Prefab)
Assets/Scene에 총알로 사용할 bullet.png 파일을 추가한다. 이전 편에서 설명한 바와 같이 파일의 경로는 Assets의 하위 어느곳이든 상관이 없으므로 편한대로 폴더구조를 만들어 사용한다.
Project창에 등록된 bullet 스프라이트 파일을 Hierarchy에 드래그하여 던져 넣으면 bullet 게임오브젝트가 Hierarchy에 추가된다. 추가된 bullet 게임오브젝트를 클릭하여 선택하면 Inspector에서 Sprite Renderer 콤포넌트의 Sprite항목에 bullet이 등록되어 있는 것을 확인할 수 있다. 또한 Hierarchy에 등록되었으므로 Scene창에도 bullet 스프라이트가 보일 것이다.
Scene창에 bullet 스프라이트가 바로 보이지 않는다면 player 스프라이트에 가려졌을 것이다. Hierarchy에서 bullet을 선택하고 W키를 누른다음 화살표를 당겨 위치를 이동해보자. 겹치지 않게 거리가 떨어지면 bullet 스프라이트가 보인다.
Hierarchy에 있는 bullet 항목을 드래그하여 Project창의 빈공간 아무곳에다 던져 넣는다. Assets안에 파란 육면체 아이콘의 bullet항목이 나타나고, Hierarchy에 있던 bullet도 마찬가지로 파란 육면체 아이콘으로 바뀌며, 글씨도 파란색으로 변경된다. 이 파란 육면체의 오브젝트를 프리팹(Prefab)이라고 하며, Project창에 들어 있는 쪽이 원본 소스가 되고, Hierarchy에 있는 쪽은 복사본이 된다. 이 방법을 사용하면 하나의 게임오브젝트 소스를 복제하여 여러개로 사용할 수 있게 된다.
이 프로젝트에서는 총알 게임오브젝트가 수십여개의 많은 수로 등장하게 되는데, 앞으로 사용될 모든 총알 게임오브젝트를 Scene에 미리 만들어두고 사용하려면 할일이 너무 많아진다. 여기에서는 미리 만든 프리팹파일을 스크립트에서 복제하여 사용할 것이며, 코드 몇 줄이면 수십, 수백개의 총알을 복제하는 것이 가능해진다.
여기까지 진행되었으면 Hierarchy의 bullet에 오른쪽 클릭을 하고 Delete를 클릭하여 삭제한다.
2. 게임 관리자
Hierarchy의 빈공간에 오른쪽 클릭을 하고 Create Empty를 선택한다. 1편에서의 player 게임오브젝트는 GameObject메뉴의 2D Object를 이용했던 것이나 bullet 게임오브젝트는 Project창에서 드래그하여 생성한 것도 모두 유니티에서 게임오브젝트를 생성하는 동일한 방법이다. 그때 그때 편한 방법을 사용하면 되고, Create Empty를 이용하면 Transform을 제외하고는 아무 콤포넌트도 없는 비어있는 게임오브젝트를 생성할 수 있다.
생성된 게임오브젝트의 이름을 game으로 변경하고, Project의 Assets 하위에 새로운 스크립트 파일을 생성하고 이름을 GameController로 변경한다. Hierarchy의 game 게임오브젝트를 선택하고 Project창의 GameController 스크립트 파일을 드래그하여 game의 Inspector 빈공간에 놓아 콤포넌트로 등록한다.
만약 게임오브젝트에 스크립트 파일이 등록되지 않는다면, 이름을 변경한 GameController 파일을 더블클릭하여 클래스의 이름이 파일명과 동일한지 확인한다. 보통 스크립트 파일을 생성할때 스크립트 파일의 이름을 지정할 수 있도록 파일이름이 선택된 상태로 나타나는데 이때 즉시 수정하면 생성되는 스크립트 파일의 클래스명이 파일명과 동일해지지만, 만일 선택상태가 풀렸다가 다시 이름바꾸기를 하면 바꾼 이름과 일치하지 않는경우가 있고, 이름이 일치하지 않으면 오류가 발생한다.
Scene에 등록된 게임오브젝트들과 그들의 상태는 Project창의 scene파일에 저장이 된다. 따라서 Hierarchy에 등록된 게임오브젝트의 내용이 달라지면 scene파일을 저장해야한다. File > Save 로 저장할 수 있다.
3. 총알 게임오브젝트 복제
GameController 스크립트의 클래스 안에 GameObject형 변수 bulletPrefab을 선언한다. 1편에서 숫자들이 담길 수 있는 int형 변수를 선언했었던 것과 같은 방식이며, 자료의 형식이 숫자가 아닌 GameObject들을 담을 수 있는 변수가 된다. 이전에 만들었던 player 게임오브젝트와 같이 Hierarchy에 등록되어 있는 모든 GameObject들은 GameObject형 변수에 담을 수 있다.
1편에서 int형 변수를 선언했던 것과 달리 자료형 + 이름 앞에 public을 하나 더 써두었다. 이 자리는 접근지정자라고 부르며 해당 변수 또는 함수 등을 담겨 있는 스크립트의 외부에서 접근을 차단하거나 허용하게 해준다. public을 앞에 넣어주면 이제 이 bulletPrefab변수는 스크립트 외부에서 접근할 수 있게 되며, Inspector에도 나타난다.
스크립트를 작성하고 저장한 후 유니티 에디터에 돌아와서 game의 Inspector를 보면 GameController 콤포넌트에 bulletPrefab변수가 하나의 항목으로 나타나 있음을 확인할 수 있다. Project의 bullet 프리팹을 드래그하여 GameController 콤포넌트의 bulletPrefab 변수에 넣어준다. 이제 스크립트에서 선언한 변수 bulletPrefab에는 Assets의 bullet 프리팹이 연결되었고, 스크립트에서 사용할 수 있게 되었다.
GameController 스크립트의 Start( ) 안에 GameObject형 변수 bullet을 선언한다. bulletPrefab변수 선언과 같지만 선언한 위치가 Start( )안이기 때문에 이 bullet변수는 Start( )안에서만 사용할 수 있는 변수가 되고, 선언만 한 상태에서는 bullet변수에 아무것도 들어있지 않은 비어있는 상태이다.
유니티와 프로그래밍이 완전히 처음이라면 아래의 간단한 변수 선언 설명을 살펴보자
변수 선언 및 사용 : boxwitch.tistory.com/181
Instantiate( ) 함수에 원본게임오브젝트와 복사본의 새 위치, 복사본의 새 회전값 등 세 가지 정보를 전달하면 위치와 회전값이 적용된 복사본 게임오브젝트를 돌려준다. bullet에 넣어줄 값 대신 Instantiate( )을 넣어주면 함수에서 돌려받은 복사본 게임오브젝트를 bullet변수에 넣어주는 것과 같다.
결과적으로 bullet변수는 bullet프리팹을 복사한 새로운 bullet게임오브젝트가 되는 셈이다.
Vector3( )도 마찬가지로 Instantiate( )와 동일하게 소괄호가 달려 있는 것을 볼 수 있다. 마찬가지로 x, y, z 세 축의 위치 값인 세 개의 숫자를 Vector3( )에 전달하여 전달한 값으로 만든 Vector3형 값을 받아온다.
Quaternion.identity은 회전 없음을 의미한다.
구체적인 것은 차차 익숙해지면서 살펴보면 될 것이지만, 혹시 구체적인 내용을 살펴보려면 이 글의 맨 아래에 있는 링크를 따라 각 함수의 설명페이지를 살펴보자.
이제 유니티의 상단에 있는 플레이 버튼을 눌러보면, Hierarchy에 bullet(Clone)이라는 항목이 새로 생기는 것을 볼 수 있다. 플레이를 중지하면 사라지는 이 게임오브젝트는 바로 위에서 스크립트로 Instantiate( )로 만들어낸 게임오브젝트이다. Scene에서는 player와 겹쳐서 보이지 않을 수 있지만, Hierarchy에서 bullet(Clone)을 선택하고 W키를 눌러 화살표를 당겨보면 분명히 복사본이 생성된것을 확인할 수 있다.
새로 만들어진 bullet(Clone)의 Inspector를 살펴보면 Transform > Position 에 x, y, z 축의 값이 모두 0으로 들어있는데, 위에서 Instantiate( )함수에 전달한 Vector3( )의 값과 일치한다.
Rotation에 들어있는 x, y, z축의 값 또한 모두 0인데, 이것은 앞서 전달한 Quaternion.identity가 돌려준 값으로 회전 없음인 것이다.
4. 미리해보기
1. 생성되는 총알의 위치를 다른 곳으로 바꾸어 보기.
2. 3개의 총알이 각각 다른 위치에 생성되도록 스크립트를 변경하기.
3. 총알이 생성되면 Console에 "Instantiate bullet complete!"을 출력하기
* 유니티 프리팹 Prefab
* MonoBehaviour.Start()
* Object.Instantiate()
* Vector3()
* Quaternion.identity
'tips > 유니티 게임만들기' 카테고리의 다른 글
유니티 강좌 6 - 총알 피하기 6/9. 콜리더와 충돌 감지 (0) | 2021.03.22 |
---|---|
유니티 강좌 5 - 총알 피하기 5/9. 버튼 이벤트와 Canvas (7) | 2021.03.17 |
유니티 강좌 4 - 총알 피하기 4/9. 함수 반복 호출 및 게임오브젝트 파괴 (2) | 2021.03.16 |
유니티 강좌 3 - 총알 피하기 3/9. 스프라이트 좌표 이동하기 (2) | 2021.03.13 |
유니티 강좌 1 - 총알 피하기 1/9. 준비 (0) | 2021.03.06 |
댓글