본문 바로가기

Unity Basic/03. Unity C# script basic

Unity Basic ch. 16] C#Script 감지 RaycastHit2D

Collision을 통해 충돌을 감지했는데, 게임을 만들면서 

충돌 하지 않았어도, 앞에 있는 물체를 미리 감지해야할때가 있다. 그럴때 사용하는것이 RyacastHit이다.

 

먼저 게임오브젝트에서 레이를 눈에 보이게 그려보자.

 

 

1) Debug.DrawRay()

 

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

레이그리기(지금위치에서, 벡터값만큼, 색깔)

=>

Debug.DrawRay(transform.position,new Vector3(1,0,0), new Color(0,1,0));

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

 

보통 ray는 초록색으로 그린다. new Color(0,1,0)=초록색

 

화면에 보이게 그려보자.

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

public class PlayerMove : MonoBehaviour
{
    void Start()
    {
       
    }

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

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

 

플레이 버튼을 누르면 오른쪽에 Scene View에서 플레이어 오브젝트에서 오른쪽1만큼 초록색으로 레이가 생겼다.

 

** 더해보기

레이케스트를 밑으로  0.9f만큼 초록색으로 그어보자.

정답!

Debug.DrawRay(transform.position,new Vector3(0,-1,0)*0.9f, new Color(0,1,0));

 

 

2) RaycastHit2D

 

레이케스트는 하나에 컴포넌트라고 생각하면 될것같다.

레이캐스트히트는 선언하고, 초기화 해줘야한다. 파라미터 값에 대해 알아보자.

캐스트는 보통 연애인들 캐스팅한다고 생각하면 이해가 쉬울것같다.

 

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

레이케스트히트2D 레이이름 = 믈리2D.레이캐스트(현재위치에서, 벡터값, 크기);

=>

RaycastHit2D rayHit= Physics2D.Raycast(transform.position, new Vector3(0,-1,0), 0.9f);

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

hit.collider는 충돌이 감지 되지 않으면 null 값을 갖게 된다.

레이케스트를 이용해서 감지가 되었을때 감지된 오브젝트 이름을 메세지로 찍어보는 코딩을 해보자.

 

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

public class PlayerMove : MonoBehaviour
{
    void Start()
    {
       
    }

    void FixedUpdate()
    {
       Debug.DrawRay(transform.position,new Vector3(0,-1,0)*0.9f, new Color(0,1,0));

       RaycastHit2D hit = Physics2D.Raycast(transform.position,new Vector3(0,-1,0)*0.9f);

       if(hit.collider != null){

            Debug.Log(hit.collider.name);
        }
    }    
}

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

플레이버튼을 누르고 실행을하면 플레이어 자기 자신이 감지 되는 것을 볼 수 있다. 

 

 

 

 

3) RaycastHit2D 캐스팅 조건 추가

 

레이히트가 플레이어를 감지하도록 하고 싶은 것이 아니다. 그래서 캐스트 조건을 붙여줘야하는데

보통 캐스트는 레이어로 관리한다.

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

레이어마스크.마스크가져오기("레이어이름")

=>

LayerMask.GetMask("Water")  

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

 

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

public class PlayerMove : MonoBehaviour 
{ 
    void Start() 
    { 
        
    } 

    void FixedUpdate() 
    { 
      Debug.DrawRay(transform.position,new Vector3(0,-1,0)*0.9f, new Color(0,1,0),LayerMask.GetMask("Water")); 

      RaycastHit2D hit = Physics2D.Raycast(transform.position, new Vector3(0,-1,0), 0.9f, LayerMask.GetMask("Water")); 

      if(hit.collider != null){

            Debug.Log(hit.collider.name);
       } 
    }     
}

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

 

바닥타일에 레이어를 Water로 바꿔보자.

플레이어 레이어는 Water가 아니어야한다.

플레이 버튼을 누르면 Water 레이어에 닿은 오브젝트에 이름을 가져오는 것을 볼 수 있다. 

 

 

이번 chapter에서는 레이캐스트의 사용 방법에 대해서 배워봤다.

 

다음 장에는 마우스, 키보드로 값을 입력받아서 플레이어를 제어해보자!