Unity 개발일지/[Unity2D]졸업프로젝트

[Unity2D] 15. 폭탄 아이템 추가

knhoo 2024. 2. 8. 01:43
728x90

204.01.08 폭탄 추가

 

이번에는 사용하면 날라가고

주위의 타일들을 파괴하는 '폭탄'아이템을 구현하였다.

 

기존의 땅을 캐는 방식을 응용한 방법이다.

 

우선 폭탄 프리팹을 새로 만들어준 뒤

bomb스크립트도 새로 만들었다.

 


 Bomb

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

public class Bomb : MonoBehaviour
{
    public GameObject explosionAreaGO;
    public LayerMask whatisPlatform;

    public CircleCollider2D circleCollider2D;
    
    void Start()
    {
    	bombJump();
        explosionAreaGO.SetActive(false);
        StartCoroutine(Boooom());
    }
    
    IEnumerator Boooom()
    {
        yield return new WaitForSeconds(3f);
        explosionAreaGO.SetActive(true);

        DestroyArea();

        Destroy(this.gameObject, 0.05f);
    }
    
    void bombJump()
    {
        Rigidbody2D rigidBody = GetComponent<Rigidbody2D>();
        Vector3 MousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector2 distance = MousePosition - transform.position;
        Vector2 velocity;
        //마우스 위치가 플레이어보다 왼쪽에 있으면 왼쪽으로,
        //오른쪽에 있으면 오른쪽으로 폭탄이 던져진다.
        if (distance.x > 0)
            velocity = Vector2.right * 3f;
        else
            velocity = Vector2.left * 3f;
        Vector2 jumpVelocity = Vector2.up * 4f;
        

        rigidBody.AddForce(velocity, ForceMode2D.Impulse);
        rigidBody.AddForce(jumpVelocity,ForceMode2D.Impulse);
    }

    void DestroyArea()
    {
        int radiusInt = Mathf.RoundToInt(circleCollider2D.radius);
        //for문을 사용해서 circle콜라이더의 범위만큼 타일을 삭제한다. 
        for(int i= -radiusInt; i <= radiusInt; i++)
        {
            for(int j = -radiusInt; j <= radiusInt; j++)
            {
                Vector3 checkCellPos = new Vector3(transform.position.x + i, transform.position.y + j, 0);
                float distance = Vector2.Distance(transform.position, checkCellPos) - 0.001f;

                if(distance <= radiusInt)
                {
                    Collider2D overCollider2d = Physics2D.OverlapCircle(checkCellPos, 0.01f, whatisPlatform);
                if(overCollider2d != null)
                    {
                        overCollider2d.transform.GetComponent<bricks>().BombBricks(checkCellPos);
                    }
                }
            }
        }
    }
}

bricks

 public void BombBricks(Vector3 pos)
    {
        cellPosition = tilemap.WorldToCell(pos);
        TileBase t = tilemap.GetTile(cellPosition);

            player.GetComponent<Player>().addMineral(t);
            tilemap.SetTile(cellPosition, null);
    }

해당 위치의 타일을 없애주는 코드

 


MouseInput

 public GameObject bomb;//폭탄 프리팹을 넣어준다.

//...

//마우스 우클릭으로 폭탄을 생성
if (Input.GetMouseButtonDown(1))
        {
            Instantiate(bomb, transform.position, transform.rotation);
        }

마우스 클릭을 통해 폭탄 프리팹을 생성한다.


이후에 인벤토리 코드와 연동하여

폭탄 아이템 획득 및 사용 시

인벤토리에서의 소지 개수가 증가/감소하도록 해주었다.

 


결과 화면

에셋 : 다른 팀원이 제작

 


참고 영상 : https://youtu.be/xiXAXIbOtnc?feature=shared

728x90