경남과학고등학교 프로그래밍 멘토링 플로우차트

4
연세대학교 컴퓨터과학과 14학번 도회린 경남과학고 정보 멘토링 2014.8.12 멘토링 플로우차트 Part 1. 유니티 3D 소개 #1. 유니티 시작하기 1.1.1 - 대한민국에서 게임 만들기 1.1.2 - 유니티란? 1.1.3 - 유니티 개발 환경 맛보기 Part 2. 게임 제작의 기초 #1. 기본 물체 만들기 2.1.1 - 컴포넌트와 속성 (4.2) 2.1.2 - 조명 달기 (4.5) #2. 여러가지 효과 주기 2.2.1 - 물체에 텍스처 넣기 (4.8) 2.2.2 - 물체의 튕김 (4.9 ~ 4.10) 2.2.3 - 물체의 부딪힘 (4.12) 2.2.4 - 음향 효과 (4.11) Part 3. 3D 모델링 #1. 탱크 만들기 3.1.1 - 탱크 만들기 (4.18) 3.1.2 - 탱크 움직이기 (4.13) 3.1.3 - 탱크 조작키 설정하기 (4.15) 3.1.4 - 탱크 포탑 돌리기 (4.17) 3.1.5 - 시점 조절하기 (4.28) #2. 탱크 작동시키기 3.2.1 - 포탄 쏠 준비하기 (4.20 ~ 4.22) 3.2.2 - 포탄 쏘기 (4.23 ~ 4.24) 3.2.3 - 무대 꾸미기 (4.25 ~ 4.26) 3.2.4 - 폭탄 터짐 효과 주기 (4.26 ~ 4.27) 3.2.5 - 마무리 (4.30)

Upload: do-hoerin

Post on 14-Apr-2017

166 views

Category:

Software


3 download

TRANSCRIPT

Page 1: 경남과학고등학교 프로그래밍 멘토링 플로우차트

연세대학교 컴퓨터과학과 14학번 도회린

경남과학고 정보 멘토링 2014.8.12 멘토링 플로우차트 !!Part 1. 유니티 3D 소개 #1. 유니티 시작하기 •1.1.1 - 대한민국에서 게임 만들기 •1.1.2 - 유니티란? •1.1.3 - 유니티 개발 환경 맛보기 !!!Part 2. 게임 제작의 기초 #1. 기본 물체 만들기 •2.1.1 - 컴포넌트와 속성 (4.2) •2.1.2 - 조명 달기 (4.5) !#2. 여러가지 효과 주기 •2.2.1 - 물체에 텍스처 넣기 (4.8) •2.2.2 - 물체의 튕김 (4.9 ~ 4.10) •2.2.3 - 물체의 부딪힘 (4.12) •2.2.4 - 음향 효과 (4.11) !!!Part 3. 3D 모델링 #1. 탱크 만들기 •3.1.1 - 탱크 만들기 (4.18) •3.1.2 - 탱크 움직이기 (4.13) •3.1.3 - 탱크 조작키 설정하기 (4.15) •3.1.4 - 탱크 포탑 돌리기 (4.17) •3.1.5 - 시점 조절하기 (4.28) !#2. 탱크 작동시키기 •3.2.1 - 포탄 쏠 준비하기 (4.20 ~ 4.22) •3.2.2 - 포탄 쏘기 (4.23 ~ 4.24) •3.2.3 - 무대 꾸미기 (4.25 ~ 4.26) •3.2.4 - 폭탄 터짐 효과 주기 (4.26 ~ 4.27) •3.2.5 - 마무리 (4.30) !!!!!

Page 2: 경남과학고등학교 프로그래밍 멘토링 플로우차트

연세대학교 컴퓨터과학과 14학번 도회린!!

1.1.1 대한민국에서 게임 만들기 우리나라는 자칭 IT 강국이라고는 하지만, 게임 산업이 다소 기형적으로 발전해있다. 불법 다운로드가 만연하는 바닥에 망해버린 회사가 한 둘이 아니기 때문에 대부분의 회사들이 부분 유료화를 취한 온라인 게임을 만들고 있다. 그리고 그 틈을 비집고 STEAM, Origin 등의 외국 게임 플랫폼이 치고 들어오고 있다. 여성가족부의 지휘 아래 우리나라 정부의 셧다운제, 중독법 등 게임 규제는 상상을 초월한다. 따라서 게임 개발을 위해서는 해외 취업을 하는 것이 속편하다. 이는 비단 게임 업계에만 한정된 이야기는 아니고, 다른 프로그래밍 관련 직종도 국내 기업보다는 해외가 훨씬 사정과 대우가 낫다. !!1.1.2 유니티 3D(이하 유니티)란? 게임 엔진은 쉽게 말해서 ‘게임을 만드는 도구’이다. 게임을 만들기 위한 여러가지 도구들이 묶여져있는 패키지로, 소리, 영상, 각종 효과 등이 들어있어서 개발자가 꺼내쓸 수 있도록 한 것이다. 언리얼 엔진 등 다른 엔진에 비해 성능은 다소 떨어지지만, 저렴한 가격(경량판은 무료!)에 대비하면 충분히 멋진 기능들을 구현할 수 있다는 장점이 있다. 또한 다른 게임 엔진에 비해 직관적이고 쉽게 많은 기능들을 담아낼 수 있다. 이런 특징에 따라 주로 중소 게임 개발사들이 애용하는 엔진 중 하나이다. 이하는 시연을 하며 설명한다. !!3.1 탱크 만들기 1. 새로운 Scene을 만들고, 바닥을 설치하고 조명을 넣는다. 2. 탱크 에셋을 들여온 뒤 화면에 넣는다. Model에서 스케일을 0.05배로 조절하고, Mesh Compression을

Low로 지정한다. Material에 Texture을 씌운 후, 탱크에 Material을 적용한다. 3. 탱크를 움직일 수 있도록 스크립트 3.1.2를 적용한다. 4. 탱크를 키보드에서 조작할 수 있도록 스크립트 3.1.3.1을 적용한다. 대부분의 게임에서 사용하는 W/A/S/D

키가 그대로 적용된다는 점을 설명한다. 5. 좌우의 움직임은 어색하므로, 스크립트 3.1.3.2를 적용하여 회전하도록 변경한다. 6. 포탑을 돌리기 위하여, 우선 회전키를 Q/E로 설정한다. [Edit] > [Project setting] > [Input] 그리고 스크

립트 3.1.3.3을 적용한다.※ q / e / Gravity : 3 / Sensitivity : 3 / Snap : On / Type : Key or Mouse Button

7. 포신을 위아래로 돌리기 위하여, 스크립트 3.1.3.4을 적용한다. 지나치게 회전하는 것을 막기 위해서, 특정 각도로 제한한다는 점을 설명한다.

8. Project에서 [Import Package] > [Scripts]로 스크립트를 들여온다. 9. MainCamera에 SmoothFollow 스크립트를 적용하고, Target에 탱크를 설정한다. 시점 거리를 적당하게

조절한다. !3.2 탱크 작동시키기 1. 하이커라키에서 포탄을 만든다. 프로젝트의 Prefab 폴더로 옮긴 후 삭제한다.

※ Sphere / Name : Bullet / Scale : 0.2*0.2*0.6 / Material : GlassRed / RigidBody 설정 2. spPoint라는 이름의 Spawn Point를 만든다. [GameObject] > [CreateEmpty] 포신의 끝 부분으로 지

정한 후, Cannon의 아래 개체로 지정한다. 3. 스크립트 3.2.1을 적용하여, 발사력 등 포탄 발사를 준비한다. Bullet 변수에 Prefab을 연결한다. 4. 스크립트 3.2.2를 적용하여, Start() 함수에서 spPoint, turret, cannon을 연결해준다.

Page 3: 경남과학고등학교 프로그래밍 멘토링 플로우차트

연세대학교 컴퓨터과학과 14학번 도회린

5. 벽을 만든다.※ Cube / Name : Wall / Position : 0*1.5*34 / Scale : 6*3*1

6. 포탄이 벽에 맞으면 벽이 사라지도록 CsBullet 스크립트 3.2.2를 Bullet Prefab에 적용한다. 7. 바닥이 사라지지 않도록 태그를 설정한다. 하이커라키에서 아무런 오브젝트를 선택한 후, 태그를 추가

(TANK, WALL, PLANE)한 뒤 각각 적용시켜준다. 그 후 CsBullet 스크립트 3.2.3.1을 적용한다. 8. 포탄이 너무 오랫동안 남아있지 않도록 스크립트 3.2.3.2를 적용한다. 9. 프로젝트에서 [Import Package] > [Particle]을 들여온다. 10. Legacy Particles/Small explostion을 하이커라키에 설치한 후, 다음과 같이 속성을 설정한 뒤 Prefab

으로 만든다. ※ Size : 1, 1.2 / Energy : 0.8, 1.2 / Emission : 100, 100 / Local Velocity : 0, 0, 0 / Rnd Velocity : 3, 3, 3 / One Shot : On / Ellipsoid : 0.3, 0.3, 0.3 / Rnd Force : 0, 0, 0 / Force 0, 0, 0 / Autodesturct : On

11.폭발 효과를 위해 스크립트 3.2.4를 적용한다. !CsTank.cs using UnityEngine; using System.Collections; !public class CsTank : MonoBehaviour { ! //public GameObject turret; //3.1.3.3 GameObject turret; //3.2.2.1 GameObject cannon; //3.2.2.1 ! public Transform bullet; //3.2.1 Transform spPoint; //3.2.1 ! int tankSpeed = 5; //3.1.2 int rotateSpeed = 120; //3.1.3 int power = 2000; //3.2.1 ! void Start () { //3.2.2.1 spPoint = transform.Find ("Turret/Cannon/spPoint"); //3.2.2.1 turret = transform.Find ("Turret").gameObject; //3.2.2.1 cannon = transform.Find ("Turret/Cannon").gameObject; //3.2.2.1 } //3.2.2.1 ! void Update () { ! float amtMove = tankSpeed * Time.smoothDeltaTime; //3.1.2 float amtRotate = rotateSpeed * Time.smoothDeltaTime; //3.1.3.2 ! float keyForward = Input.GetAxis ("Vertical"); //3.1.2 float keySide = Input.GetAxis ("Horizontal"); //3.1.3.1 float keyTurret = Input.GetAxis ("Turret"); //3.1.3.3 float keyCannon = Input.GetAxis ("Mouse ScrollWheel"); //3.1.3.4 ! transform.Translate (Vector3.forward * amtMove * keyForward); //3.1.2 //transform.Translate (Vector3.right * amtMove * KeySide); //3.1.3.1 transform.Rotate (Vector3.up * amtRotate * keySide); //3.1.3.2 ! turret.transform.Rotate (Vector3.up * amtRotate * keyTurret); //3.1.3.3 cannon.transform.Rotate (Vector3.right * keyCannon * 4); //3.1.3.4 //... Vector3 angle = cannon.transform.eulerAngles; if (angle.x > 180) { angle.x -= 360; } angle.x = Mathf.Clamp (angle.x, -15, 5); //... cannon.transform.eulerAngles = angle; //3.1.3.4 ! if (Input.GetButtonDown ("Fire1")) { //3.2.2.2 FireBullet (); //3.2.2.2

Page 4: 경남과학고등학교 프로그래밍 멘토링 플로우차트

연세대학교 컴퓨터과학과 14학번 도회린

} //3.2.2.2 ! } ! void FireBullet() { //3.2.2.2 Transform obj = Instantiate(bullet, spPoint.position, spPoint.rotation) as Transform; //3.2.2.2 obj.rigidbody.AddForce (spPoint.forward * power); //3.2.2.2 } //3.2.2.2 !} !!!CsBullet.cs using UnityEngine; using System.Collections; !public class CsBullet : MonoBehaviour { ! //public AudioClip sndExp; public Transform explode; //3.2.4 ! void Update() { //3.2.3.2 if (transform.position.y < 0) { //... Destroy (gameObject); } } //3.2.3.2 ! void OnTriggerEnter (Collider coll) { //AudioSource.PlayClipAtPoint (sndExp, transform.position); Instantiate (explode, transform.position, //3.2.4 Quaternion.identity); if (coll.tag == "WALL") { //3.2.3.1 Destroy (coll.gameObject); } //3.2.3.1 Destroy (gameObject); } } !