Unity/기본 공부

투사체 발사하기(Bullet)

이원혁 2022. 12. 1. 10:35
반응형

슈팅게임이나 fps등의 게임을 처음 만들때 가장 먼저 드는 생각은 투사체를 어떻게 발사할까? 였습니다.

 

앞으로 보내고 충돌판정은 배웠는데 생성은 어떻게 하는가? 이동할때마다 바뀌는 발사위치를 어떻게 정해줄지에 대해 고민을 했고 발사 위치를 자식 객체로 빈 오브젝트를 생성하여 정해줬습니다.

포신 앞으로 총알이 생성될 장소를 빈 오브젝트를 만들어서 정해줬습니다

이렇게 정해주면 부모객체(플레이어 객체)가 회전하더라도 포신과 빈오브젝트가 같이 회전하기때문에 항상 포신앞에서 총알이 생성될 것입니다.

하이어라키창에서 총알로 사용할 구체를 만들어준뒤 인스펙터창에서 사이즈를 조절하고 하이어라키창에 만든 Bullet을 하이어라키창에서 아래에 스크립트들이 있는 칸으로 드래그앤드롭을 하시면 프리펩으로 저장할 수 있습니다.

이후 Bullet이 앞으로 나가게 하기 위하여 Bullet에 넣어줄 스크립트를 작성합니다.

    void Update()
    {
        transform.Translate(0.1f,0,0);
    }

그리고 객체를 발사할 녀석에게 넣어줄 Fire 스크립트를 작성합니다.

public class Fire : MonoBehaviour
{
    public GameObject Firepos = null;
    public GameObject Bullet = null;

    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            Instantiate(Bullet, Firepos.transform);
        }
    }

}

그리고 만들어둔 FirePos와 프리펩으로 만든 Bullet을 장착해준뒤 실행하면 

제대로 발사되는 것을 알 수 있습니다.

 

그리고 만들어진 객체는 생성하는 만큼 무한히 날아가게 될 것이기 때문에 파괴 조건을 넣어줍니다.

 

특정 객체에 닿았을때와 특정 시간이 지났을때 파괴하는 방식이 있는데 특정 객체에 닿았을때는 전에 올린 충돌 판정에서

Destroy 함수를 실행시키면 됩니다.

 

특정 시간 코드는 

    void Update()
    {
        transform.Translate(0.1f,0,0);
        Destroy(this.gameObject,1f);
    }

위에 있는 Bullet스크립트에서 Destroy 한줄을 추가하면 발사 후 1초뒤 객체가 파괴됩니다.


위 방식의 문제점들은 객체를 생성과 파괴를 반복하기 때문에 효율적이지 않습니다. 그렇기 때문에 만든 객체를 재사용 가능하게 해주는 오브젝트 풀링(Object Pooling)을 사용할텐데 오브젝트 풀링 관련 코드는 제가 자세히 공부해서 올리도록 하겠습니다.

 

지금까지 올린 이동, 총알 생성, 충돌판정 등으로 간단한 슈팅 게임을 만들 수 있습니다.

반응형