본문 바로가기
IT Tip/(Unity) 슈팅 게임 만들기

[유니티 게임 만들기] 적을 움직이기

by 연꽃연못 2020. 12. 17.
반응형

Step 4. 적을 움직이기

이제 총알도 장전됐겠다 나쁜적이 슬슬 모습을 들이밀때가 됐어요. ^^ 적은 어떻게 구성할꺼냐 하면은 랜덤으로 생성되어서 위에서 아래로 흐르는 모습으로 출현을 할거에요. 걔네를 쏴 잡는 거에요. 

 

전체적인 흐름은 적캐릭터를 하나 불러들여서 랜덤으로 생성한 다음에 위에서 아래로 내려오는 형식입니다. 적캐릭터는 따로 만들거나 불러들일거 없이 이전에 받았던 무료에셋으로 활용할 거에요. 

 

Assets > Galaxia Sprite Pack #1 > Enemy에 있어요. 

 

먼저 지금까지 만든 프로젝트를 기동시켜 주세요.  

 

[유니티 게임 만들기] 적을 움직이기

 

전 비행선모양은 아군하고 좀 헷갈리니 그냥 땅땅한 빨간 동그라미 보석으로 된 모양을 선택할거에요. 아군은 파란색 비행선이고 레이저빔은 초록색이니 ^^ 원래 빨간색이 우주모험에서 좀 나쁜쪽으로 나오는거 아니였나라는 안일한 생각도 하면서 ... 그렇게 큰 의미는 두지 말고 구분만 되는선에서 만족해요. ㅋ

 

① 먼저 원하는 선택해 주세요. 

② 화면 사이즈에 맞게 Pixels Per Unit값을 16으로 주세요. 

씬뷰드래그해주세요. 

 

[유니티 게임 만들기] 적을 움직이기

 

적이 출현했으니 적을 위에서 아래로 흐르게 이동을 시켜 보겠습니다. 

 

스크립트를 하나 추가 해주세요. 전 EnemyController.cs라고 이름을 줬어요. 파일은 스크립트 폴더에 추가시켜 주세요. 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyController : MonoBehaviour
{

    float fallSpeed;
	float rotSpeed;

    void Start () 
    {
		this.fallSpeed = 0.05f + 0.1f * Random.value;
		this.rotSpeed = 5f + 3f * Random.value;
	}
	
    void Update () 
    {
		transform.Translate(0, -fallSpeed, 0, Space.World);
		transform.Rotate(0, 0, rotSpeed );
		if (transform.position.y < -7.5f) {
			Destroy (gameObject);
		}
	}
}

 

간단하게 스크립트를 설명하자면...

 

fallSpeed에서 적의 낙하속도를 정의하고 있어요. Ramdom.value는 0.1 ~ 1까지의 값을 무작위로 추출해 줄거에요. 무작위로 추출된 값을 0.1이라는 기본속도에 곱한것을 더하라는 처리를 담당하고 있어요. 

 

두번째 rotSpeed에서는 적의 움직이는 속도를 정의해 주고 있어요. 낙하속도랑 내용은 똑같아요. 이것 역시 Random.value로 처리를 하고 있어요. 

 

    void Start () 
    {
		this.fallSpeed = 0.05f + 0.1f * Random.value;
		this.rotSpeed = 5f + 3f * Random.value;
	}

 

Translate 매소드로 이동을 제어하고 있어요. x, y, z축으로 0만큼 x축을 이동하는 거니 안 움직이는 거에요. ^^ y축은 -방향인, 위에서 아래로 이동하는것이고, 0인 z축역시 움직임이 없어요. Space.World는 화면에서 동작시키기 위한값이에요. 

 

적이 그냥 뚝 떨어져도 되지만 회전시키면서 떨어지게 만들거에요. Rotate매소드를 이용해서 역시 (x축의 회전속도, y축의 회전속도, z축의 회전속도)를 지정해 줬어요. 

 

그리고 if문으로 씬에서 없어지면 객체를 사용하지 않을거에요. 평생 게임하는 내내 떨어질수는 없으니 ^^ 화면밖으로 나간 애는 깨끗이 우리가 처리를 하자구요. ^^ 사라질 y축을 지정해 줬어요. 

 

    void Update () 
    {
		transform.Translate(0, -fallSpeed, 0, Space.World);
		transform.Rotate(0, 0, rotSpeed );
		if (transform.position.y < -7.5f) {
			Destroy (gameObject);
		}
	}

 

남은건 스크립트를 적한테 적용시키고 프리팹화 시킬거에요. 

 

먼저 아까 드래그 해놓고 방치한 적의 이름을 Enemy라고 변경해 주세요.

변경 후 스크립트를 드래그해서 추가시켜 주세요. 

 

[유니티 게임 만들기] 적을 움직이기

 

 

중간점검을 한번 해보고 프리팹화로 넘어갈께요. 실행시켜서 겜뷰에서 확인해보세요. 

 

[유니티 게임 만들기] 적을 움직이기

 

플레이어가 있는 부분에서 사라지는게 확인되실거에요. 프리팹화를 시켜주세요. 만들어 놓은 Enemy를 Prefab폴더에 넣어주고 이제 더 필요 없으니 삭제를 해주세요. 

 

[유니티 게임 만들기] 적을 움직이기

 

이제 제대로된 적군 하나가 만들어졌으니 나머지 적들이 나타나는걸 만들 차례에요. 

 

스크립트 작성부터 들어갈께요. 이번에는 Scripts 폴더 안에 EnemyMaker.cs로 스크립트를 만들어 줄거에요. 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyMaker : MonoBehaviour
{
    public GameObject enemys;

	void Start() 
	{
		InvokeRepeating("MakeEnemy", 1, 1);
	}
	void MakeEnemy() 
	{
		Instantiate(enemys, new Vector3 (-5f + 10 * Random.value, 8, 0), Quaternion.identity);
	}
}

 

간단하게 스크립트 설명을 하자면....

 

InvokeRepeating 함수를 사용하여 MakeEnemy를 1초에 1번 호출한다는 내용입니다. 

 

	void Start() 
	{
		InvokeRepeating("MakeEnemy", 1, 1);
	}

 

MakeEnemy내용은 Instantiate함수를 사용하여 프리팹화한 enemys를 일정시간마다 임의의 위치에 복제를 하는 것입니다. 개인적으로 우주물에서 복제되는 적은 정말 무서워서 진저리가 나는데 ㅡㅡ 어쩔수 없이.. 무찔러야 되니까 만들어 내야 되는거겠죠. ㅜ.ㅜ 

 

	void MakeEnemy() 
	{
		Instantiate(enemys, new Vector3 (-5f + 10 * Random.value, 8, 0), Quaternion.identity);
	}

 

스크립트를 저장하고 나와주세요.  이제 이 스크립트를 화면에 뿌려줄거에요. 

 

Hierarchy에서 마우스 오른쪽 버튼을 클릭해서 Create Empty를 추가해 주세요. 

이름을 EnemyAttack이라고 해줬어요. 

 

작성한 스크립트를 추가해주세요. 

 

[유니티 게임 만들기] 적을 움직이기

 

스크립트를 추가해주면 Enemys에 None이라고 되어 있는데 아까 곱게 만들어 놓은 Enemy 프리팹드래그 해서 적용을 해주시면 되요. 

 

[유니티 게임 만들기] 적을 움직이기

 

Prefab를 적용하는것까지 끝났으면 이제 실행시켜서 게임뷰에서 확인해 주세요. 

 

[유니티 게임 만들기] 적을 움직이기

점점 게임이 모양을 갖춰가는게 느껴지실거에요. ^^ 그럼 다음 강좌에는 저 많은 적들을 무찌르는 방법을 해보겠습니다. 

반응형

댓글