본문 바로가기
C#

[C#][Unity] 클릭으로 2D 오브젝트 제거하기

by teamnova 2022. 10. 29.

안녕하세요.

오늘은 마우스 클릭으로 오브젝트를 제거하는 예제를 진행하겠습니다.

 

먼저 제거할 오브젝트를 배치합니다. (저의 경우는 이미지에서 보이는 나무 - Medium Tree 입니다.)

그리고 스크립트를 새로 생성합니다.

 

ToolHit 라는 스크립트와 TreeCuttable 이라는 스크립트를 생성하겠습니다.

 

먼저 ToolHit 입니다.

public class ToolHit : MonoBehaviour
{
    public virtual void Hit(){
        
    }
}

ToolHit 는 인터페이스 역할을 할 스크립트입니다.

이 파일을 다른 스크립트에서 Hit를 재정의 해서 사용하게 됩니다.

 

다음은 TreeCuttable 스크립트 입니다.

public class TreeCuttable : ToolHit
{   
    public override void Hit()
    { 
        Destroy(gameObject);
    }
}

ToolHit 스크립트를 상속받아 Hit 발생시 오브젝트를 삭제하게 작성합니다.

그리고 제거할 오브젝트에 TreeCuttable 스크립트를 컴포넌트로 추가합니다.

 

이제 캐릭터에 마우스 클릭 이벤트를 정의하겠습니다.

먼저, 캐릭터에 ToolsCharacterController라는 새스크립트를 컴포넌트로 생성합니다. 

 

 

offsetDistance 는 캐릭터로부터 설정한 거리 간격만큼 떨어져 있는 오브젝트를 인식하는 거리값입니다.

sizeOfInteractableArea 는 offset값을 중심점으로 오브젝트를 인식하는 범위를 설정하는 값입니다.

GetMouseButtonDown 은 마우스 버튼을 누른 순간에 발생하는 순간 입니다. 

0은 마우스 왼쪽, 1은 마우스 오른쪽, 2는 마우스 휠버튼을 나타냅니다.

 

//ToolsCharacterController.cs

public class ToolsCharacterController : MonoBehaviour
{
    CharacterController2D character;
    Rigidbody2D rigid2d;
    [SerializeField] float offsetDistance = 1f;
    [SerializeField] float sizeOfInteractableArea = 1.2f;
    
    private void Awake(){
        character = GetComponent<CharacterController2D>();
        rigid2d = GetComponent<Rigidbody2D>();
    } 

    private void Update(){
        if(Input.GetMouseButtonDown(0)){
            UseTool();
        }
    }

    private void UseTool(){
        Vector2 position = rigid2d.position + character.lastMotionVector * offsetDistance; //캐릭터위치, 캐릭터방향, offset
        Collider2D[] colliders = Physics2D.OverlapCircleAll(position, sizeOfInteractableArea);

        foreach(Collider2D c in colliders){
            ToolHit hit = c.GetComponent<ToolHit>();
            if(hit != null){
                hit.Hit();
                break;
            }
        }
    }
}