[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(12) 적 미사일 추가, 미사일 충돌

2023. 9. 18. 18:00Unity

728x90
반응형

적절한 적 발사체 스프라이트를 찾아서 적용해주고 Tag, Layer를 추가하여 설정한다. RigidBody 2D, Box Collider 2D를 추가하고 EnemyShoot 스크립트를 새로 만든다.

 

 

Player와 EnemyShoot의 교차점을 체크하여 Physics를 적용한다.

 

 

public class EnemyShoot : MonoBehaviour
{
    public float speed = 4;
    void Start()
    {
        
    }
    void Update()
    {
        transform.Translate(Vector3.left * speed * Time.deltaTime);
    }
    void OnBecameInvisible()
    {
        Destroy(gameObject);
    }
}

코드는 위와 같이 작성하여 왼쪽으로 진행되게 만든다.

 

 


 

 

이제 적이 미사일을 발사해야 하므로 EnemyScript를 수정하여 위에서 만든 적 미사일 스프라이트를 적용한다. 적 타입마다 쏘는 시간을 다르게 하기 위해 maxShootTime 변수를, 쏘는 속도도 다르게 하기 위해 shootSpeed 변수를 생성하였다.

public class EnemyScript : MonoBehaviour
{
    public int type = 0;
    public int hp = 3;
    public float enemySpeed = 4;
    public float gem;
    public GameObject enemyShoot;
    public float maxShootTime;
    public float shootSpeed;
    ...

 

 

    void Start()
    {
        switch (type)
        {
            case 0:
                hp = 10; enemySpeed = 1.5f; gem = 3; maxShootTime = Random.Range(1, 3); shootSpeed = 3;
                break;
            case 1:
                hp = 20; enemySpeed = 1.4f; gem = 4; maxShootTime = Random.Range(1, 3); shootSpeed = 4;
                break;
        }
    }

    void Update()
    {
        time += Time.deltaTime;
        if(time > maxShootTime)
        {
            time = 0;
            GameObject shootObj = Instantiate(enemyShoot, transform.position, Quaternion.identity);
            EnemyShoot shootScript = shootObj.GetComponent<EnemyShoot>();
            shootScript.speed = shootSpeed;
        }
        transform.position += Vector3.left * enemySpeed * Time.deltaTime;
    }

이후 코드는 적 타입에 발사체 로딩 시간, 발사체 속도 변수를 넣어주고, time 변수를 하나 만들어서 일정 시간 이후 maxShootTime 값을 넘었을 때 시간을 초기화 하고 Instantiate로 enemyShoot을 가져오고 EnemyShoot 스크립트에서 스피드를 가져와 shootSpeed를 대입해준다.

 

 


 

 

이제 PlayerScript를 수정하여 다른 오브젝트의 콜라이더와 부딪혔을 때 파괴되는 기능을 넣을 것이다.

 

 

public class PlayerScript : MonoBehaviour
{
    public GameObject explosion;
    ...

explosion에 이전에 만들었던 프리팹을 넣는다.

 

 

이제 OnTriggerEnter2D에 else if를 추가하여 "Enemy", "Asteroid", "EnemyShoot" 태그가 붙은 오브젝트의 콜라이더와 충돌하였을 때 둘 다 Destroy 되고 Instantiate으로 explosion 프리팹을 해당 위치에, 그리고 적과 소행성의 위치에 파괴되는 이펙트를 넣어준다.

    void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.gameObject.tag == "Item")
        {
            GemScript gemScript = collision.gameObject.GetComponent<GemScript>();
            GameManager.instance.gem += gemScript.gem;
            print("Gem" + GameManager.instance.gem);
            Destroy(collision.gameObject);
        }
        else if(collision.gameObject.tag == "Enemy" || collision.gameObject.tag == "Asteroid")
        {
            Destroy(gameObject);
            Destroy(collision.gameObject);
            Instantiate(explosion, transform.position, Quaternion.identity);
            Instantiate(explosion, collision.gameObject.transform.position, Quaternion.identity);
        }
        else if (collision.gameObject.tag == "EnemyShoot")
        {
            Destroy(gameObject);
            Destroy(collision.gameObject);
            Instantiate(explosion, transform.position, Quaternion.identity);
        }
    }

 

 

728x90
반응형