IT_Games/Unity3D

[펌] Unity3D 를 활용한 3D 컨텐츠 개발

JJun ™ 2013. 6. 20. 17:40


 

[출처]

http://blog.naver.com/7narcissus7/30154537239

http://blog.naver.com/7narcissus7/30154569662


 

 

 

 

I. 3D 그래픽의 이해

 


1. Computer Graphics 의 구분

 

※ Raster Graphics

 - 직사각형 격자의 화소와 색상을 점의 형태로 모니터나 종이 등에 표시하는 그래픽 처리 기술

 - 비트맵(Bitmap)

 - RGB 형태로 표시

 - 고해상도의 이미지를 처리하기 위해 데이터 압축 기술을 사용

 - 이미지 확대시 계단 현상 발생

 - bmp, gif, jpg, psd, tga, pcx, tiff 등

 

※ Vector Graphics

 - 수학식을 기반으로 점, 직선, 곡선, 다각형 등을 표현하는 그래픽 처리 기술

 - 객체 지향 그래픽스

 - 이미지를 객채의 집합으로 처리

 - 데이터가 작고, 확대시 자연스러운 이미지 구현

 - 풍경 사진 등 자연스런 이미지 구현에 부적합

 - ai, cdr, eps, wmf, fla, swf, dwg 등

 

※ 3D Graphics

 - Object 의 기하학적 데이터를 X, Y, Z 로 나타내는 공간 좌표를 이용하여 3차원으로 표현한 후 2차원의 결과물로 출력하는 그래픽 처리 기술

 - Object 를 표시하기 위한 Modeling 과정

 - Object 에 재질과 표면 처리를 위한 Mapping 과정

 - 카메라 조명 등을 고려하는 Rendering 과정

 - 3DMax, Maya, Cinema4D, Blender, Autocad, Sketchup Pro 등

 - 3ds, max, ma, c4d, blender, skp, fbx 등

 

 


 


 

2. 3D Model 의 종류

 

※ Wireframe Model

 - 물체 표면을 작은 면으로, 면을 선으로, 선을 직선, 점 으로 표시

 - 데이터 양이 적고, Modeling 을 고속 처리

 - 가려져 있어야 할 부분(Hidden Line) 까지 디스플레이

 

※ Surface Model

 - Wireframe Object 에 면을 입힌 형태

 - Object 의 내부는 텅 빈 공간으로 표현

 - Object 의 표면과 안쪽 면이 존재

 

※ Solid Model

 - Object 의 내부가 채워져 있는 덩어리 형태

 - Object 의 질량, 부피, 강도 등의 정보

 - 2개의 Object 를 더하거나 빼는 작업이 가능

 - 데이터 양이 많고, 작업 속도가 느림

 

 


 

 

 


3. 3D Modeling 의 방법

 

※ Loft Modeling

 - 2D Shaple 을 두께 및 경로( Path)로 돌출시켜 3D Object 를 만드는 방식

 - Object 의 단면을 기본 도형으로 하고 여기에 직선, 곡선 경로의 높이를 추가

 - 여러개의 Shape 과 Scale 등의 변형을 이용하여 다양한 모델

 

※ Lathe Modeling

 - 2D Shape 을 지정한 회전축을 중심으로 회전시켜 3D Object 를 만드는 방식

 - Step 을 설정하여 다각형 형태의 모델 가능

 - 회전 각도를 지정하여 단면체 제작이 가능

 

※ Primitive Modeling

 - 구(Sphere), 육면체(Box), 원기둥(Cylinder) 등의 기본 도형을 이용한 방식

 - Boolean 연산, 도형의 표면을 돌출, 도형의 가감, 을 통해 새로운 Object 생성

 

※ Patch Modeling

 - Patch 를 이어 붙여서 Object 의 표면을 만드는 방식(장판을 이어 붙이듯)

 - 다양한 형태의 곡면으로 구성된 Object 의 Modeling 에 사용

 

 


 

 


4. Surface Model 의 종류

 

※ Polygon 방식

 - Object 의 모든 면을 삼각형의 집합으로 구성

 - 면이 가지고 있는 세 점의 위치 (x, y, z) 로 표현

 - 완성 후 변형이나 면의 추가 및 변형이 쉽다.

 - 거의 모든 Polygon 의 Boolean 연산이 가능

 - 부드러운 곡면은 Polygon 을 분할해서 처리

 - 곡면을 확대하면 평면

 - 면의 수 조절 가능

 - 렌더링 속도가 가장 빠르다

 - 대부분의 게임에서 Polygon 방식만 사용

 

※ NURBS(Non-Uniform Rational B-Spline)

 - B-Spline 을 이용해 점을 나타내고, 점을 기본으로 곡면을 구성

 - Model 의 부드러운 곡면의 표현이 가능, 면을 확대해도 곡면을 유지

 - 면에 조절점을 추가하면 가로 또는 세로줄의 면에 모두 조절점이 2배로

 - 조절점 사이를 수학적으로 계산하므로 계산 시간이 많이 걸림

 - Boolean 연산과 Trim 이 가능

 - Nurbs Model 은 Polygon 모델로 변환 가능

 

※ Patch 방식

 - Polygon 과 Nurbs 의 장점을 가지고 있는 모델링 방법

 - Nurbs 만큼 부드럽고 렌더링이 훨씬 빠름

 - 조절점 사이를 단순한 커브로 계산 후 Step 값으로 곡면을 조절

 - 곡면을 확대하면 평면

 - 면을 나누면 가로, 세로 모든 면이 2배로

 - Boolean 연산과 Trim 이 불가능

 - Patch Object 는 Polygon 이나 Nurbs 로 변환이 가능

 - 렌더링 속도는 Nurbs 보다 빠르고 Polygon 보다 느림

 

 


 

 


5. 평면 좌표와 공간 좌표

 

※ 평면 좌표

 - 직교좌표, 극좌표, UTM좌표, 경위도 좌표, 구면극좌표 등

 - 보통 데카르트 좌표를 의미

 - (x, y) 축을 이용해서 점, 평면, 직선, 및 곡선을 표시

 

※ 공간 좌표

 - 직교좌표, 원기둥좌표, 곡선좌표

 - 보통 공간 직교좌표를 의미

 -(x, y, z) 축을 이용해서 도형의 폭과 높이 및 깊이를 표시

 

※ 왼손 좌표계 와 오른손 좌표계

 - 공간 좌표에서 z 축을 결정하기 위한 방법

 

        a. 왼손 좌표계                                               b. 오른손 좌표계

 

                 x                                                                   y

                 ↑      z                                                          ↑

                      ↗                                                                  → x

                          → y                                              z ↙

 - 관찰자가 캐릭터 뒷면을 봄                            - 관찰자가 캐릭터 앞 면을 봄

 

 


 

 

 


6. Object 의 회전과 투영

 

※ 투영(Projection)

 - 3 차원 공간의 Model 을 2차워 평면의 종이나 모니터에 표시

 

※ 투시(Perspective)

 - Object 를 평면에 투영할 때 원근을 고려해서 가까운 곳은 크고, 먼 좃은 작게 투영

 - 소실점 개념이 도입

 

※ 원주 위의 점

 

 

※ 타원 위의 점

 

 

※ 평면도형의 회전

 

 

 

 

※ 3D Object 의 회전

 - Object 가 x→y→z 순으로 α, β, γ 각도로 회전할 때 점(x, y, z) 는 다음과 같이 변한다.

 

 a. x 축 회전(α)

     x1 = x

     y1 = y·cos(α) - z·(α)

     z1 = y·sin(α) + z·cos(α)

 

 b. y 축 회전(β)

     x2 = y1·cos(β) + z1·sin(β)

     y2 = y1

     z2 = -y1·sin(β) + z1·cos(β)

 

 c. z 축 회전(γ)

 

     x3 = x2·cos(γ) - y2·sin(γ)

     x3 = x2·sin(γ) + y2·cos(γ)

     x3 = z2

 

 


 

 


7. 3D Object 의 구성 요소

 

※ Vetex

 - Object 의 최소 평면을 구성하는 점 (255 개까지만 된다)

 

※ Edge(Segment)

 - Vertex 사이의 선분

 

※ Mesh(Polygon, Face)

 - Edge 로 구성된 Object 의 평면(표면)

 

※ Shading

 - Mesh 에 색을 칠해서 Object 를 구성하는 것(색깔)

 

※ Material

 - Object 의 재질 및 질감을 표현하기 위한 도구(재질감)

 

※ Texture

 - Material 의 질감 및 무늬를 표현하기 위한 이미지

 

※ Mapping

 - Object 의 표면에 Material 과 Texture 를 부여하는 것

 

※ Map

 - Mapping 방법 또는 Mapping 이미지

 

※ Normal

 - Object 의 겉면 또는 겉면을 나타내기 위한 법선

 

※ Rendering

 - Object 에 광원 효과 등을 적용해서 완성된 이미지를 생성하는 것

 

 


 

 

 


8. Light 와 Camera


※ Ommi Light(Directional Light)

 - 태양 광선과 같이 방향만 있고 거리감이 없는 조명

 

※ Point Light

 - 전등과 같이 방향과 거리감이 있는 조명

 

※ Spotlight

 - 방향과 거리감이 있으며 Spot Point 가 있는 조명

 

※ Perspective / Orthographic

 - 카메라의 원근 표시 방식

 

※ View Angle

 - 카메라의 화각(표준, 광각, 망원(

 

※ View Depth

 - 카메라의 피사체 표현 범위

 

 

 

 


 

 

 

 

II. Unity3D 소개

 

 

1. Unity3D 의 특장점

 

※ 멀티 플랫폼 지원

 - Windows, Mac OS, Lunux, Web, Flash, Android, iOS, PS2, XBox, wii

 

※ 통합 개발 환경 제공

 - 게임 Design, Play, Animation, Hierarchy, Project, Inspector

 

※ 다양한 3D Format 지원

 - 3dsMax, Maya, Cinema 4D, Blender, SketchUp Pro, fbx

 

※ 물리 기반 엔진

 - 물리와 수학 처리에 기반을 둔 3D 엔진

 

※ Script 언어 사용

 - JavaScript, C# Script, Boo Script 선택적 사용

 

※ 체계적인 레퍼런스와 예제 제공

 - 인터넷과 Web 을 이용해서 체계적인 메뉴얼과 예제 제공

 

 


 

 

 

2. Unity3D 의 인터페이스

 

※ Scene Design 탭

 - Scene 디자인 및 Object 배치

 

※ Game 탭

 - Game 실행

 

※ Hierarchy 탭

 - Scene 을 구성하는 Object 의 계층 구조 표시

 

※ Project 탭

 - Project 에 필요한 각종 리소스 관리

 

※ Inspector 탭

 - Object 와 Resource 의 속성 설정 및 제어

 

 


 

 

 

3. Unity3D 의 기본 기능

 

※ GameObject 알아보기

 a. Scene 에 GameObject 설치

 b. GameObject 이동, 회전, Scale

 c. Scene 의 회전 및 Scale

 d. Light 추가 및 속성 설정

 e. Asset 추가

 f. GameObject 의 매핑

 

 


 

 

 

4. Unity3D 프로그래밍 기초

 

※ Unity3D Project 개발 순서

 a. 프로젝트에 필요한 리소스 추가

 b. Scene 디자인

 c. Object 를 제어하기 위한 Script 작성

 d. Script 를 Object 에 연결

 e. Script 의 변수 설정

 f. 프로젝트 실행

 

※ GameObject 움직이기

 a. Scene Design

 b. RigidBody Component 추가 및 속성 설정

 c. Asset 및 Package 추가

 d. Script 작성

 

【예】jsBall.js

  // 충돌 Event

  function onCollisionEnter(coll : Collision){

       sudio.Play();

  }

 

※ Vector3(x, y, z) : 왼손 좌표계

 - GameObject 의 공간상의 위치 및 방향 표시

 

【예】

  전진                         Vector3(0, 0, 1)

  후진                         Vector3(0, 0, -1)

  오른쪽 옆걸음            Vector3(1, 0, 0)

  왼쪽 옆걸음               Vector3(-1, 0, 0)

  제자리 점프               Vector3(0, 1, 0)

  뛰어 내리기               Vector3(0, -1, 0)

  원점                         Vector3(0, 0, 0)

 

※ GameObject 발사

 a. Scene Design

 b. RigidBody Component 추가 및 설정

 c. Asset 및 Package 추가

 d. Script 작성

 

【예】jsShoot.js

  var ball : GameObject;

  var power = 1200;

 

  function Update(){

       if(Input.GetButtonDown(" Fire1 "){

            ball.rigidbody.AddForce(Vector3.forward * power);

       }

  }

 

※ GameObject 이동 및 발사

 a. 키를 이용해서 GameObject 이동 및 발사

 

【예】jsShoot.js(위 코드를 수정) 

  var ball : GameObject;

  var power = 1200;

  var speed = 5;

 

  function Update(){

       var amtMove = speed * Time.deltaTime;

       var dirX = Input.GetAxis(" Horizontal ");

       var dirZ = Input.GetAxis(" Vertical ");

 

       transform.Translate(Vector3(dirX * amtMove, 0, dirZ * amtMove));

 

       if(Input.GetButtonDown(" Fire1 "){

            ball.rigidbody.AddForce(Vector3.forward * power);

       }

  }

 

※ Unity3D 프로그래밍 기초

 - 계층적이 Object

  : GameObject 를 계층적으로 구성하고 각각 제어한다.

 

   a. 기본 GameObject 설치 및 속성 설정

 오브젝트

 이름

 속성

 값

 비고

 Plane

 바닥

 Position x, y, z

 Scale x, y, z

 0, -0.5, 0

 3, 1, 3

 초록색으로 설정

 Cube

 본체

 Position x, y, z

 Scale x, y, z

 0, 0, 0

 1.5, 1.3, 4 

 

 Sphere

 포탑

 Position x, y, z

 Scale x, y, z

 0, 0.75, 0.6

 1, 1, 1.7

 

 Cylinder

 포신

 Position x, y, z

 Rotation x, y, z

 Scale x, y, z

 0, 1.1, 2.6

 80, 0, 0

 0.3, 1.5, 0.3

 

 

   b. 빈 Gameobject 를 하나 추가한 후 속성을 설정하고 GameObject 를 계층적으로 구성

 오브젝트

 이름

 속성

 값

 비고

 GameObject

 탱크

 Position x, y, z

 0, 0, 0

 

 

【예】jsTank.js

  var speed : in = 5;                                             // 이동 속도(m/s)

  var rotSpeed = 120;                                            // 회전 속도(각도/s)

 

  function Update(){

       var amtMove = speed * Time.deltaTime;          // 이동 거리

       var amtRot = rotSpeed * Time.deltaTime;          // 회전 각

 

       var dir = Input.GetAxis(" Vertical ");                // 전후진

       var ang = Input.GetAxis(" Horizontal ");           // 회전

 

       transform.Translate(Vector3.forward * dir * amtMove);

       transform.Rotate(Vector3.up * ang * amtRot);

  } 

 

※ 사용자 키 설정

 - 사용자가 키를 설정하고 프로그램에서 활용한다.

  a. [ Edit ]→[ Project Settings ]→[ Input ] 메뉴를 이용해서 키를 설정한다.

 항목

 초기값

 변경할 내용

 Name

 Window Shake X

 MyTank

 Alt Negative Button

 공란

 q

 Alt Positive Button

 공란

 e

 Gravity

 0

 3

 Dead

 0

 0.001

 Sensitivity

 0.1

 3

 Snap

 해제

 체크

 Type

 Window Movement

 Key or Mouse Button

 

   b. Script 에 포탑을 제어하는 부분을 추가한다.

 

【예】jsTank.js

  var speed : in = 5;                                                                        // 이동 속도(m/s)

  var rotSpeed = 120;                                                                       // 회전 속도(각도/s)

 

  var turret : GameObject;                                              // 포탑 - 추가

 

  function Update(){

       var amtMove = speed * Time.deltaTime;                                     // 이동 거리

       var amtRot = rotSpeed * Time.deltaTime;                                     // 회전 각도

 

       var dir = Input.GetAxis(" Vertical ");                                           // 전후진

       var ang = Input.GetAxis(" Horizontal ");                                      // 회전

       var ang2 = InputGetAxis(" MyTank ");                         // 포탑회전 - 추가

 

       transform.Translate(Vector3.forward * dir * amtMove);

       transform.Rotate(Vector3.up * ang * amtRot);

       turret.transform.Rotate(Vector3.up * ang2 * amtRot);      // 추가

  }

 

※ 포탄 만들기

 a. 포탄을 만들고 속성을 설정한 후 Prefab 으로 등록한다.

 b. Script 에 포탄을 발사하는 부분을 추가한다.

 오브젝트

 이름

 속성

 값

 비고

 Sphere

 포탄

 Scale x, y, z

 Rigidbody

 0.2, 0.2, 0.5

 추가

 

 

【예】jsTank.js

  var speed : in = 5;                                             // 이동 속도(m/s)

  var rotSpeed = 120;                                            // 회전 속도(각도/s)

 

  var turret : GameObject;                                     // 포탑

 

  var Power = 1200;                                // 포탄 발사 속도 - 추가

  var bullet : Transform;                          // 포탄 - 추가

 

  function Update(){

       var amtMove = speed * Time.deltaTime;          // 이동 거리

       var amtRot = rotSpeed * Time.deltaTime;          // 회전 각도

 

       var dir = Input.GetAxis(" Vertical ");                 // 전후진

       var ang = Input.GetAxis(" Horizontal ");           // 회전

       var ang2 = InputGetAxis(" MyTank ");             // 포탑회전

 

       transform.Translate(Vector3.forward * dir * amtMove);

       transform.Rotate(Vector3.up * ang * amtRot);

       turret.transform.Rotate(Vector3.up * ang2 * amtRot);     

 

       // 추가

       if(Input.GetButtonDown(" Fire1 ")){

            var myBullet = Instantiate(bullet, turret.transform.position, turret.transform.ratation);

            myBullet.rigidbody.AddForce(turret.Forward * Power);

       }    

  }

 

※ Spawn Point 설치

 a. 포구 앞에 빈 GameObject 를 추가하고 속성을 설정한 후 포탑의 하위 개체로 만든다.

 b. 포탄 발사 시 Spawn Point 를 참조하도록 Script 를 수정한다.

 오브젝트

 이름

 속성

 값

 비고

 Gameobject

 Spawn Point

 Position x, y, z

 Rotation x, y, z

 0, 1.37, 4.5

-10, 0, 0 

 포구 앞

 

【예】jsTank.js

  var speed : in = 5;                                             // 이동 속도(m/s)

  var rotSpeed = 120;                                            // 회전 속도(각도/s)

 

  var turret : GameObject;                                     // 포탑

 

  var Power = 1200;                                             // 포탄 발사 속도

  var bullet : Transform;                                       // 포탄

  

  var spPoint : GameObejct;                    // Spawn Point - 추가

 

  function Update(){

       var amtMove = speed * Time.deltaTime;          // 이동 거리

       var amtRot = rotSpeed * Time.deltaTime;          // 회전 각도

 

       var dir = Input.GetAxis(" Vertical ");                 // 전후진

       var ang = Input.GetAxis(" Horizontal ");           // 회전

       var ang2 = InputGetAxis(" MyTank ");             // 포탑회전

 

       transform.Translate(Vector3.forward * dir * amtMove);

       transform.Rotate(Vector3.up * ang * amtRot);

       turret.transform.Rotate(Vector3.up * ang2 * amtRot);

 

      // spPoiint 추가

       if(Input.GetButtonDown(" Fire1 ")){

            var myBullet = Instantiate(bullet, spPoint.transform.position, spPoint.transform.ratation);

            myBullet.rigidbody.AddForce(turret.spPoint.Forward * Power);

       }

  }

 

※ 장애물 맞추기

 a. Scene 의 여러 곳에 벽(cube)을 세우고 포탄으로 폭파시킨다.

 b. 포탄의 Collider 에 있는 Is Trigger 속성을 on 시킨다.

 c. 포탄의 충돌 처리 Script 를 작성한 후 Prefab 에 연결한다.

 

【예】jsBullet.js

  function onTriggerEnter(coll : Collider){

       Destroy(gameobject);

       Destroy(coll.gameObject);

  }

 

※ 폭파불꽃 표시

 a. 프로젝트 탭에서 오른쪽 버튼 [ Import Package ]→[ Particles ] 추가

 b. Standard Assets / Prticles / Fire / Fires1 을 Hierarchy 탭에 추가

 c. 속성을 변경하고 Prefab 으로 만드록 Hierarchy 탭의 불꽃은 삭제한다.

 오브젝트

 이름

 속성

 값

 의미

 Fire1

 InnerCore

 OuterCore

 Smoke

 Min, Max Size

 Min, Max Energy

 One Shot

 Ellipsoid x, y, z

Autodestruct

 0.5, 1

 1, 1

 On

 0.6, 0.6, 0.6

 On

 입자의 크기

 입자의 초단위 수명

 단발성으로 표시

 입자가 일렁이는 범위

사용이 끝나면 자동제거

 

【예】jsBullet.js

  var fire : Transform;                                                                  // 추가

 

  function onTriggerEnter(coll : Collider){

 

      Instantiate(fire, transform.position, coll.transform.ratation);           // 추가

       Destroy(gameobject);

       Destroy(coll.gameObject);

  }

 

※ Tag 사용

 a. Inspector 에서 Wall Tag 를 만들고 Hierarchy 탭의 모든 벽에 Tag 를 설정

 b. Tag 가 Wall 인 것만 폭파하도록 Script 수정

 

【예】jsBullet.js

  var fire : Transform;                                                                  

 

  function onTriggerEnter(coll : Collider){

 

      // if 문 추가

      if(coll.tag == " Wall "){

          Instantiate(fire, transform.position, coll.transform.ratation);          

            Destroy(gameobject);

            Destroy(coll.gameObject);

       }

  }

 

 


 

 

 

 

5. Animation 구현

 

※ Animation Clip 만들기

 a. 애니메이션을 적용할 Object 를 선택한 후 [ Windows ]→[ Animation ] 메뉴 이용

 b. Animation Clip 파일명 입력

 c. Add Curves 로 새로운 Animation Curve 생성

 d. Key Frame 을 설정하고 Animation 설정

 

※ Animation Event

 - 애니메이션이 실행될 때 발생할 Event 설정

 - Script 의 function 으로 작성

 - Evnet 가 필요한 Key Frame 에 Event 함수 연결

 

※ 카드 회전 Animation

 a. 가위 바위 보 이미지 다운 받기

 b. Unity 에서 새 프로젝트 생성후 탭에 Resources 폴더 생성

 c. [ Assets ]→[ Import New Asset ] 메뉴를 클릭해서 Resources 폴더에 다운받은 이미지 저장

 d. Hierarchy 탭에 Cube 를 하나 설치 하고 속성 설정

 e. Cube 에 Resources 폴더의 이미지를 연결해서 매핑

 오브젝트

 이름

 속성

 값

 Cube

 Cube

 Position x, y, z

 Scale x, y, z

 0, 0, 0

 2, 0.01, 2

 Main Camera

 Main Camera

 Position x, y, z

 Rotation x, y, z

 0, 2, -2

 45, 0, 0

 

※ Animation 만들기

 a. [ Windows ]→[ Animation ] 메뉴로 애니메이션 창 호출(Game Tab 옆의 Tab 으로 설정)

 b. Cube 를 선택하고 새로운 Animation Clip 생성(파일명 : aniScale)

 c. Rotate.z 에서 오른쪽 버튼을 누르고 [ Add Curve ] 설정

 d. 1:00, 2:00 에 Add Key 로 Key Frame 설정

 e. Key Frame 1:00, 2:00 의 Rotation.z 에 각각 -180, -360 입력

 

※ Animation Event 만들기

 a. Project 탭에서 Javascript 생성(파일명 : jsChangImage)

 b. 이미지를 바꾸는 함수를 작성하고 Cube 에 연결

 c. 1:00, 2:00 프레임에 Ratation.z 에 각각 -180, -360 입력

 d. 0:30, 1:30 프레임에 Animation Evnet 추가

 e. 0:30, 1:30 프레임에 각각 Image1(), Image3() 함수 할당

 

【예】jsChangeImage.js

  function Image1(){

       transform.renderer.material.mainTexture = Resources.Load(" img_1 ");

  }

 

  function Image3(){

       transform.renderer.material.mainTexture = Resources.Load(" img_3 ");

  }

 

 

 


 

 

 

6. GUI 와 GUI Skin

 

※ Object 만들기

 a. 새 Scene 을 시작하고 hierarchy 탭에 Cube 설치 후 속성 설정

 b. img_1 을 Cube 에 연결하여 Material 추가

 c. Material 의 Shader 를 Transparent Diffuse 로 설정하여 투명색 적용

 오브젝트

 이름

 속성

 값

 비고

 Cube

 _you

 Position x, y, z

 Scale x, y, z

 -1.2, 0, 0

 1, 0.1, 1

 화면의 왼쪽

 평판 형태 

 Main Camera

 Main Camera

 Position x, y, z

 Rotation x, y, z

 Projection

 Size

 Clipping Plans

 0, 3, 0

 90, 0, 0

 Orthographic

 2

 0.3, 20

 

 위에서 아래 조명

 카메라 원근을 없앰

 값이 작으면 확대됨

 카메라 조명 범위

 

※ Animation 만들기

 a. _you 를 선택한 후 Animation Clip 생성(파일명 : aniScale1)

 b. Time Line 의 0:30, 1:30, 2:00 위치에 Key Frame 추가

 c. 0:30, 2:00 프레임의 Scale.x. 와 Scale.z 에 각각 1.1 입력

 d. 1:30 프레임의 Scale.x 와 Scale.z 에 각각 0.9 입력

 e. 애니메이션 Loop 설정

 

※ 애니메이션과 오브젝트 복사

 a. Porject 탭의 aniScale1 을 선택하고 [ Ctrl +D ] 키를 눌러 복사(aniScale2 가 만들어짐)

 b. Hierarchy 탭의 _you 를 선택하고 [ Ctrl + D ] 키를 눌러 복수 후 _com 으로 이름 변경

 c. _com 의 Position.x 를 1.2 로 변경

 d. Inspector 에서 _com 의 Animation Clip 을 aniScale2 로 변경

 e. _you 를 선택하고 Animation 창에서 0:30, 1:30 프레임의 Scale.x 를 각각 -1.1, -0.9 로 변경

    (Scale 을 음수로 설정하면 이미지의 뒤집혀서 매핑된다.)

 

※ GUI Text 설치

 a. Hierarchy 탭에 GUI Text 를 하나 추가하고 속성 설정

 오브젝트

 이름

 속성

 값

 의미

 GUI Text

 txtYou

 Position x, y, z

 Text

 Anchor

 Alignment

 Font Size

 Font Style

 0.1, 0.88, 0

 " 당신 "

 middle center

 center

 18

 Bold

 GUi Text 의 위치

 표시할 내용

 오브젝트의 기준 위치

 글자 정렬

 글자 크기

 진하게

 

 b. txtYou 를 2개 복사하고 속성 설정

 오브젝트

 이름

 속성

 값

 의미

 GUI Text

 txtWin

 Position x, y, z

 Text

 0.5, 0.88, 0

 " 승패 "

 GUI Text 의 위치

 표시할 내용

 txtCom

 Position x, y, z

 Text

 0.88, 0.88, 0

 " Com "

 GUI Text 의 위치

 표시할 내용

 

※ Game Manager 만들기

 a. Hierarchy 탭에서 Empty Object 를 하나 추가하고 이름을 " 게임 매니저 " 로 설정

 b. Script 를 작성하고 게임 매니저에 할당(파일명 : jsManager)

 

【예】jsManager.js

  function onGUI(){

       var w = Screen.width / 2;                                //화면의 중심

       var h = Screen.height / 2;

 

       var btn1 = GUIButton(Rect (w * 0.4, h * 1.6, 100, 40), " 가위 ");

       var btn2 = GUIButton(Rect (w - 30, h * 1.6, 100, 40), " 바위 ");

       var btn3 = GUIButton(Rect (w * 1.4, h * 1.6, 100, 40), " 보 ");

  }

 

※ 변수 설정

 - jsManager 에 필요한 변수를 설정하고 Object 연결

 

【예】jsManager.js

  var objYou : Gameobject;               // 당신

  var objCom : Gameobject;              // 컴퓨터

 

  var txtYou : GUIText;                     // 당신의 점수표시

  var txtCom : GUIText;                    // 컴퓨터의 점수표시

  var txtWin : GUIText;                     // 승패 판정

 

  private var you : int;                     // 당신의 가위 바위 보

  private var com : int;                    // 컴퓨터의 가위 바위 보

 

  private var scYou = 0;                  // 당신의 점수

  private var scCom = 0;                 // 컴퓨터의 점수

 

※ 버튼 Event 처리

 -OnGUI() 에서 처리

 

【예】jsManager.js

  var objYou : Gameobject;               // 당신

  var objCom : Gameobject;              // 컴퓨터

 

  var txtYou : GUIText;                     // 당신의 점수표시

  var txtCom : GUIText;                    // 컴퓨터의 점수표시

  var txtWin : GUIText;                     // 승패 판정

 

  private var you : int;                     // 당신의 가위 바위 보

  private var com : int;                    // 컴퓨터의 가위 바위 보

 

  private var scYou = 0;                  // 당신의 점수

  private var scCom = 0;                 // 컴퓨터의 점수

 

  function onGUI(){

       var w = Screen.width / 2;       //화면의 중심

       var h = Screen.height / 2;

 

       var btn1 = GUIButton(Rect (w * 0.4, h * 1.6, 100, 40), " 가위 ");

       var btn2 = GUIButton(Rect (w - 30, h * 1.6, 100, 40), " 바위 ");

       var btn3 = GUIButton(Rect (w * 1.4, h * 1.6, 100, 40), " 보 ");

 

       // 추가

      if(btn1) you = 1;

      if(btn2) you = 2;

      if(btn3) you = 3;

 

      if(btn1 || btn2 || btn3) CheckScore();

  }

 

※ 이미지 바꾸기와 승패 판정

 - 가위(1) < 바위(2) < 보(3) < 가위(1) < 바위(2) < ...

 

【예】jaManager.js 에 CheckScore() 함수 추가

  function CheckScore(){

       com = Random.Range(1, 4);                                // 1~3 사이의 난수

       objYou.renderer.material.mainTexture = Resources.Load(" img_" + you);

       objCom.renderer.material.mainTexture = Resources.Load(" img_" + com);

 

       var n = you - com;

       if(n == 1 || n == -2){

            txtWin.text = " 당신이 이겼습니다.";

            scYou ++;

       }else if(n == 0){

            txtWin.text = " 비겼습니다. ";

       }else{

            txtWin.text = " 컴퓨터가 이겼습니다. ";

            scCom ++;

       }

       txtYou.text = " 당신 : " + scYou;

       txtCom.text = " Com : " + scCom;

  }

 

※ GUI Skin 사용하기

 a. Project 탭에 Font 와 GUI Skin 추가 

 b. GUI Skin 의 Font 설정

 c. Button 의 속성 설정(Nomal, Hover, Active)

 

【예】

  var skin : GUISkin;                    // GUI Skin

  ...

  function onGUI(){

       GUI.skin = skin ;

       ...

  }

 

※ 화면 해상도 설정

 

※ 종료 버튼 추가

 

【예】

  function onGUI(){

       ...

       if(GUI.Button(Rect (w * 1.6, h * 1.6, 120, 60), " 종료 ")){

            Application.Quit();

       }

  }

 

 

 


 

 

 

 

7. Android / iPhone Build

 

※ Mobile 단말기용으로 Build

 - iPhone Build 는 Mac OS 에서만 가능하며 개발자 등록 필요

 - Android 는 PC 에 Android 개발 환경 필요 (Java, Android SDK, Eclipse)

 - [ Edit ]→[ Preferences ]→[ External Tools ]→[ Android SDK Location ] 메뉴에서 Android SDK 경로 설정

 

※ Build Target 설정

 - [ File ]→[ Build Settings ] 메뉴에서 설정

 - Icon, Splash Image, SDK API Level, Graphic Level 등

 - Build / Build and Run

 

 

 


 

 

 

 

8. Android 에서 Unity 프로젝트 실행

 

※ Android Project 에 Unity Project 를 라이브러리로 연결

 ① Unity3D 의 Project Build

   - [ File ]→[ Build Settings ]→[ Android ] 메뉴 이용

   - [ Player Settings ] 의 [ Other Settings ] 에서 Bundle Identifier 작성

      (Android 의 Package 명과 같아야 함)

   - [ Build ] 버튼을 눌러 빌드한다.

 

 ② Unity 프로젝트의 StagingArea 폴더 보존

   - Unity 프로젝트의 temp 폴더에 있는 StagingArea 폴더를 다른 위치에 저장

 

 ③ 이클립스에서 StagingArea 불러오기

   - [ File ]→[ New ]→[ Project ]→[ Android ]→[ Android Project from Existing Code ] 선택

   - Root Directory 에 저장해 둔 StagingArea 폴더 지정 

 

 ④ 불러온 프로젝트를 라이브러리로 설정

   - [ Project ]→[ Android ] 창에서 Android 버전 확인

   - " Is Library " 로 설정

 

 ⑤ 새로운 Android 프로젝트 생성

   - 패키지명을 Unity 와 동일하게 설정

 

 ⑥ StagingArea 라이브러리 추가

 

 ⑦ Java Build Path 에 [ Unity / Editor / Data / PlaybackEngines / androidplayer / bin ] 폴더 설정

 

 ⑧ StagingArea 의 Assets 하위 폴더를 새 프로젝트의 Assets 폴더로 이동

 

 ⑨ 새 프로젝트의 ...extend Activity 를 [ extend UnityPlayerActivity ] 로 변경

 

 ⑩ [ Ctrl + Shift + O ] 키를 눌러 [import com.unity3d.player.UnityPlayerActivity ] 추가

 

 ⑪ setContentView(...) 삭제

 

 ⑫ 프로젝트 실행

 

 ⑬ 필요 시 Frame Layout 을 만들고 addView() 로 Unity 라이브러리를 창모드로 실행

 

 

 


 

 

 

 

9. Android 와 Unity 의 상호 호출

 

※ Android Project 를 Unity 의 라이브러리로 설정

 ① Unity 의 Project 탭에 [ Plugins ]→[ Android ] 폴더 생성

 

 ② 이클립스에서 ① 의 폴더에 Android 프로젝트 생성

 

 ③ Unity 에서 호출할 function 작성

   - 이 함수에서 Unity function 도 호출

 

【예】

  private Handler handler = new Handler(){

       public void handleMessage(Message msg){

            if(msg ! = null){

                 String str = msg.obj.toString();

                 Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();

            }

       }

  };

 

  public void showToast(String str){

       Message msg = new MEssage();

       msg.obj = str;

       handler.sendMessage(msg);

 

       UnityPlayer.UnitySendMessage(" Cube ", " MoveCube ");

  }

 

 ④ Android 프로젝트를 라이브러리로 설정

 

 ⑤ Android 프로젝트 수정

 

【예】

  import com.unity3d.player.UnityPlayer;

  import com.unity3d.player.UnityPlayerActivity;

 

  public class MainActivity extends UnityPlayerActivity{

 

       @Override

       public void onCreate(Bundle savedInstanceState){

            super.onCreate(savedInstanceState);

            // setContentView(R.layout.activity_main);

       }

       ...

  }

 

 ⑥ Unity 에서 Script 작성

 

【예】

  var jc : AndroidJavaClass;

  var jo : AndroidJavaObject;

 

  function Start(){

       jc = new AndroidJavaClass(" com.unity3d.player.UnityPlayer ");

       jo = jc.GetStatic.<AndroidJavaObject>(" currentActivity ");

  }

 

  function MoveCube(){

       transform.position.x += 0.2;

  }

 

  function CallAndroidFunction(){

       jo.Call(" showToast ", " --Unity Call Android Function !-- "):

  }

 

  function onGUI{

       if(GUI.Button(Rect (0, 0, 200, 80), " Call Unity to android ")){

            CallAndroidFunction();

       }

  }

 

 ⑦ Platform 을 Android 로 설정하고 Player 설정

   - 패키지명과 버전을 Android 와 일치시킴

 

 ⑧ 프로젝트 Build & Run

   - 버튼을 누르면 Android 의 Toast 가 표시된 후 Cube 가 오른쪽으로 이동한다.

     (Cube 이동은 Android 에서 Unity 의 MoveCube() 함수를 호출한 결과)