본문 바로가기

종스크롤 슈팅게임(1942)

6. 아이템과 필살기 구현하기

아이템 3종 프리펩 만들기

오브젝트 생성
필요한 컴포넌트 주기 & Type에 아이템 이름 써주기 & isTrigger 체크
태그까지 Item으로 설정
아이템 회전 애니메이션 주기

Item 스크립트

    //Components
    Rigidbody2D rigid;
    //Vars
    public string type;

    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        rigid.velocity = Vector2.down * 0.5f; //일자로 내려오게 하기
    }

    void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Border Bullet") { //Border Bullet에 닿으면 아이템 삭제
            Destroy(gameObject); 
        }
    }

하이라키의 아이템 오브젝트 3종을 프로젝트 프리펩 폴더에 드래그 앤 드랍해서 프리펩 생성

 

아이템 프리펩 3종 생성 완료

Player 스크립트 코드 추가

    public int maxPower; //파워 최대치
    public int boom; //폭탄 개수
    public int maxBoom; //폭탄 개수 최대치
    public bool isBoomTime; //폭탄 사용 여부 판단
    
    void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Border")
        {
			...
        }
        else if (collision.gameObject.tag == "Enemy" || collision.gameObject.tag == "EnemyBullet")
        {
			...
        }
        else if (collision.gameObject.tag == "Item") { //아이템을 먹었을때
            Item item = collision.gameObject.GetComponent<Item>(); //아이템 스크립트 가져오기
            switch (item.type) { //아이템의 타입으로 swtich문 작동
                case "Coin": //코인은 점수추가
                    score += 1000;
                    break;
                case "Power": //파워 + 1
                    if (power == maxPower)
                    {
                        score += 500; //파워가 최대치일 경우 점수만 추가
                    }
                    else {
                        power += 1;
                    }
                    break;
                case "Boom": //폭탄 + 1
                    if (boom == maxBoom) //폭탄이 최대치일 경우 점수만 추가
                    {
                        score += 500;
                    }
                    else { 
                        boom += 1;
                    }
                    gm.updateBoomIcon(boom); //GameManager의 BoomIcon 갱신
                    break;
            }
            Destroy(collision.gameObject); //먹은 아이템은 삭제
        }
    }

GameManager 스크립트에 코드 추가

    public Image[] boomImage; //UI boom 이미지 맵핑 변수  
    
    public void updateBoomIcon(int boom)
    {
        //Boom Icon 다 끄기
        for (int index = 0; index < 3; index++)
        {
            boomImage[index].color = new Color(1, 1, 1, 0.2f);
        }
        //남은 목숨 갯수만큼만 Boom Icon 다시 켜기
        for (int index = 0; index < boom; index++)
        {
            boomImage[index].color = new Color(1, 1, 1, 1);
        }
    }

인스펙터에서 maxPower, maxBoom, boom 입력하기

Boom 개수 UI 만들어서 연동하기

UI 만들기

인스펙터에서 GameManager 스크립트 부분 UI의 Boom Icon 이미지 3개 맵핑해주기

맵핑

 

중간 점검

 

적 제거 시 아이템이 나오게 하기

Enemy 스크립트 코드 추가

    public GameObject itemCoin; //Coin 프리펩 맵핑
    public GameObject itemBoom; //Boom 프리펩 맵핑
    public GameObject itemPower; //Power 프리펩 맵핑
    
    public void onHit(int dmg) {
        if (health <= 0) return; //적 이중피격 방지
        ...
        if (health <= 0) {
            Player playerScript = player.GetComponent<Player>();
            playerScript.score += enemyScore;
            //Random Ratio Item Drop
            int ran = Random.Range(0, 10); //아이템 생성 난수
            switch (ran) {
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                    //No Item
                    break; 
                case 5:
                case 6:
                    //Coin
                    Instantiate(itemCoin, transform.position, itemCoin.transform.rotation);
                    break;
                case 7:
                case 8:
                    //Power
                    Instantiate(itemPower, transform.position, itemPower.transform.rotation);
                    break;
                case 9:
                    //Boom
                    Instantiate(itemBoom, transform.position, itemBoom.transform.rotation);
                    break;
            }
            Destroy(gameObject);
        } 
    }

Enemy 3종 프리펩에 아이템 맵핑

프리펩에 프리펩 맵핑

Boom 구현

먼저 오브젝트를 생성합니다.

Boom 오브젝트 생성

Boom 이펙트가 적이나, 플레이어보다 밑에 있어야 하므로

Boom의 order in layer를 -1로, BackgroundGrid는 -2로 해줍니다.

Boom 오브젝트에 애니메이션 추가

 

마우스 우클릭 하면 Boom이 써지도록 코드 추가

Player 스크립트 추가

    public GameObject boomEffect; //boom 오브젝트 맵핑
    
    void Boom() {
        if (!Input.GetButtonDown("Fire2")) { //마우스 우클릭이 안눌렸다면 return으로 함수 끝
            return;   
        }
        if (boom == 0) { //boom이 0개라면 return으로 함수 끝
            return;
        }
        if (isBoomTime) { //이미 boom을 사용중이라면 return으로 함수 끝
            return;
        }
        isBoomTime = true; //boom 사용시 isBoomTime을 true로 하여 boom 중복 사용 방지
        boom -= 1; //boom 개수 -1
        //Active Boom Effect
        boomEffect.SetActive(true); //boom 오브젝트 활성화
        //Remove Boom Effect
        Invoke("offBoomEffect", 4f); //boom 오브젝트 비활성화 예약
        //Remove Enemy
        GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy"); //tag가 Enemy인 모든 오브젝트 찾아서 배열에 넣기
        for (int i = 0; i < enemies.Length; i++) {
            Enemy enemyScript = enemies[i].GetComponent<Enemy>();
            enemyScript.onHit(1000); //적 전투기에게 데미지 1000 주기
        }
        //Remove Enemy Bullet
        GameObject[] enemyBullet = GameObject.FindGameObjectsWithTag("EnemyBullet"); //tag가 EnemyBullet인 모든 오브젝트 찾아서 배열에 넣기
        for (int i = 0; i < enemyBullet.Length; i++)
        {
            Destroy(enemyBullet[i]); //배열 내 모든 오브젝트 삭제
        }

        gm.updateBoomIcon(boom); //boom 아이콘 갱신
    }

Player 스크립트에 Boom 오브젝트 맵핑

Boom 오브젝트 비활성화 시켜놓기

결과