본문 바로가기

종스크롤 슈팅게임(1942)

3. 적 전투기 만들기

전글과 동일하게 적 전투기 오브젝트를 프리펩으로 저장합니다.

오브젝트 만들기
필요한 컴포넌트 주기 & isTrigger 체크 & Gravity Scale 0 주기
드래그 앤 드랍으로 프리펩 생성 

Enemy 스크립트를 하나 생성하고 적 전투기들 프리펩에 넣어줍니다.

    //Components
    Rigidbody2D rigid;
    SpriteRenderer spriteRenderer;
    //Vars
    public float speed;
    public int health;
    //Sprites
    public Sprite[] sprites;

    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        spriteRenderer = GetComponent<SpriteRenderer>();
        rigid.velocity = Vector2.down * speed; //적 전투기가 아래로 향하게
    }

    void onHit(int dmg) { //피격 함수
        //Health Down
        health -= dmg;
        //Sprite Change
        spriteRenderer.sprite = sprites[1];
        //Return to Normal State
        Invoke("returnSprite", 0.3f);
        //Enemy Die
        if (health <= 0) Destroy(gameObject);
    }

    void returnSprite() { //노멀상태로 돌아가는 함수
        spriteRenderer.sprite = sprites[0];
    }

    void OnTriggerEnter2D(Collider2D collision) //콜라이더 충돌
    {
        if (collision.gameObject.tag == "BorderBullet") { //적 전투기가 맵 밖으로 나갔을때
            Destroy(gameObject);
        } 
        else if (collision.gameObject.tag == "PlayerBullet") { //적 전투기가 플레이어의 총알을 맞았을때
            Bullet bullet = collision.gameObject.GetComponent<Bullet>(); //플레이어 스크립트 불러오기
            onHit(bullet.dmg);
            Destroy(collision.gameObject); //플레이어 총알 삭제
        }
    }

프리펩에 스크립트 넣어주기

각각의 적 전투기 프리펩에 Speed와 Health를 입력해주고, 피격 시 스프라이트 교체를 위해, 스프라이트 이미지 배열을 맵핑해줬습니다. 

플레이어의 총알 데미지 만큼 체력이 깎이는 로직이기 때문에, Bullet 스크립트 상단에 dmg 변수를 추가해 총알의 데미지를 설정해 줍니다.

    public int dmg; // 총알 데미지 변수 추가

    void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "BorderBullet") {
            Destroy(gameObject);
        }      
    }

총알 프리펩에 각각 데미지 입력

중간 점검

 

이제 적 전투기 스폰을 구현해 보겠습니다.

 

게임 매니저 오브젝트를 하나 만들고 게임매니저 스크립트를 넣어줍니다.

여기에  두 배열이 있는데, EnemyObjs는 적 전투기 3개의 프리펩을 맵핑해줍니다.

SpawnPoint는 적 전투기가 생성될 위치인데, 아래와 같이 빈 오브젝트 안 5개의 빈 오브젝트를 위치만 지정해주고 맵핑해줍니다. MaxSpawnDelay는 아무 숫자나 입력해줍니다.

이제 게임 매니저 로직을 작성합니다.

    public GameObject[] enemyObjs;
    public Transform[] spawnPoint;

    public float maxSpawnDelay;
    public float curSpawnDelay;

    void Update()
    {
        curSpawnDelay += Time.deltaTime;
        if (curSpawnDelay > maxSpawnDelay) {
            spawnEnemy();
            maxSpawnDelay = Random.Range(0.5f, 3f); //다음 스폰 시간
            curSpawnDelay = 0; //스폰 대기 시간 초기화
        }
    }
    
    void spawnEnemy() {
        //Enemy Spawn
        int ranEnemy = Random.Range(0, 3); //적 전투기 선택 난수
        int ranPoint = Random.Range(0, 5); //적 전투기 생성 위치 선택 난수
        GameObject enemy = Instantiate(enemyObjs[ranEnemy], spawnPoint[ranPoint].position, spawnPoint[ranPoint].rotation);
    }

난수를 배열 내 인덱스 번호로 사용해, 적 전투기와 생성 위치가 랜덤으로 지정되게 작성했습니다.

적 전투기 스폰 시간도 랜덤으로 해서 스폰 주기가 불규칙하게 작성했습니다. 

 

결과