[출처]
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() 함수를 호출한 결과)
'IT_Games > Unity3D' 카테고리의 다른 글
Unity3D yield 사용법! (0) | 2013.06.27 |
---|---|
[unity3d][C#] 효과적인 C# 메모리 관리 기법 (0) | 2013.06.24 |
[펌] [UNITY] UI 해상도 대응하기! (0) | 2013.06.20 |
[펌] 46 Tips & Tricks for 2D mobile Performance in Unity. (0) | 2013.06.20 |
[펌] Unity3D 모바일 디바이스에서 파일생성 및 읽고 쓰기 (0) | 2013.06.20 |