본문 바로가기
tips/유니티 게임만들기

유니티 강좌 9 - 총알 피하기 9/9. 태그와 배열, 안드로이드 빌드

by 디지털 수공업자 2021. 3. 28.
반응형

 

1. 다시 시작하기 UI

uiEnd 안에 Button 게임오브젝트를 생성하고 이름을 btnRestart로 변경하여 적당히 위치를 조절한다. btnRestart에 있는 Text에 글씨를 입력하여 위와 같이 RESTART로 표시되게 하자.

게임이 끝난 위 화면 상태에서 RESTART 버튼을 누르면 uiEnd를 숨기고 난 뒤 화면안에 있는 모든 총알을 제거하고 시간을 0으로 되돌려야 새로운 게임이 시작되는 것과 같아진다.

GameController.cs  PressRestart( ) 함수를 새로 추가한다. 다시 시작 버튼을 눌렀을 때 작동 할 함수이며, 이곳에서 시간을 0으로 변경해주고, uiTime도 즉시 변경된 sec의 값이 표시되도록 해준다. 앞서 GameObject를 비활성화 했던 것과 같은 방법으로 uiEnd를 비활성화 해주고, 코드작성이 끝나면 btnRestart Button 이벤트에 지금 작성한 PressRestart( )를 연결해준다.

uiEnd는 에디터 상에서 비활성화 상태로 두어야 한다. 게임이 시작될 때부터 보이면 곤란하므로.

여기까지 하면 게임오버 화면을 숨기고 다시 시작하는 UI작업은 마무리 되었다. 플레이하여 테스트해보면 UI는 사라지고 게임이 이어지기는 하지만 총알이 그대로 날아다니고 있으므로 곧바로 다시 게임오버가 문제가 있다. 이제 모든 총알을 없애보자.

 

2. Tag 생성과 적용

프로젝트 창에서 bullet 프리팹을 선택한다. 프리팹의 인스펙터에서 프리팹 이름의 바로 아래에 있는 Tag 옆 버튼을 누르고, 맨 아래 Add Tag 를 선택한다.

인스펙터창의 내용이 Tags & Layers 으로 변경이 되면 Tags의 리스트 오른쪽 하단에 있는 더하기 모양 버튼을 누른다.

New Tag Name"bullet" 을 입력하고 Save 버튼을 누른다.

Tags 리스트에 Tag0 항목 "bullet" 이 추가되었다.

다시 프로젝트 창에서 bullet프리팹을 선택하고 조금 전 눌렀던 Tag 목록 버튼을 눌러 방금 리스트에 추가한 bullet을 선택한다.

지금 한 과정이 Tag를 생성하고 게임오브젝트에 Tag를 지정하는 것이다. 앞서 씬에 등록되어 있는 게임오브젝트를 이름으로 검색하여 찾는 방법으로 GameObject.Find( )를 사용했었는데, 또 하나의 방법인 Tag이름을 검색하여 찾는 방법을 사용하려면 위와 같이 태그를 만들어 게임오브젝트에 적용해주어야 한다.

FindWithTag( )Tag 이름을 전달하면 해당 Tag 이름을 가진 게임오브젝트를 반환하여 준다. 게임오브젝트의 이름으로 찾는 방법에서는 게임오브젝트를 하나만 찾을 수 있지만 Tag를 검색하여 찾으면 같은 Tag를 가진 모든 게임오브젝트한꺼번에 찾을 수 있는 장점이 있다. 물로 이 때에는 위와 다른 함수를 사용해야 한다.

FindGameObjectsWithTag( )는 찾으려는 태그 이름을 가진 모든 게임오브젝트 씬에서 찾아 반환해준다. 이때에 지금까지 우리가 사용했던 GameObject형 변수에는 이 방법으로 찾아낸 모든 게임오브젝트를 담을 수가 없고, 조금 다른 형태 변수를 사용해야 한다.

 

3. 배열

자료형 뒤에 대괄호가 붙어있는 형식의 자료형은 여러개의 값을 담을 수 있다. GameObject[] 는 게임오브젝트를 여러개 담을 수 있고, int[] 는 정수형 값을 여러개 담을 수 있다. 이를 배열이라하며 이 방법으로 10개의 값을 변수 10개에 나눠 담지 않고 하나의 변수에 담을 수 있다.

단, 배열을 사용할 때는 변수를 사용하기 전에 몇 개의 변수가 담을지 공간의 개수초기화 해주어야 한다. 위의 코드는 변수 a를 선언함과 동시에 5개의 공간으로 초기화하는 형태이다. 

공간을 만들고 나면 정해진 공간에 값을 넣을 수 있다. 위의 예를 보면 a변수의 0번 방1이라는 값을 넣고, 1번 방5라는 값을 넣는다는 것을 알 수 있다. Debug.Log에 a[0]을 넣어주면 콘솔창에서 1이 출력되는 것을 볼 수 있는데, 여기에서 대괄호 안에 있는 숫자는 Index이다.

변수명(배열명) a
index 0 1 2 3 4
index별 변수 a[0] a[1] a[2] a[3] a[4]
index별 변수 값 1 5 null null null

배열에서 각 방의 번호를 index라고 부르며, index 번호는 0번부터 시작한다. 따라서 다섯 개의 공간을 가진 변수 a의 마지막 index 번호는 4가 된다. 위에서 0번과 1번에 1과 5의 값을 넣었지만 나머지 방에는 아무값도 넣지 않아서 값이 없는 상태이다. 이때 값이 없는 방의 값을 꺼내어 쓰려하면 오류가 날 수 있으므로 배열을 사용할 때 조심해야한다.

 

4. 모든 총알의 파괴

이제 GameObject를 담을 수 있는 배열 bullets 를 선언하면서 "bullet" 이름의 태그를 가진 모든 게임오브젝트를 찾아 대입해준다. 이때는 FindGameObjectsWithTag( )의 반환값이 배열로서, bullets에 대입되며 배열의 길이가 정해지기 때문에 별도로 개수를 초기화하는 과정은 생략해도 문제 없다.

foreach ( 변수선언 in 배열 ) 을 사용하면 배열에 들어있는 모든 자료를 하나씩 꺼내어 매번 새로 선언한 변수에 넣고 중괄호 안의 내용을 실행한다. 위의 코드는 bullets의 각 방에 들어있는 GameObject를 하나씩 순차적으로 꺼내어 새로 선언한 bullet변수에 넣고 파괴하고 넣고 파괴하고를 반복한다. bullets에 들어있는 모든 GameObject를 다 한 번씩 꺼내어 중괄호안에 있는 작업을 할 때까지 반복한다.

이해를 돕기위해 위의 코들 추가로 살펴보자. 앞서 설명한 내용들이 모두 담겨있다.

위의 코드를 실행해보면 콘솔창에서 위와 같은 결과를 얻을 수 있다. Debug.Log( ) 문은 한 번 밖에 작성되어 있지 않지만, 콘솔창에는 세 번의 출력이 일어난다. a배열이 세 개의 값을 가지고 있기 때문에 모든 값을 하나씩 순차적으로 실행할 때 까지 반복되는 foreach에서 Debug.Log( )를 세 번 반복한 것이다.

결과적으로 작성한 코드는 위와 같다.
모든 코드는 윗줄부터 아래로 한줄 한줄 실행이 되므로 uiTime.text = "" + sec ; 가 sec = 0 ; 의 앞에 있는 다던지, foreach 문이 bullets 배열 선언 앞에 있게 되면 작동이 문제가 생긴다. 그리고 마지막에 uiEnd를 숨김으로 화면에 남아있던 총알이 순간적으로라도 보이는 경우를 방지할 수 있다.

원하는 대로 잘 작동 하는지 확인해보자.

 

5. 프로젝트 셋팅

Edit > Project Setting 메뉴를 연다.

Project Setting의 왼쪽 Player 메뉴를 선택하고, 오른쪽의 Company Name, Product Name, Version 등을 작성한다.

같은 Player의 오른쪽 내용 아래쪽에 OtherSettings라는 항목을 눌려 펼치고.

조금 아래쪽에 있는 Minimum API LevelAndroid 6.0 'Marshmallow' 를, Target API LevelAndroid 11.0 (API level 30) 을 선택한다. 안드로이드에서 실행되는 파일로 만드는데 필요한 안드로이드의 API 버전을 맞쳐주는데, 설정해야 하는 버전은 구글에서 안드로이드 OS버전이 올라감에 따라 정책적으로 정하고 있으므로 때에 따라 지정해야할 버전이 바뀔 수 있다.
그 아래 Scripting Backend 에는 IL2CPP 를, Api Compatibility Level 에는 .NET 4.x 로 선택하고 그 아래 ARM64 에 체크해준다. 안드로이드 64비트를 지원하는 앱으로 설정하는 부분이다.

 

6. 빌드셋팅

File > Build Setting 을 연다.

지금까지 작업해온 Scene 파일을 프로젝트 창에서 드래그하여 맨 윗칸에 던져 넣고, 중간쯤에 있는 Build App Bundle(Google Play)에 체크해준다. 예전에는 안드로이드 앱으로 apk파일을 사용했었는데, 최근에는 확장자 aab를 쓰는 앱번들 파일을 사용할 수 있다.


7. USB 디버깅

게임을 실행시킬 안드로이드 단말기의 설정에서 빌드번호라는 항목을 찾아 10여차례 터치한다. 위의 이미지는 갤럭시 S7의 설정화면이며, 휴대전화 정보 > 소프트웨어 정보 > 빌드번호로 찾아들어갈 수 있는데, 다른 단말기의 경우 메뉴 구성이 다를 수 있다.
빌드번호 항목을 수차례 터치하면 개발자 옵션이 해제되었다는 메세지가 나오고, 설정화면으로 나가보면 개발자 옵션이라는 메뉴가 추가되어 있다. 개발자 옵션에 들어가 USB 디버깅 항목을 활성화 시킨다.

이제 안드로이드 단말기에 우리가 만든 총알피하기 게임을 넣어 실제 작동시켜볼 준비가 다 되었다.
USB 케이블로 안드로이드 단말기를 PC와 연결하고, 단말기에서 연결을 허용하겠냐는 팝업이 뜨면 허용을 눌러준다.

 

8. 빌드

단말기가 연결되어 있는 상태에서 Build Settings창의 맨 오른쪽 아래 Build And Run을 누른다.

빌드해서 만들어진 파일이 저장될 위치를 선택하고 Save를 누른다.

만들어지는 동안 프로그레스 바가 가득찰 때까지 기다린다.

빌드가 다 끝나고나면 위에서 선택했던 경로에 aab확장자를 가진 파일이 생성되어 있고, 연결되어 있던 폰이 켜져있었다면 이미 게임이 실행되었을 것이다.

폰에는 빌드할 때 적었던 파일이름을 가진 유니티 로고 아이콘의 파일이 등록되어 있다.

최종 프로젝트 파일이 필요하시면 댓글로 이메일 주소를 남겨주세요. 구독 공감도 부탁드립니다.

 

9. 미리해보기

총알피하기 시리즈는 이 9편을 마지막으로 마무리되지만, 더 다듬어야할 부분이 많이 있다. 첫 시리즈라서 최대한 간단하게 하기위해 조금 더 있으면 좋을 내용들을 생략하였는데, 여기까지 따라오시면서 이 글에 담긴 내용외의 다른 것들도 학습하셨으리라 짐작된다. 그럼 조금 응용해서 완성도를 조금 올려보자.

1. 시작 버튼을 누르고 총알이 날아오기 까지 시간을 조금 늘려 여유를 주자.
2. 방향 버튼을 누른채로 다른 방향 버튼을 또 누르고 처음 눌렀던 버튼을 떼면, 두번째 누른 버튼이 여전히 눌려 있음에도 player가 멈추는 증상을 해결해보자.
3. 게임 오버 후 다시시작을 하면 player가 항상 화면 가운데서 시작하도록 위치를 초기화 해보자.
4. 총알이 5초뒤에 자동 파괴되므로, 화면 안에서 충돌없이 그냥 사라지는 경우가 발생한다. 파괴 조건을 시간이 아닌 화면밖으로 벗어날 때로 변경하여 문제를 해결해보자.

 

10. 정리

9편에 까지 이 강좌를 따라와주신 분들께 감사드립니다.

총알피하기는 9편을 끝으로 마무리되었으며, 1편부터 9편까지 유니티와 비주얼스튜디오 설치부터 게임개발과정을 지나 안드로이드 폰에 직접 넣어 테스트 하는 내용을 모두 담았습니다. 유니티엔진과 C#프로그래밍을 전혀 접해보지 않은 분을 대상으로 하였으며, 총알피하기를 처음부터 끝까지 따라해보았다면 게임을 만드는 전체 과정을 한 번 겪은 셈이 되어 새로운 프로젝트를 할 때 단계별로 무엇을 하면 좋을지 예상하는 데 도움이 될 수 있을 것입니다.

10편부터는 한동한 유행을 탔던 클리커게임을 간단하게 만들어보겠습니다.

이 내용이 마음에 드셨다면 구독과 공감 부탁드립니다.
시리즈가 계속되는 원동력이 됩니다.


FindWithTag( ) : docs.unity3d.com/kr/530/ScriptReference/GameObject.FindWithTag.html
FindGameObjectsWithTag( ) : docs.unity3d.com/kr/530/ScriptReference/GameObject.FindGameObjectsWithTag.html
Tag : docs.unity3d.com/kr/530/Manual/Tags.html
Google Play의 타겟 API 수준 : developer.android.com/distribute/best-practices/develop/target-sdk?hl=ko
안드로이드 64비트 아키텍처 지원 : developer.android.com/distribute/best-practices/develop/64-bit?hl=ko

 

유니티 강좌 10 - 알키우기1. 2D 스프라이트의 레이어

게임 내용 설계 한동안 정말 흔했던 게임 클리커를 만들어 본다. 게임 시스템은 보기보다 단순한데, "화면을 마구 터치하면 화면 가운데 있던 알이 조금씩 깨져 병아리가 태어나고, 계속 마구 터

boxwitch.tistory.com

 

반응형

댓글