유니티를 사용하여 2.5D 게임을 만드는 방법 튜토리얼: 파트 1

Ray Wenderlich

이 포스트는 영어 언어로도 제공됩니다.

이 포스트는 12+년 경력의 소프트웨어 엔지니어이고, 인디 iOS 개발자이며,  Touch Code Magazine의 창립자이며, iOS 튜토리얼 팀 멤버인  Marin Todorov가 썼습니다.

Learn how to create a simple 2.5D game with Unity!

Learn how to create a simple 2.5D game with Unity!

2.5D 게임은 기본적으로 3D인데 2D 방향으로만 진행하는 게임이다.
수퍼마리오 브러더스 위, 리틀 빅 플래닛 또는 페이퍼 몬스터들 같은 게임들이다.
2.5D 나 3D 게임을 만드는 좋은 방법은 인기 있고 쉽고 가격도 괜찮은  유니티 를 사용하는 것이다.
이 튜토리얼들은 유니티를 사용하여 SharkBomber라는 2.5D 게임을 만드는 방법을 보여준다.
처음 유니티를 배운다면 이 튜토리얼은 알맞다. 간단한 게임부터 따라 배우면 된다.
이 게임은 작고 잘 무장된 비행기를 제어하여 나쁜 상어에게 폭탄을 때려 이쁜 크라운피쉬를 보호하는 것이다.
유니티는 Objective-C를 사용하지 않으므로 Objective-C에 대한 경험은 필요없지만, C#, Java, Actionscript 같은 OOP 언어 경험은 도움 된다.
이 튜토리얼은 맥 유저용이다. 윈도우즈 유저는 설정이 다르다. iOS 시뮬레이터를 사용하지 않고 iOS 디바이스에서만 테스트 할 것이니, iOS 디비이스를 준비하라.
유니티로 뛰어 들어 보자.

 

유니티 설치하는 방법

유니티 에디터를 설치하자. 이미 설치 해 두었으면 이 단계는 생략하라.
다운로드 페이지에서 유니티를 받아라. DMG 파일을 마운트하고 유니티 인스톨러를 시작하라. 설치 절차를 따라 설치를 마치면 /Applications/Unity 폴더에 바이너리들이 있다.
유니티를 시작하고 Register 버튼을 클릭하라. 공짜니 걱정말라. Internet activation을 선택하고 Next 버튼을 클릭하면 나타나는 웹 페이지의 폼안을 모두 채워라.
중요: 이 튜토리얼을 하려면 Start Pro / iOS Trial 옵션을 선택해야 아이폰에 배포할 수 있다.
등록이 되면 유니티는 시작되고 아래처럼 창이 보인다.
Welcome to Unity!
Welcome to Unity 팝업을 닫고, “File/New Project”메뉴에서 디스크의 폴더를 골라 SharkBomber 프로젝트 이름으로 지정하고 패키지는 선택하지 말고 Create Project 버튼을 누른다.
빈 패널들이 보인다. 버튼들이 많지만 걱정말고 다음 섹션에서 알아보자.

유니티 에디터 오버뷰

몇가지 추가적 구성을 해보자.
유니티 창의 우상코너에서 셀렉션박스를 찾아 – Tall을 고르라. 창 내용을 재정렬 할 것이다. (기본 Wide).
좌상코너 툴바 아래에 Game 탭을 찾아 – 창 하단으로 드래그하여 창이 스냅이 표시되면 놓아라.
Dragging the game tab to the bottom of the Unity editor
이제 아래 그림과 같은 레이아웃이 보인다:
Unity Editor Layout
각각의 패널을 알아보자:

  1. Scene: 3D 모델들을 움직이고, 3D 월드를 볼 수 있다.
  2. Game: 에디터에서 카메라 (이 경우는 Main camera)가 선택되어 있으면 카메라의 시야를 실시간으로 보여주며, Run버튼을  눌러 게임을 실행하면 여기에서 게임이 실행된다.
  3. Hierarchy: 오브젝트들의 트리 (예시컨데 HTML DOM 같은 것들)다. 현재는 카메라 하나만 있다, 나중에 여러가지를 추가해 볼 것이다; 이 리스트에 있는 오브젝트들은 현재 열린 씬에 있는 것들이다.
  4. Project: 프로젝트의 컨텐츠들이다. 에쎗, 오디오 파일 등이다.
  5. Inspector: Scene/Project에 선택된 오브젝트의 프로퍼티들을 조절한다; 유니티는 씬을 실행시키면 그대로 보여 준다. 디버거로 쓸 수 있다.
  6. Toolbar: 씬의 오브젝트를 다루는 툴들과 씬을 테스트하기 위한 Run과 Pause버튼이 있다.

유니티 프로젝트는 전환이 가능한 씬들을 가지고 있다. 에디터는 현재 빈 씬을 열고 있다. 저장하자.

  1. Project에서 오른쪽을 눌러서 Create/Folder를 고른다. New Folder가 나타난다.
  2. New Folder이름을 Scenes으로 하라. 왼쪽을 클릭하거나 폴더를 선택하고 키보드 엔터를 눌러도 된다.
  3. 메뉴에서 “File/Save scene”을 골라라. Save dialogue에서 “[프로젝트 디렉토리]/Assets/Scenes” 폴더에 LevelScene으로 씬을 저장하라.

점검해보자. – Project에서 Scenes폴더를 열어 보자 – LevelScene 씬이 있다.
게임을 실행할 준비가 되어 있다 – 위쪽의 Play 버튼을 눌러라. 변화가 없다? – 사실 당신의 게임은 Game 안에서 돌고 있다! Play 버튼을 눌러 게임을 멈추는 것을 잊지 말아라. (매우 중요!)

유니티3D 프로젝트 아이폰 설정하기

유니티는 아이폰, 맥, 위 등 다양한 플랫폼용 게임을 빌드 한다. 아이폰용 게임을 빌드하도록 설정 하자.
메뉴에서 “File/Build Settings” 골라, 프로젝트에 현재 씬이 추가되도록 Add current 버튼을 누른다. 추가된 씬이 ‘0번’ 인덱스이다. 게임이 시작될때 로드되는 첫번째 씬이라는 것을 나타낸다.
Platform 리스트에서 iOS를 선택하고 Switch platform 버튼을 누른다. iOS 칸에 유니티 로고가 표시된다.
Player settings 버튼을 누르고 팝업 창을 닫아라. Player settings가 Inspector에 열린 것을 눈치 챘을 것이다. 몇가지를 설정해 보자.
Per-platform Settings에 아이폰이 아래처럼 선택되어 보여진다:
Unity iOS Platform Settings
많은 설정들이 있지만 대부분 Xcode에서 보던 것들이라 쉽다.
Inspector를 아래를 따라 변경하자:

  1. Resolution and Presentation의 Default orientation에서”Landscape Left을 선택.
  2. Other settings의  Bundle Identifier를 원하는데로 입력. (디폴트 값은 말고)
  3. Other settings의 Target device를 iPhone only로 설정.

추가: Game 탭의 좌측 아래에 여러 가능한 오리엔테이션/해상도들이 있는데 – 기본 Landscape Orientation에 맞춰 iPhone Wide(480×320)를 선택한다.
Configuring Unity for iOS
축하한다 – 기본적인 Hello World 프로젝트를 가지고 아이폰에서 돌려보자!

아이폰에서 게임을 실행하기

 

Unity to Xcode - Awww, yeah!

Unity to Xcode – Awww, yeah!

이제 테스트를 할 준비가 되었다. Xocde와 아이폰에서 테스트를 해보자.
사용하는 Xcode 를 시작한다. – Welcome창을 닫고 유니티로 되돌아 오자. 유니티가 Xcode 버전을 사용하는 트릭이다 – 동시에 실행되는 것이다.
유니티로 돌아와서 메뉴에서 “File/Build & Run”를 골라라 – Build Settings가 다시 팝업 되면 Build and Run 버튼을 클릭하라.
어느 폴더에 Xcode 프로젝트를 저장할지 물을 것이다. 프로젝트 폴더 안에 SharkBomberXcode라는 폴더를 만들어라. (Xcode 관련 파일들이 여기에 있게 될 것이다.) 그리고 파일 이름에 SharkBomber라고 입력 하여라.
기다리면 프로젝트가 빌드되고 Unity-iPhone이라는 프로젝트가 열린 Xcode 창이 뜬다. 유니티가 소스 코드를 가진 Xcode 프로젝트를 생성했고, 이제 Xcode에서 이 Xcode 프로젝트를 빌드하고 실행할 수 있다.
소스코드를 보고 싶겠지만 – 이것들은 dll 파일이나 몇가지 에셋들이 포함된 모노 프레임워크를 로드하는 공통적인 것들 뿐이라서 별게 없다.

Xcode의 타겟이 2개가 있다. 가지고 있는 iOS 디바이스를 연결하고 Unity-iPhone타겟을 선택하면 당신의 디바이스다. (나는 시뮬레이터에서 돌아가는 타겟을 만들지 못한다. 당신이 그걸 해낸다면 대단할 것이다. 하지만 나는 지금은 디바이스에서 돌려볼 생각이다).

Run버튼늘 누르면 유니티 프로젝트가 아이폰에서 실행될 것이다.
Running a Unity game on your iPhone
좋다! 유니티 기본 시작 화면과 파란 배경을 가진 씬이 보일 것이다. (코너에 trial version 글귀가 있다).
실행을 멈추고 유니티로 되돌아 와서 프로젝트를 저장하자.

 

씬 설정 하기

씬의 메인 카메라를 설정하자. Hierarchy에서 Main Camera를 선택하라. Inspector에서 Projection을 찾아서 Orthographic으로 설정한다. Size를 10으로 설정하고, Clipping Planes에서 Near를 0.5로 Far 를 22로 설정하라. 씬 안에 카메라 근처에 박스 하나가 보인다 – 화면상에서 보여질 월드의 경계다.
카메라 프로젝션을 Orthographic(직교투영법)으로 설정 했다는 점에 주목하라 – 원근감 없이 화면에 보인다는 것을 뜻한다. 사실상 2D 게임을 만들고 있다.
Inspector에서 카메라 Position의 X, Y, Z에 [0,0,0]을 설정한다. [x,y,z]는 position프로퍼티 3개의 박스안에 값이다.
Project 패널에서 오른쪽을 눌러 Create/Folder를 고르고 Textures라는 폴더를 만든다. 준비해 둔 백그라운드 이미지를 디스크에 받아서 저장하라. 맥 파인더에서 백그라운드 이미지를 방금 만든 Textures폴더에 끌어다 놓아라.
내 맥에서는 임포트하는데 20초쯤 걸리는데, 임포트가 끝나면 Textures폴더를 열어서 background텍스쳐를 선택하면, Inspector가 텍스처의 프로퍼티들이 보여준다. 맨 아래에 있는 Preview패널은 RGB Compressed PVRTC 4bits를 나타낸다. 유니티는 임포팅을 할때 압축한다.
Importing a Texture in Unity
메뉴에서 “GameObject/Create other/Plane”을 고르면, 카메라 옆에 푸른색의 상자가 보인다. 방금 씬에 추가한 plane이다. 여기에 조금 전에 얻은 텍스쳐를 붙이자.
Hierarchy에서 Plane을 선택하고 Inspector의 꼭대기에 있는 텍스트 필드의 Plane를 Background라고 입력한다. 오브젝트의 이름을 바꾼 것이며 이렇게 바꾸면 된다. Project패널에서 Background 텍스쳐를 드래그하여 Hierarchy 의 Background오브젝트에 드롭하라. Inspector의 Position을 [4, 0, 20]로 설정, Rotation을 [90, 180, 0]을 설정, Scale을 [10, 1, 5]로 설정하라 – 이것은 Plane면이 카메라를 향하도록 회전하고 스케일을 한 것이다 -이렇게 카메라에서 Plane이 게임의 배경처럼 보이도록 했다.
이제 잘 보이도록 씬에 조명이 필요하다 – 메뉴에서 “GameObject/Create other/Directional Light”고르면 씬에 조명이 놓인다. Hierarchy에서 Directional Light을 선택하고 Position을 [0, 0, 0] 맞춘다.
Adding a directional light in Unity
방금 씬에 배경을 설정하는 것을 마쳤다. 이제 몇가지 오브젝트들을 추가하고 움직여 보도록 하자!

씬에 3D 오브젝트들을 추가하기

메뉴에서 “GameObject/Create other/Cube”를 선택하면 씬에 Cube오브젝트가 추가된다. 이것은 플레이어다. 이름을 Player로 바꾼다.
Position을 [-15, 5.3, 8]으로 설정한다. Game패널의 화면 좌측에서 상자가 나타나는 것을 보인다 – 비행기가 바다 수면 위를 움직여 건너 화면 반대편 끝을 향해 출발하는 위치다.
비행기 모델을 가져오자. Reiner Tiles Prokein이 제작하여  그의 웹 사이트에서 배포하는 무료 3D 모델을 사용할 것이다. (그의 모델에 대한 라이센스를 확인하라).
시작하려면 비행기 모델을 받아서 압축을 풀도록 하자.
Project패널 안에서 오른쪽 버튼을 눌러 Create/Folder를 선택하고, 폴더 이름은 Models로 한다. 받아서 압축을 해제한 비행기 파일 airplane_linnen_mesh.obj을 드래그하여 Project 패널의 Model 폴더에 드롭한다.
Model폴더에서 오른쪽 버튼을 눌러 Create/Folder를 골라 새 하위 폴더 이름을 Textures로 한다 – 여기에 모델에 적용된 텍스쳐들을 저장할 것이다. airplane_linnen_tex.bmb를 드래그하여 새로 만든 Textures폴더 위에 드롭하라.
Hierarchy의 Player오브젝트를 선택하고 Inspector를 보면 – Mesh Filter스트립이 현재 오브젝트의 geometry로 되어 있다 (현재는 cube geometry로 되어 있다. Mesh – Cube 행에서 ‘점있는 원’을 찾아서 클릭 하도록 한다 – 팝업 윈도우가 나타나면 비행기 모델을 더블 클릭하여 오브젝트의  geometry를 비행기로 바꾸라.
Setting player to a model with Unity
자세히 보면 -비행기는 엉망으로 보인다. 3D 전문가가 아니어도 유니티에서 고치는 방법이 있다: Project 패널에서 airplane_linen_mesh를 선택하고 Inspector에서 Normals을 찾아 Calulate를 선택하고 아래로 스크롤 하여 Apply를 누른다.

씬에 매끈한 비행기가 보인다. 텍스쳐를 적용해 보자: Project패널에서 airplane_linnen_tex를 드래그하여 Hierarchy 의 Player 위에 드롭한다. 유니티는 우리의 씬에 있는 비행기 모델에 자동으로 텍스쳐를 적용해 준다.
비행기에 마지막 손질을 하겠다: 오브젝트의 Rotation을 [0, 90, 350]으로 설정, Scale을 [0.7, 0.7, 0.7]로 설정한다, 비행기가 바다를 향하도록 회전과 스케일을 한 것이다.
다음 섹션에서 우리는 항공기가 날아가도록 만들것이다.

C#으로 유니티3D 프로그래밍을 시작하자.

Build Settings창에서 유니티는 프로젝트를 닌텐도 위 게임, 아이폰 게임, 맥용 게임 등으로 빌드 할 수 있는 것을 보았다. 유니티는 게임 하나를 프로그램하여 다양하게 적용할 수 있는 뛰어난 중간 레이어를 가지고 있어 플랫폼별로 다른 코드를 빌드 할 수 있기 때문이다.
당신이 유니티에서 C#(Objective-C가 아니다!)으로 프로그램을 만들면, 유니티는 그 C#코드를 자동으로 플랫폼 전용 코드로 번역하고, Xcode 프로젝트를 생성한다.
Project 패널에서 오른쪽 버튼을 눌러서 Create/Folder를 고르고, 새 폴더 이름을 Class로 한다. Class폴더에서 오른쪽 버튼을 누르고 Crate/C Sharp Script를 고르고, 이름을 PlayerClass로 변경한다. Project 패널안에서 마우스 오른쪽 버튼을 눌러 Sync MonoDevelop Project를 고른다 – 이것은 “MonoDevelop IDE”를 연다. 이것은 당신이 C# 프로그램을 할 수 있는 IDE다.
노트: MonoDevelop는 리눅스에서 포팅되었다. 유저 인터페이스 스킨이 Gnome라는 것으로 되어 있는 것을 볼 수 있을 것이다. 창의 크기를 바꿀때 처럼 자주 크래쉬 되는 것은 정상이다. 그런 일이 생기면 Sync MonoDevelop Project를 선택하여 다시 시작하면 된다.
MonoDevelop editor launched from Unity
MonoDevelop의 GUI에는 3개의 주요 영역이 있다.

  1. MonoDevelop의 프로젝트 브라우저 – Assets/Class에서 PlayerClass.cs가 보인다.
  2. 현재 열린 클래스의 아웃라인.
  3. 에디터 영역 – 코딩을 도와 줄 수 있는 Syntax 하일라이트와 자동 완성을 지원한다.

프로젝트 브라우저에서 PlayerClass.cs 파일을 찾아 더블 클릭하여 에디터에 열라. 클래스는 아래처럼 생겼다:

using UnityEngine;
using System.Collections;
public class PlayerClass : MonoBehaviour {
	// Use this for initialization
	void Start () {
 
	}
 
	// Update is called once per frame
	void Update () {
 
	}
}

using은 지정한 라이브러리와 프레임워크를 포함한다. UnityEngine은 당신이 사용할 아이폰 가속도 센서, 키보드 입력 등 여러가지를 제공하는 라이브러리다.
새 클래스는 MonoBehaivour로 부터 상속 받았다 – 이벤트가 발생 하였을 때 호출 되는 많은 메소드들를 오버라이드 할 수 있다.
중요한 2개의 Start와 Update 메소드를 살펴 보자.

  • Start는 오브젝트가 씬에 나타날 때 호출되며 여기서 초기화를 할 수 있다. (마치 iOS UIViewController의 viewDidAppear 처럼).
  • Update는 프레임이 렌더링 될때 마다 호출된다 (초당 30, 60, 100번이 될 수 있는데 얼마나 자주 호출 되는지 알 수는 없다). 여기서 이동이나 로직 등을 할 수 있다.

유니티로 다시 되돌아 가자. 우리는 비행기가 바다 위를 날아 화면의 우측으로 사라지면 다시 화면의 좌측에서 나타나도록 할 것이다. 비행기가 나타날 좌측 위치를 측정해 보자. Scene의 우상쪽 코너에 오리엔테이션 기즈모가 있는데 – X축 핸들을 클릭하자. (적색 원뿔 모양이다. 나는 핸들이라고 부른다.):
Unity navigation gizmo
이 X축 핸들은 씬과 방향을 회전시키고 당신쪽으로 향할 것이다. 다시 기즈모의 좌측 핸들을 클릭하라 – 이 핸들도 씬을 회전 시킬 것이다. 아래 그림처럼 씬이 앞으로 올때까지 핸들을 몇번 반복해서 눌러 보자:
Rotating a Unity scene with the navigation gizmo
이제 마우스 휠을 스크롤 하여 확대/축소하여 씬이 “Scene” 패널에 들어 맞도록 한다. 위쪽의 툴바에 이동툴이 선택되어 있는지 확인하고, Hierarchy에서 Player를 선택한다.
Unity move tool selected
이제 빨간색과 녹색으로 된 새 기즈모가 항공기에 나타난 것을 눈치 챘을 것이다. 이제 화살표들을 드래그하면 화살표가 가리키는 축으로 움직 일 수 있다:
Moving the player in Unity horizontally with the move gizmo
Scene에서 비행기 기즈모의 적색 화살표를 잡고 Game의 항공기가 우측 끝에 사라지기 직전까지 이동하도록 드래그하자. 다시 Scene에서 드래그를 시작하면서, Game을 뚫어지게 쳐다보자. 항공기가 화면 우측 끝으로 사라지는 순간 Inspector의 Position 값을 확인 하자. X 값은 17.25 정도 – 화면의 우측 경계, 다시 항공기를 화면 좌측 끝으로 사라지도록 드래그 해보면, 좌측 경계는 -17.25 임을 알 수 있다. 그래서 우리는 항공기 X축 비행 범위는 -18 ~ 18로 할 것이다. 항공기를 원래 위치로 다시 되돌리라.
MonoDevelop로 되돌아가서, PlayerClass.cs 를 아래처럼 변경하자.

// 클래스 선언 라인 바로 아래에 삽입.
public float speed;
// Update 메소드 안에 삽입.
if (transform.position.x > 18) {
	//get new speed
	speed = Random.Range(8f,12f);
	transform.position = new Vector3( -18f, transform.position.y, transform.position.z );
}		
transform.Translate(0, 0, speed * Time.deltaTime);

(역주: 모노버그! 한글주석 컴파일 에러! 한글주석 뒤에 공백 필수!)
짐작 했겠지만 speed라고 이름 붙인 public 프로퍼티를 선언했다. 유니티는 클래스의 public 프로퍼티를  Inspector 패널를 통해 액세스 할 수 있게 해준다.
클래스 프로퍼티를 IDE를 통해 편집 할 수 있고, 게임이 실행되는 동안 실시간으로 모니터링 할 수 있다.
transform 변수는 모든 game object의 프로퍼티인데,  (씬안에 있는 건 모두 game object) 공간상에서 오브젝트의 위치, 회전, 스케일 등을 다룬다. 그래서 Update 가 호출될때 오브젝트가 화면상의 우측으로 위치를 옮긴다.
우리는 Update가 호출될때 항공기를 얼마만큼 움직여야 하는지 모른다. 왜냐하면 정확히 1초에 몇번 Update가 호출되는지 모르기 때문이다. 대신에, 우리는 초당 이동 속도를 정의 하였고, 속도를 Update가 호출되는데 걸린 시간(Time.deltaTime)으로 나누면, 현재 프레임 레이트(화면 갱신 비율)와 상관 없이 오브젝트가 일정한 속도로 움직이도록 할 수 있다.
Translate 메소드는 각 축의 방향으로 3개의 변수를 요구한다. 비행기가 Z축 위에서 움직이는 것을 알아 챘을 것이다. 씬 위에서 비행기를 회전하였고 Z축을 따라 움직이는 비행기의 오른쪽에서 플레이어가 본다.
if 문을 살펴보면 – transform.position.x 가 18보다 (왜 그런지 기억하지?) 큰가 체크하고, if가 참이면 항공기의 좌표를 X축만 -18로 설정한다. 우리는 위치를 설정하기 위해 새로운 Vector3(x,y,z)라는 것을 사용했다 – 우리는 모든 위치 지정을 위해 많은 Vector들을 사용할 것이다; 알다시피 우리는 속도를 8에서 12사이에서 랜덤하게 설정하였다 – 항공기가 랜덤한 속도로 움직이면 더 재미있을 것이다.
이제 우리는 항공기가 움직이는 것을 볼 수 있는 준비가 되었다!
유니티로 되돌아 가자. Project에서 PlayerClass.cs를 Hierarchy의 Player위에 드래그 하자 – 이 방법으로 클래스를 game object에 붙일 수 있다. Hierarchy에서 Player를 선택하고 Inspector를 보면 – 새 Player Class(Script)라는 새로운 스트립이 나타난 것을 발견 했을 것이다. 거기에 public 프로퍼티도 있다. 이예! 값을 12로 설정하자.
좋았어. 준비? Play 버튼을 쳐라! 우와! Scene과 Game 패널 양쪽에서 항공기가 우측으로 날아가면 좌측에서 다시 되돌아 온다. 또한 Inspector에서 실시간으로 X축이 바뀌는 것을 알았을 것이다 – 이것은 그 순간 항공기가 어디에 있는지 보여준다. 또한 항공기의 비행이 반복 될때마다 매번 속도가 랜덤값으로 바뀌는 것도 볼 수 있다.
Dynamic Properties in Unity
즐겼으면, Play를 눌러 게임을 멈추는 것을 잊지 말라.
비행기에게 무서운 적을 주자 – 바로 상어다! 잠시 익숙한 기초를 하나 해보자.
휴식이 필요하거나 작업을 중단해야 할때 유니티 프로젝트를 저장만 하면 나중에 다시 열 수 있다. 하지만! 당신이 유니티 프로젝트를 다시 열었을때 씬은 비어 있는 상태다. Project 패널의 LevelScene을 더블 클릭하면 작업하던 씬을 로드 할 수 있다 – 이제 작업을 계속 할 수 있다.

뛰어 들어 오는 상어

상어 모델을 받아 압축을 풀어라. 전에 항공기에 했던것 처럼, shark.obj를 Project패널안의 Models폴더에, sharktexture.bmp를 Models/Textures폴더에 드래그 한다. 메뉴에서 “GameObject/Create Other/Capsule”를 고르고 – Hierarchy 패널의 Capsule오브젝트를 Shark로 이름을 준다. Inspector의 Mesh Filter스트립의 점이 있는 원을 을 클릭하면, 나타나는 창에서 상어 모델을 더블클릭 한다. 이제 상어 geometry를 Scene과 Game에서 보인다.
Project패널의 Model/Texture폴더에서 sharktexture를 Hierarchy의 Shark오브젝트에 드래그 한다 – 이렇게 하면 강력한 상어의 입과 사악한 눈이 생긴다. 으윽 – 나는 벌써 그놈에게 폭탄을 떨구고 싶다!
Shark가 선택되어 있는지 확인하고, Inspector에서 다음 프로퍼티들을 입력한다: Position – [20, -3, 8], Scale – [1.2, 1.2, 1.2] – 카메라의 시야 상자의 우측에 상어를 위치시킨다 – 상어는 그곳에서 시작하여 좌측으로 움직일 것이다.
Adding a shark to the game
폭탄은 상어와 반응해야 한다. (폭발! 콰콰쾅!!!) 상어의 geometry와 collider(충돌체)가 부딪혀야 한다. 씬안의 상어에 녹색 캡슐이 있다. 바로 상어의 collider이다. 이것을 저 사악한 포식자의 몸뚱아리에 맞춰보자.
Inspector에서 Capsule Collider스트립을 찾아 다음 프로퍼티들을 설정한다: Radius는 1, Height는 5, Direction은 X-Axis, Center는 [0, 0, 0]. 이제 Capsule Collider가 회전하여 상어의 몸뚱아리에 비슷하게 들어 맞을 것이다.
Modifying the capture collider settings so the collision shape matches the sharks shape
마지막으로 Project의 Models폴더에서 shark 모델을 선택하여 Normals을 찾아서 Calculate를 선택하고, 아래로 스크롤 하여 Apply를 누른다.
Project패널의 Class폴더에서 오른쪽 버튼을 눌러 Create/C Sharp Script를 고르고, 새 스크립트 이름을 “FishClass”로 한다. 오른쪽 버튼을 눌러 Sync MonoDevelop Project를 고른다.
MonoDevelop가 나타날 것이다. FishClass.cs 파일을 열어 아래처럼 입력하자.

using UnityEngine;
using System.Collections;
public class FishClass : MonoBehaviour {
 
	public float speed = 6f;
 
	// Update is called once per frame
	void Update () {
		if (transform.position.x < -30 || transform.position.x > 30) {
			// 회전 한다.
			transform.Rotate(new Vector3(0,180,0));
			transform.Translate( new Vector3(-10, -transform.position.y + Random.Range(-4,-1),0) );
 
			// 속도를 변경한다.
			speed = Random.Range(6f,10f);
		}
		transform.Translate( new Vector3(-speed*Time.deltaTime,0,0) );
	}	
}

(역주: 모노 한글 버그 주의! 한글 주석 끝에 공백!)

이 코드는 항공기 스크립트와 꽤 비슷하다. speed 프로퍼티 하나가 있고 Update 이벤트 핸들러에서 transform을 사용한다. Translate()는 상어를 움직이게 한다.
자세히 살펴 보자:

transform.Translate( new Vector3(x,y,z) );

이것은 다른 파리미터를 넘길 수 있는 예제 코드다. 값 3개를 전달하는 것과 vector 하나를 전달하는 것은 거의 비슷하다
상어가 화면 경계에 도착 하였을때 무엇을 하는지 살펴 보자 (이 경우에는 -30에서 30이이라서, 상어가 잠시 화면에서 사라진다. 그래서 상어가 숨었다가 언제 나타날지 예측이 어렵다.).
상어가 좌측이나 우측 경계에 도착 하였을때, 상어는 주변으로 위치를 살짝 이동하고, 속도를 바꾼다. 이것은 지속적으로 앞에서 뒤로, 뒤에서 앞으로 가게 만든다.
transform.Rotate(new Vector3(x,y,z))를 호출하면 주어진 지정한 축에 주어진 값에 따라 오브젝트가 정확히 회전한다. 그리고 transform.Translate(new Vector3(x,y,z)) 에 대해서는 이미 알고 있을 것이다.
쉽다! 유니티로 되돌아가서, FishClass스크립트를 Hierarchy 패널의 Shark오브젝트에 드래그하라. Play 버튼을 눌러라: 거대한 상어가 왔다 갔다하며 폭탄 맞기를 기다리고 있다. 굿잡!
Adding shark into scene

크라운피쉬 추가하기

크라운 피쉬를 위해 같은 작업을 다시 반복하자. 그 작업을 위해 퀵 레퍼런스를 준비해 두었다:

  1. 크라운퓌쉬 모델 다운로드하여 압축을 해제하라.
  2. mesh_clownfish.obj를 Project패널의 Models폴더에, clownfish.bmp를 Models/Textures폴더 안에 드래그 하라.
  3. 메뉴에서 “GameObject/Create other/Capsule”를 고르고 Hierarchy에서 Capsule오브젝트 이름을 ClownFish로 하라.
  4. Inspector 패널에서 Mesh Filter의 “점이 있는 원 버튼”을 클릭하여 팝업 창이 뜨면 clownfish geometry를 더블 클릭하라.
  5. clownfish모델 텍스처를 Hierarchy패널의 ClownFish오브젝트 위로 드래그 하라.
  6. Hierarchy에서 ClownFish가 선택되어 있는지 확인하고, Inspector에서 아래 프로퍼티들을 변경한다:
    • Position은 [-20, -1, 7]
    • Rotation은 [0, 180, 0]
    • Scale은 [0.4, 0.3, 0.3]
  7. ClownFish를 선택하고, Capsule Collider스트립의 아래 프로퍼티들을 변경한다:
    • Radius은 4
    • Height은 4
    • Direction은 Z-axis
    • Center는 [0, 0, 0]
  8. Project패널의 FishClass를 Hierarchy 패널의 FishClass 위에 드래그 하라. 크라운피쉬도  fishclass로 역할을 부여한다.
  9. Project패널의 Models 폴더안의 mesh_clownfish모델을 선택하고 Inspector패널에서 Normals를 찾아 Calculate를 선택하고 아래로 스크롤 하여 Appl를 누른다.

Play 버튼을 눌러보자 – 추가 코드 없이 두개의 물로기가 움직이도록 했다.
Scrolling fish with Unity
완벽하다 – 물고기는 왔다 갔다 하고, 항공기는 반복 한다. 이제 폭격을 해야지. 콰콰쾅~~~

폭탄을 설치하기

깡통 모델을 다운로드하여 압축을 해제 한다. 해왔던 것처럼, colourcan.obj파일을 Project패널의 Models폴더에, cantex.bmp 파일을 Models/Textures 폴더에 드래그 한다.
메뉴에서 “GameObject/Create Other/Capsule”를 고르고, 오브젝트 이름을 Bomb로 바꾼다. Mesh Filter의 팝업을 더블클릭하여 깡통 geometry를 선택한다. cantex텍스쳐를 Hierarchy의 Bomb오브젝트 위로 드래그 한다. Inspector의 Capsule collider에서 아래 그림의 이 버튼을 클릭하여 팝업 메뉴를 연다:
Capsule Collider popup menu
팝업 메뉴가 나타나면 Reset을 고른다 – 이 방법을 사용하면 collider의 크기가 geometry의 크기에 자동으로 맞춰 진다. 쿨!
다음은, Project의  Models폴더에서 colourcan모델을 선택하고 Inspector에서 Normals을 찾아 Calculate를 선택한다. 아래로 스크롤하여 Apply를 클릭 하라.
이제 새로운 것을 해보자! Bomb오브젝트를 다시 선택하고 Capsule Collider 스트립에서 Is Trigger체크박스를 체크한다 – 아! 이것은 폭탄 오브젝트가 다른 오브젝트와 충돌하면 이벤트를 트리거 하도록 만든다.
그러나 이렇게 되게 하려면 폭탄에 Rigid body (강체)를 주어야 한다. (collider는 최소한 하나의 Rigid body를 가져야 한다). 메뉴에서 “Component/Physics/Rigidbody”를 고른다. (먼저 Hierarchy 에서 Bomb가 선택되어 있어야 한다!).
이 작업을 마치면 Inspector패널에 Rigidbody라는 새 스트립이 나타난다. Use gravity체크 박스를 해제한다(우리는 중력을 사용하지 않을 것이다). 이것으로 우리는 충돌 검출이 가능하게 되었다!
Adding a rigid body for collisions in Unity
폭탄을 떨구는 소리를 다운로드하여 디스크에 저장하라. (이건 내가 만든거다. 으하하!)
우리는 항공기가 폭탄을 떨어뜨릴때 이 소리를 재생할 것이다. 즉, 폭탄이 하면에 처음 나타날 때. 해보자!
Project에서 오른쪽 버튼을 눌러 Create/Folder를 고르고, 폴더 이름을 Audio로 바꾼다.”bahh1.aif파일을 Audio폴더 위로 드래그한다. 다음은 Project에서 bahh1을 Hierarchy의 Bomb오브젝트 위로 드래그 한다.
믿거나 말거나 사운드를 폭탄에 붙이는 것으로 화면에 폭탄이 등장할 때 소리를 재생할 준비가 되었다. 유니티로 하면 뭐든지 편하다.
Hierarchy에서 Bomb 오브젝트를 선택하고 Inspector 패널에서 Audio Source스트립을 찾아: Play On Awake 체크 박스를 보라 – 오브젝트가 화면에 등장할때 해당 사운드를 재생한다는 것을 뜻한다. Scene을 보라 – 폭탄에 스피커가 붙어 있다.
Setting the audio source for an object in Unity

게임 오브젝트(Game Object)를 미리 만들기(Prefabricating)

Hierarchy는 현재 씬을 보여준다. Project는 모든 오브젝트를 유지하고 있을까? 우리는 여기서 최종 목표를 위해 할것이 있다 – 비행기에 많은 폭탄을 적재하고 바다에 떨어 뜨려야 한다.
우리가 할게 뭐냐면 – 우리는 게임 오브젝트를 미리 만들어 둘 것이다 (미리 준비해서 씬에 놓을 것이다.). 그러나 그것을 씬에 추가하지 않을 것이다 – 우리는 prefab을 진짜 생생한 게임 오브젝트로 씬에 생성할 것이다 (공상과학 팬이라면 클론).
Project에서 오른쪽 버튼을 눌러서 Create/Folder를 고르고 Prefabs로 이름을 바꾼다. Prefabs폴더 위에서 오른쪽 버튼을 눌러 Create/Prefab을 고르고 새 Prefab 이름을 BombPrefab로 이름을 바꾼다. 조그만 큐브 아이콘이 흰색임을 잘 봐둬라 – 이것은 비어있는 prefab임을 뜻한다.
이제 – Hierarchy패널에서 Bomb를 Project패널의 BombPrefab 위로 드래그 한다. 큐브 아이콘이 파란색으로 바뀌었다 – prefab이 있음을 뜻한다. 복제할 준비가 되었다. 중요 – Hierarchy의 Bomb를 보면 파란색으로 바뀌어 있다. 이것은 오브젝트가 prefab의 인스턴스(클론)임을 뜻한다.
이제 우리는 폭탄 붕어빵 기계를 가지게 되어, 이제 씬에 오리지날 폭탄 오브젝트를 둘 필요가 없다. Hierarchy의 Bomb위에서 오른쪽 버튼을 눌러 Delete 를 골라 지워라.
코딩을 해보자! MonoDevelop로 전환하여 PlayerClass.cs를 열도록 한다. speed 프로퍼티 정의 부분 아래에 다음을 추가한다:

public GameObject bombPrefab;

벌써 짐작? 이 프로퍼티가 BombPrefab레퍼런스를 홀드하고, 쉽게 인스턴스를 만들 수 있다. 프로퍼티 타입이 GameObject이다. 앞에서 얘기 했지만 게임안의 모든것은 GameObject다. (Cocoa의 NSObject와 같다). 그래서 모든 그 타입을 잘 보관 한다.
(PlayerClass.cs를 저장하고) 이제 유니티로 되돌아가서 Player를 선택하라. Inspector 패널의 Script아래에 새 BombPrefab프로퍼티가 있다. 값을 설정해 보자: Project의 BombPrefab를 드래그 하여 Inspector 패널의 None(GameObject)위에 드롭 한다 – 이제 프로퍼티 필드의 값은 BombPrefab이다. 쿨!
폭탄에 C#클래스가 필요하다 – Project의  Class폴더에서 오른쪽 클릭하여 Crate/C Sharp Script를 고르고, “BombClass”로 바꾼다. 오른쪽 클릭하여 Sync MonoDevelop Project를 고르면 MonoDevelop가 뜬다. BombClass.cs를 열어 내용을 아래 코드로 변경하라:

using UnityEngine;
using System.Collections;
public class BombClass : MonoBehaviour {
	private float ySpeed = -4f;
	// Update is called once per frame
	void Update () {
		transform.Translate( new Vector3(0f, ySpeed*Time.deltaTime, 0f) );
		if (transform.position.y < -11) {
			Destroy(this.gameObject);
		}
	}
}

이 코드는 이전 코드들과 비슷하다 – 우리는 매 프레임마다 오브젝트를 이동시키고 화면 경계 밖으로 나가면 적절하게 대처한다. 폭탄의 경우 언제라도 Prefab에서 만들 수 있으므로 소멸시킨다.

gameObject 프로퍼티가 씬의 특정 개체를 참조하는 동안 코드의 this는 폭탄 클래스를 참조한다  – 씬의 모든 개체를 소멸시키고 모든 컴포넌트를 붙인다.  파트2에서 프로그램으로 게임 오브젝트 계층을 검색하고 컴포턴트를 액세스 하는 것을 해볼 것이다.

상어에게 폭탄을 때리자!

파트의 기다리던 마지막이다 – gratuitous violence! :]

PlayerClass.cs를 열어서 Update 메소드에 추가하라:

if (Input.anyKeyDown) {
	GameObject bombObject = (GameObject)Instantiate(bombPrefab);
	bombObject.transform.position = this.gameObject.transform.position;
}

한줄씩 생각해보자.

  1. Input은 키보드, 마우스, 중력센서, 터치에 접근하는 클래스다. 키가 눌릴때 Input.anyKeyDown은 true다. 이것은 버튼이 처음 눌렸을때 한번만 발생하고 다른 키가 눌릴때까지 false를 리턴한다. anyKeyDown은 추상화를 쉽게 해준다 – 마우스 버튼이 눌리거나 ,키보드 키가 눌리거나, 아이폰 화면이 터치되면 true다.
  2. (GameObject)Instantiate(bombPrefab) 은 Prefab에서 인스턴스를 만들어 씬에 추가하는 마술이다.

마지막으로

  1. 폭탄의 위치 값에 비행기 위치 값을 설정하였다.

쿨! – 플레이어가 화면을 탭하면 폭탄을 생성하여 떨어뜨리기 시작하고 화면 밖으로 나가면 알아서 소멸된다.
한번 해보자! 유니티로 되돌아가서 Play를 눌러라 – Game 패널을 클릭(탭 흉내)하면 비행기 위치에 폭탄이 생성되는 것이 보인다.
많이 눌러 보라 – 많은 폭탄이 생성된다. 폭탄 소리도 들린다. 하지만 폭탄이 떨어지지 않는다! 왜? 뭐가 문제인지 유추해 볼 수 있지? 쉬었다가 하자.

Cans in Unity game not falling down

문제 원인을 추정 해냈으리라 믿는다. 뭐가 문제이냐면:  BombClass 스크립트를 BombPrefab에 할당을 하지 않았다 – 이것이 폭탄이 떨어지지 않은 이유다. BombClass를 드래그하여 Project 패널의 Class 폴더의 BombPrefab위에 드래그 하라. Inspector에서 Script 스트립에 BombClass가 있나 확인하라. 다시 Play를 눌러라.

Properly falling cans in Unity game

그래도 완벽하지 않다 – 상어가 맞아도 죽지를 않는다. 우리는 이미 collider와  rigidbody 컴포넌트를 폭탄에 구성했고, 충돌이 작동하도록 코드를추가 하면 된다. MonoDevelop로 전환하여 BombClass에 아래 새 메소드를 추가하라:

void OnTriggerEnter(Collider obj) {
	if (obj.gameObject.name == "Shark") {
		//reset shark
		obj.gameObject.transform.rotation = Quaternion.identity;
		obj.gameObject.transform.position = new Vector3(20f, -3f, 8f);
		Destroy(this.gameObject);
	}
}

라인별로 살펴보자:

  1. OnTriggerEnter는 다른 바디와 바디가 충돌하면 호출된다. 두번쩨 바디는 파리미터로 전달된다.
  2. 전달되 개체가 “Shark”인지 체크한다.
  3. 상어가 맞으면, 먼저 회전을 초기화 한다.
  4. 다음은 상어를 시작 위치로 옮긴다.
  5. 마지막으로 폭탄이 화면에서 사라지도록 this.gameObject를 소멸시킨다.

꽤 쉽다 – 다시 유니티로 되돌아가서 게임을 실행해보자. 상어를 맞추면 새로 나타난다!

“File/Build Run” 메뉴를 고르고  Xcode가 나타나면 Xcode의 Run을 눌러서 아이폰에서 실행 해볼 수 있다.

A Simple 2.5D Game Created with Unity!

앞으로…

위의 튜토리얼에 사용된 코드가 샘플 프로젝트 에 있다.

새로 배우는 내용을 즐겼기를 바란다 – 시리즈의 파트2 에서 우리는 정말 즐겁고 재미있게 게임을 만들어 보자.

이 튜토리얼이나 유니티에 대해 질무니 있으면 아래 포럼의 토론에서 만나자.

이 블로그 포스트는 iOS 튜토리얼 팀 멤버이고, 12+년 의 경험을 가진 소프트웨어 개발자이며, 인디 iOS 개발자이고, Touch Code Magazine의 창립자인 Marin Todorov가 썼습니다.

Ray Wenderlich

Ray is an indie software developer currently focusing on iPhone and iPad development, and the administrator of this site. He’s the founder of a small iPhone development studio called Razeware, and is passionate both about making apps and teaching others the techniques to make them.

When Ray’s not programming, he’s probably playing video games, role playing games, or board games.

User Comments

0 Comment

Other Items of Interest

Ray의 월간 뉴스레터

Sign up to receive a monthly newsletter with my favorite dev links, and receive a free epic-length tutorial as a bonus!

Advertise with Us!

Our Books

Our Team

Tutorial Team

  • Dani Arnaout

... 50 total!

Update Team

... 15 total!

Editorial Team

  • Matt Galloway

... 23 total!

Code Team

  • Orta Therox

... 3 total!

번역 팀

  • Victor Grushevskiy
  • Lin Ma

... 33 total!

Subject Matter Experts

  • Richard Casey

... 4 total!