기록 보관소

[Unity/유니티] 기초-2D 종스크롤 슈팅: 적 비행기 만들기[B29] 본문

유니티 프로젝트/2D 종스크롤 슈팅

[Unity/유니티] 기초-2D 종스크롤 슈팅: 적 비행기 만들기[B29]

JongHoon 2022. 2. 28. 23:59

개요

유니티 입문과 독학을 위해서 아래 링크의 골드메탈님의 영상들을 보며 진행 상황 사진 또는 캡처를 올리고 배웠던 점을 요약해서 적는다.

현재는 영상들을 보고 따라하고 배우는 것에 집중할 것이며, 영상을 모두 보고 따라한 후에는 개인 프로젝트를 설계하고 직접 만드는 것이 목표다.

https://youtube.com/playlist?list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2 

 

유니티 강좌 기초 채널 Basic

유니티 개발을 처음 시작하시는 입문자 분들을 위한 기초 채널. [ 프로젝트 ] B00 ~ B12 (BE1) : 유니티 필수 기초 B13 ~ B19 (BE2) : 2D 플랫포머 B20 ~ B26 (BE3) : 2D 탑다운 대화형 RPG B27 ~ B37 (BE4) : 2D 종스크롤

www.youtube.com


2D 종스크롤 슈팅: 적 비행기 만들기[B29]

1. 준비하기

적 기체 스프라이트 추가
세모 모양의 기체는 Collider 설정을 위해서 Sprite Editor를 통해 따로 충돌 범위를 설정해준다
Circle Collider 2D와 Rigidbody2D 추가. Gravity Scale은 0으로 만든다.
Polygon Collider 2D와 Rigidbody 2D 추가. 마찬가지로 Gravity Scale은 0으로 설정
Box Collider 2D와 Rigdbody2D 추가. Collider는 약간 줄여주고, Gravity Scale은 마찬가지로 0으로 설정
Tag Enemy를 추가하고 적 기체에 모두 설정해준다


2. 적 기체 프리펩

Enemy 스크립트를 생성하고 모든 적 기체에게 Enemy 스크립트를 추가해준다

//Bullet 스크립트 파일

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

public class Bullet : MonoBehaviour {
    public int dmg;

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

}
//Enemy 스크립트 파일

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

public class Enemy : MonoBehaviour {
    public float speed;
    public int health;

    public Sprite[] sprites;

    SpriteRenderer spriteRenderer;
    Rigidbody2D rigid;

    void Awake() {
        spriteRenderer = GetComponent<SpriteRenderer>();
        rigid = GetComponent<Rigidbody2D>();
        rigid.velocity = Vector2.down * speed;
    }

    void onHit(int dmg) {
        health -= dmg;
        spriteRenderer.sprite = sprites[1]; //평소 스프라이트 0, 피격시 스프라이트 1
        Invoke("ReturnSprite", 0.1f);

        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);  //플레이어 총알 삭제
        }

    }
}

PlayerBullet 태그와 Dmg 설정
Player Bullet B도 설정해준다
Is Trigger 체크와 Speed, Health, Sprite 설정
Enemy M 설정
Enemy S 설정
실행해보니 잘 이동한다
가장 빠른 Enemy M이 맵 경계에 닿자 사라졌다
총알을 발사하자 피격 스프라이트로 변경되었다
이후 총알을 계속 맞아던 중 파괴되었다
이제 프리펩으로 만들고 스프라이트를 삭제한다
프리펩 위치 초기화


3. 적 기체 생성

적 기체 생성을 위한 Game Manager 생성 및 스크립트 추가

//GameManager 스크립트 파일

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

public class GameManager : MonoBehaviour {
    public GameObject[] enemyObjs;
    public Transform[] spawnPoints;

    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() {
        int ranEnemy = Random.Range(0, 3);
        int ranPoint = Random.Range(0, 5);
        Instantiate(enemyObjs[ranEnemy], spawnPoints[ranPoint].position, spawnPoints[ranPoint].rotation);
    }
}

적 기체 생성 포인트로 사용할 Empty 생성. 총 5개의 포인트를 만들어준다.
각 포인트 위치를 잡아준다.
참고로 Icon을 변경하면 Empty여도 왼쪽 Scene처럼 위치가 표시된다
GameManager Inspector 창 설정
각 포인트에서 적 기체들이 생성되는 모습

  • Random.Range(float, float / int, int); 정해진 범위 내의 숫자를 랜덤으로 반환하는 함수. 매개변수 중 뒷 숫자는 범위에서 제외되며(ex. 매개변수가 0, 3이면 0, 1, 2만 반환된다), 매개변수 타입에따라 반환 타입이 결정된다. 참고로 비슷한 함수인 Random.RandomRange()도 있지만, 이 함수는 오래된 사용하지 않는 함수라고 한다.