[유니티] Unity Physics Raycast

안녕하세요 UnityBeginner입니다.
이번 글에선 Physics의 raycast 함수에 대해 알아보겠습니다.

Physics의 raycast는 보이지않는 실선을 발사하여 해당하는 방향에 충돌체
(collider가 포함 된)가 존재하는지 체크하는 함수입니다.

cast는 에는 다양한 종류가 있으며 빠른 이해를 돕기 위해
Physics2D를 이용하여 설명하고 실습하겠습니다.


Cast의 종류

BoxCast : 박스형태의 선을 캐스팅하고 첫 번째 충돌체를 가져옵니다.
BoxCastAll : 박스형태의 선을 캐스팅하고 모든 충돌체를 가져옵니다.
CircleCast : 원반형태의 선을 캐스팅하고 첫 번째 충돌체를 가져옵니다.
CircleCastAll : 박스형태의 선을 캐스팅하고 모든 충돌체를 가져옵니다.
Raycast : 실선을 캐스팅하고 첫 번째 충돌체를 가져옵니다.
RayCastAll : 실선을 캐스팅하고 모든 충돌체를 가져옵니다.

그럼 이제 Physics2D CircleCast가 올바르게 작동하는지 확인 해 보겠습니다.
아래와 같이 오브젝트들을 배치하였고, Gizmos를 통해 Cast의 반경, 방향, 거리를
씬뷰에 보이게 스크립트 하였습니다. 


씬뷰


OndrawGizmo를 사용하여 Physics Cast의 방향과 거리를 노출시켰습니다.


스크립트 Button


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public Transform white, pink;

    float radius = 10f;
    float distance = 150f;

    public void OnButton1() {

        RaycastHit2D hit2D = Physics2D.CircleCast(white.position, radius, white.right, distance);

        if (hit2D)
            Debug.Log(hit2D.collider.name);
    }

    public void OnButton2() {

        RaycastHit2D hit2D = Physics2D.CircleCast(pink.position, radius, pink.right, distance);

        if (hit2D)
            Debug.Log(hit2D.collider.name);
    }


버튼을 클릭시 Phtisics Cast 이용하여 충돌체를 검사해 콘솔출력하는 코드


스크립트 OnDrawGizmos

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void OnDrawGizmos() {

        Gizmos.color = Color.black;

        Vector2 whiteTop = white.position;
        Vector2 whiteBottom = white.position;
        Vector2 whiteDistance = white.position;

        whiteTop.y -= radius;
        whiteBottom.y += radius;
        whiteDistance.x += distance;
        
        Gizmos.DrawSphere(white.position, radius);  // white radius
        Gizmos.DrawSphere(whiteDistance, radius);   // Physics (direction + ditance), radius

        Gizmos.DrawRay(white.position, white.right * distance);     // white radius ray cast
        Gizmos.DrawRay(whiteTop, white.right * distance);           // white radius top ray cast
        Gizmos.DrawRay(whiteBottom, white.right * distance);        // white radius bottom ray cast

        Vector2 pinkTop = pink.position;
        Vector2 pinkBottom = pink.position;
        Vector2 pinkDistance = pink.position;

        whiteTop.y -= radius;
        whiteBottom.y += radius;
        whiteDistance.x += distance;

        pinkTop.y -= radius;
        pinkBottom.y += radius;
        pinkDistance.x += distance;
        
        Gizmos.DrawSphere(pink.position, radius);
        Gizmos.DrawSphere(pinkDistance, radius);
       
        Gizmos.DrawRay(pink.position, pink.right * distance);
        Gizmos.DrawRay(pinkTop, pink.right * distance);
        Gizmos.DrawRay(pinkBottom, pink.right * distance);

    }

Gizmos로 그려지는 내용은 게임뷰가 아닌 씬뷰에서 확인가능합니다.


결과화면



영상의 내용처럼 cast안에 포함되는 충돌체를 검사하였고, 
cast안에 포함되지 않는 충돌체는 검사되지 않는 것을 확인해보았습니다.

cast는 게임내에서 여러용도로 사용할 수 있습니다. 
횡스크롤 액션게임의 플레이어의 점프를 위한 지면체크,
적과 플레이어가 일정 반경안에 접근 시 raycast를 통해 공격의 유효성체크 등등
다양한 용도로 사용이 가능하며 요번화는 가장 기본적인 부분에 대해 배워봤습니다.

댓글