[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(10) 적 생성, 충돌, 제거

2023. 8. 31. 18:02Unity

728x90
반응형

스프라이트들로 Enemy 애니메이션을 생성하고, Rigidbody 2D, Circle Collider 2D를 추가한다. Tag와 Layer도 Enemy로 설정한다.

 

 


 

 

public class EnemyScript : MonoBehaviour
{
    public int type = 0;
    public int hp = 3;
    public float enemySpeed = 4;
    void Start()
    {
        switch (type)
        {
            case 0:
                hp = 10; enemySpeed = 1.5f;
                break;
            case 1:
                hp = 20; enemySpeed = 1.4f;
                break;
        }
    }

    void Update()
    {
        transform.position += Vector3.left * enemySpeed * Time.deltaTime;
    }
}

새 스크립트를 만들어서 큰 적과 작은 적을 구분 지어 switch 함수를 통해 다른 체력과 스피드를 적용하였다.

 

 

Hierarchy 창에서 각각 다른 Type을 0, 1로 설정하면 된다.

 

 

각 타입에 맞게 잘 설정되었다.

 

 


 

 

이제, 적도 소행성처럼 랜덤 위치에서 랜덤 타입으로 생성되게 할 것이다.

 

 

public class GameManager : MonoBehaviour
{
    public List<GameObject> enemies;
    public GameObject asteroid;
    public float time = 0;
    public float spawnTime = 3;
    float spawnSpeed;
    void Update()
    {
        spawnSpeed = Random.Range(1.0f, 5.0f);
        time += Time.deltaTime * spawnSpeed;

        if(time > spawnTime)
        {
            time = 0;
            int check = Random.Range(0, 2);
            if(check == 0)
            {
                Instantiate(asteroid, new Vector3(Random.Range(9.0f, 12.0f), Random.Range(-4.0f, 4.0f), 0), Quaternion.identity);
            }
            else
            {
                int type = Random.Range(0, 2);
                Instantiate(enemies[type], new Vector3(Random.Range(9.0f, 12.0f), Random.Range(-4.0f, 4.0f), 0), Quaternion.identity);
            }
        }
    }
}

GameManager 스크립트를 수정한다. public List<GameObject> enemies;로 리스트를 추가하였고, check라는 int 변수에 0, 1, 2의 랜덤 중에서 0에 해당하면 소행성을, 1, 2에 해당하면 적을 생성한다. 적 또한 랜덤으로 소환한다. int 형태의 랜덤값은 최솟값 이상, 최댓값 미만이기 때문에 0과 1타입 중 랜덤으로 나온다.

 

 

 

 


 

 

플레이어의 미사일이 적에게 닿아 데미지를 입히고 적 오브젝트를 지우는 코드를 추가해야한다.

 

 

ShootScript에서 collision.tag에 "Enemy"를 추가하여 소행성과 같은 코드를 추가한다.

public class ShootScript : MonoBehaviour
{
    public GameObject explosion;
    public GameObject gem;
    public GameObject hitEffect;
    public float speed = 10;

    void Update()
    {
        transform.position += Vector3.right * Time.deltaTime * speed;
    }
    void OnBecameInvisible()
    {
        Destroy(gameObject);
    }

    void OnTriggerEnter2D(Collider2D collision)
    {
        print(collision.tag);
        if(collision.tag == "Asteroid")
        {
            AsteroidScript asteroidScript = collision.gameObject.GetComponent<AsteroidScript>();
            asteroidScript.hp -= 3;
            Instantiate(hitEffect, transform.position, Quaternion.identity);
            if(asteroidScript.hp <= 0 )
            {
                Instantiate(explosion, collision.transform.position, Quaternion.identity);
                Vector3 randomPosGem = new Vector3(Random.Range(-0.1f, 0.1f), Random.Range(-0.1f, 0.1f), 0);
                Instantiate(gem, transform.position + randomPosGem, Quaternion.identity);
                Destroy(collision.gameObject);
            }
            Destroy(gameObject);
        }

        if (collision.tag == "Enemy")
        {
            EnemyScript enemyScript = collision.gameObject.GetComponent<EnemyScript>();
            enemyScript.hp -= 3;
            Instantiate(hitEffect, transform.position, Quaternion.identity);
            if (enemyScript.hp <= 0)
            {
                Instantiate(explosion, collision.transform.position, Quaternion.identity);
                Vector3 randomPosGem = new Vector3(Random.Range(-0.1f, 0.1f), Random.Range(-0.1f, 0.1f), 0);
                Instantiate(gem, transform.position + randomPosGem, Quaternion.identity);
                Destroy(collision.gameObject);
            }
            Destroy(gameObject);
        }
    }
}

 

 

Enemy 스크립트에 void OnBecameInvisible() 함수를 추가한다.

public class EnemyScript : MonoBehaviour
{
    public int type = 0;
    public int hp = 3;
    public float enemySpeed = 4;
    void Start()
    {
        switch (type)
        {
            case 0:
                hp = 10; enemySpeed = 1.5f;
                break;
            case 1:
                hp = 20; enemySpeed = 1.4f;
                break;
        }
    }


    void Update()
    {
        transform.position += Vector3.left * enemySpeed * Time.deltaTime;
    }

    void OnBecameInvisible()
    {
        Destroy(gameObject);
    }
}

 

 

잘 작동한다.

728x90
반응형