07강) 미사일 발사1 |
지난 시간에는 비행기를 움직이는 것을 해보았습니다.
이번 시간에는 미사일을 생성하여 발사하여 볼것입니다.
일반적인 미사일 발사 |
이번 7강에서는 "일반적으로 쉽게 사용하는 미사일 발사"에 대해서 알아볼것입니다.
일반적으로 쉽게 사용하는 미사일 발사의 경우에는 "Instantiate 함수"를 사용하여 미사일 발사 키를 누르는 즉시 미사일 오브젝트를 실시간으로 생성하는 방식을 사용하게 됩니다.
Instantiate 함수 |
original을 position위치에 rotation각도로 생성을 합니다. |
이 Instantiate 함수를 사용하여 오늘의 7강을 이어가겠습니다.
미사일 준비하기 |
지난시간에 비행기를 움직이기 전에 비행기를 먼저 준비했듯이, 미사일을 사용하기 전에 미사일을 먼저 준비합시다.
따로 미사일을 준비하거나 저처럼 그냥 대충 만듭시다.(연습이니까요)
먼저 미사일을 만들어서
혹은 다른곳에서 미사일을 구하여서 저장하여
지난번에 만들었던 이미지폴더에 넣습니다.
(제가 만든 미사일 입니다.)
그리고 게임에디터로 돌아와서
스프라이트 하나를 생성하여
방금 넣은 미사일 이미지를 씌어줍니다.
그리고
알맞게 크기를 수정합니다.
그리고 빈 오브젝트를 하나 만듭니다.
이렇게 생성된 빈 오브젝트에
미사일 스프라이트를 넣어줍니다.
그리고 적당한 이름을 붙여줍니다.
주의점!! |
이때 미사일 스프라이트와 미사일 스프라이트를 감싼 빈 오브젝트의 Inspector에서 Transform의 X, Y, Z 좌표를 모두 0으로 맞추어야 합니다. |
이렇게 만들어진 미사일을
오브젝트화를 해줍니다.
오브젝트화를 했으니 씬에 나와있는 미사일을 없애줍니다.
미사일 발사 위치 정하기 |
지난시간에 만든 비행기에 추가할것이 있습니다.
먼저 플레이어의 기본 위치를 (0, 0, 0)으로 맞추어 줍니다.
그리고 새롭게 빈 오브젝트를 하나 만들어서 (0, 0, 0)으로 맞춘 후에
이전에 만든 비행기를 이 빈 오브젝트 이하로 넣습니다.
그리고
이전에 만든 비행기에 있던 "움직이는 스크립트"를 제거합니다.
이렇게 제거한 스크립트를 다시 새로 생성한 빈 오브젝트로 넣어줍니다.
그리고 이 빈 오브젝트의 이름을 원하는 이름으로 바꾼후에 오브젝트화를 시킵니다.
이 과정에서 기존의 플레이어 이름을 조금 변경하였습니다.
이제 플레이어 오브젝트가 변경되었으니
"Apply" 버튼을 눌러서 데이터를 갱신합시다.
이렇게 만들어진 미사일 오브젝트에 이제 생명을 불어넣을 시간입니다.
미사일 발사 스크립트 작성 |
지난 시간에 만든 스크립트폴더에 원하는 이름으로 스크립트를 만듭니다.
(예 : Player_Fire)
미사일 발사는 어떻게 할까요? |
미사일을 발사할 때는 기본적으로 스크립트가 2개가 필요합니다. (미사일을 발사할 주체에 붙일 스크립트, 미사일이 날라가게끔 하는 스크립트) 그리고 특정키를 눌렀을 때 생성될 미사일 본체가 필요합니다. 그리고 특정키를 눌렀을 때 발동할 이벤트가 필요합니다. |
이제 스크립트를 작성하여 봅시다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player_Fire : MonoBehaviour { public GameObject PlayerMissile; // 복제할 미사일 오브젝트 public Transform MissileLocation; // 미사일이 발사될 위치 public float FireDelay; // 미사일 발사 속도(미사일이 날라가는 속도x) private bool FireState; // 미사일 발사 속도를 제어할 변수 void Start () { // 처음에 미사일을 발사할 수 있도록 제어변수를 true로 설정 FireState = true; } void Update () { // 매 프레임마다 미사일발사 함수를 체크한다. playerFire(); } // 미사일을 발사하는 함수 private void playerFire() { // 제어변수가 true일때만 발동 if (FireState) { // 키보드의 "A"를 누르면 if (Input.GetKey(KeyCode.A)) { // 코루틴 "FireCycleControl"이 실행되며 StartCoroutine(FireCycleControl()); // "PlayerMissile"을 "MissileLocation"의 위치에 "MissileLocation"의 방향으로 복제한다. Instantiate(PlayerMissile, MissileLocation.position, MissileLocation.rotation); } } } // 코루틴 함수 IEnumerator FireCycleControl() { // 처음에 FireState를 false로 만들고 FireState = false; // FireDelay초 후에 yield return new WaitForSeconds(FireDelay); // FireState를 true로 만든다. FireState = true; } }
코루틴 이란? |
아주 설명이 잘 되어있는 글이기에 이것으로 대체하겠습니다. |
이렇게 생성된 스크립트를 저장하여
아까 다시 재구성한 플레이어에게 넣어줍니다.
(무언가 구성이 바뀌면 "Apply"는 필수입니다.)
그리고 위의 GIF처럼 미사일과 발사 위치, 그리고 미사일 딜레이 시간을 정합니다.
미사일 딜레이 시간은 "초(Seconds)"단위로 연사속도를 의미합니다.
이제 실행해봅시다.
움직이면서 "A"키를 누르면 해당위치에 미사일이 생성되게 됩니다.
이제 이 미사일이 움직이도록 해봅시다.
그 전에!! 꼭 명심해야하는 것!! 방향의 단일화!! |
모든 오브젝트는 생성시 "방향"을 가지게 됩니다. 이렇게 방향을 표시하게 되는데 이 방향은 항상 단일화되는 것이 좋습니다. "해당 오브젝트를 기준"으로 위로 갈때는 "Y값이 증가"하도록, 아래로 갈때는 반대로 "Y값이 감소"하도록, 오른쪽으로 갈때는 "X값이 증가"하도록, 왼쪽으로 갈때는 "X값이 감소"하도록, 이렇게 기준을 정해놓는 것이 좋습니다. (안그러면 나중에 움직이는 것이 뒤죽박죽 됩니다.) |
미사일용 스크립트를 하나 만들어봅시다.
(예 : Player_Missile_Move)
이 미사일 스크립트를 작성하여봅시다.
using UnityEngine; public class Player_Missile_Move : MonoBehaviour { public float MoveSpeed; // 미사일이 날라가는 속도 public float DestroyYPos; // 미사일이 사라지는 지점 void Update () { // 매 프레임마다 미사일이 MoveSpeed 만큼 up방향(Y축 +방향)으로 날라갑니다. transform.Translate(Vector2.up * MoveSpeed * Time.deltaTime); // 만약에 미사일의 위치가 DestroyYPos를 넘어서면 if(transform.position.y >= DestroyYPos) { // 미사일을 제거 Destroy(gameObject); } } }
이렇게 만든 스크립트를 저장하여
미사일 오브젝트에 연결하여 "속도"와 "제거 지점"을 설정합니다.
(이 과정에서는 오브젝트화된 미사일에 직접 접근하여 변경하는 것이기에 Apply가 뜨지 않습니다.)
그리고 실행시켜봅시다.
잘 됩니다.
하지만 이 방법에는 많은 리스크가 있으니.. |
사실 이 방법은 쉽고 유용하지만 "GC"를 자주 불러오게 되는 아주 무시무시한 상황을 초래할 수 있습니다.
(GC에 관해서는 이 다음 시간에 이야기 하겠습니다.)
그래서 모바일쪽에서는 이 방법을 사용하지 않고 "MP 방법(메모리 풀링)"을 사용합니다.
그래서 우리도 이 방법이 아닌 "MP 방법"을 사용할 것입니다.
이 방법은 바로 다음강의에서 사용할 것입니다.
그러므로 |
다음 강의에서도 미사일 발사에 대해서 배울텐데 미사일을 생성할 때 즉시 Instantiate를 하는 것이 아닌, 미리 미사일을 원하는 만큼 생성해서 이벤트(키 눌림)가 발생했을 때 생성해 놓은 미사일을 가져다가 사용하는 방법을 사용할겁니다.
다음시간에 뵙시다.
'Study > Unity 5(유니티5)' 카테고리의 다른 글
유니티 5(Unity 5) 왕초보를 위한 간단한 비행기 슈팅게임 만들기(C#) - 09 [충돌 처리] (0) | 2017.06.03 |
---|---|
유니티 5(Unity 5) 왕초보를 위한 간단한 비행기 슈팅게임 만들기(C#) - 08 [미사일 발사2] (9) | 2017.04.01 |
유니티 5(Unity 5) 왕초보를 위한 간단한 비행기 슈팅게임 만들기(C#) - 06 [비행기 생성 및 움직이기] (1) | 2017.02.24 |
유니티 5(Unity 5) 왕초보를 위한 간단한 비행기 슈팅게임 만들기(C#) - 05 [게임의 요소 결정 및 구상] (0) | 2017.02.10 |
유니티 5(Unity 5) 왕초보를 위한 간단한 비행기 슈팅게임 만들기(C#) - 04 [C# 프로그래밍의 기초3] (1) | 2017.01.30 |