상세 컨텐츠

본문 제목

Unity Beginner ch. 07] 마우스로 클릭했을때 오브젝트 감지하기

Unity Beginner

by allma 2020. 5. 5. 03:32

본문

우리가 감지하는 것은 RaycastHit2D 로 basic에서 살펴보았다.

참고 : 

https://allaboutmaker.tistory.com/17

 

 

1) 레이캐스트 그리기

여기에서 Mouse 스크립트에서 레이캐스트를 그려보자.

레이를 대각선으로 짭게 그려보겠다.

-----------------------

void Update()
{
        Vector3 vecPo = new Vector3(0.1f,0.1f,0);
        Debug.DrawRay(transform.position, vecPo, new Color(0,1,0));
}

-----------------------

 

플레이하면 아래와 같이 레이를 확인할 수 있다.

 

 

 

 

2) 레이캐스트히트

레이어 이름이 Water인 게임오브젝트를 감지하고 감지한 오브젝트의 이름을 찍어보자.

-------------------------

RaycastHit2D hit = Physics2D.Raycast(transform.position, vecPo, 1f, LayerMask.GetMask("Water"));

 

if(hit.collider != null){

     Debug.Log(hit.collider.name);

}

-------------------------

 

==============

    void Update()
    {
        Vector3 vecPo = new Vector3(0.5f,0.5f,0); 
        Debug.DrawRay(transform.position, vecPo, new Color(0,1,0)); 
        RaycastHit2D hit = Physics2D.Raycast(transform.position, vecPo, 1f, LayerMask.GetMask("Water"));
        if(hit.collider != null){
            Debug.Log(hit.collider.name);
        }
    }

==============

 

 

에너미 오브젝트를 Water로 바꾸자.

에너미 오브젝트에 Box Collider2D 가 있어야 감지가된다.

플레이 버튼을 누르고 에너미 오브젝트를 이동해서 감지가 되는지 확인해보자.

 

 

 

 

 

3) 함수로 모듈화하기

이제 함수로 바꿔보자.

 

==============

    void Update()
    {
        FindObject();
    }

    void FindObject()
    {
        Vector3 vecPo = new Vector3(0.5f,0.5f,0); 
        Debug.DrawRay(transform.position, vecPo, new Color(0,1,0)); 
        RaycastHit2D hit = Physics2D.Raycast(transform.position, vecPo, 1f, LayerMask.GetMask("Water"));
        if(hit.collider != null){
            Debug.Log(hit.collider.name);
        }
     }

==============

 

 

 

 

 

 

4) 마우스 클릭했을때만 FindObject() 실행하기

여기에서 항상 감지하는 것이 아니라, 마우스를 클릭했을대만 FindObject() 함수가 실행되도록해보자.

 

------------------

마우스 클릭했을때 

=>

if (Input.GetMouseButtonDown (0)) {

    실행문

}

------------------

 

실행문에 FindObject();를 넣어보자.

 

==============

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

    void FindObject()
    {
        Vector3 vecPo = new Vector3(0.5f,0.5f,0); 
        Debug.DrawRay(transform.position, vecPo, new Color(0,1,0)); 
        RaycastHit2D hit = Physics2D.Raycast(transform.position, vecPo, 1f, LayerMask.GetMask("Water"));
        if(hit.collider != null){
             Debug.Log(hit.collider.name);
        }
}

==============

 

 

 

 

 

 

 

 

5) 마우스 움직일때 냥발도 같이 따라 움직이게 해보자.

==============

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

        objectMove(gameObject);
    }

    void FindObject()
    {
        Vector3 vecPo = new Vector3(0.5f,0.5f,0); 
        Debug.DrawRay(transform.position, vecPo, new Color(0,1,0)); 
        RaycastHit2D hit = Physics2D.Raycast(transform.position, vecPo, 1f, LayerMask.GetMask("Water"));
        if(hit.collider != null){
            Debug.Log(hit.collider.name);
        }
}    
    
    void objectMove(GameObject obj)
    {
        Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector3 vec = new Vector3(mousePosition.x, mousePosition.y, 0);
        obj.transform.position = vec;
}

==============

 

 

 

 

 

 

여기까지 잘 따라 오셨습니다.

그런데 이렇게 하면 레이캐스트가 감지가 잘 안될 수 있습니다. 

다음 시간에  레이캐스트 감지가 더 잘 될 수 있도록 해봅시다.

관련글 더보기