스파르타 게임개발종합반(Unity)/TIL - 본캠프 매일 공부 기록

2024.05.24 TIL - Ray, Raycast, IsGrounded, 땅 충돌 체크

테크러너 2024. 5. 24.

isGrounded 땅 충돌 체크하기 - Ray, Raycast

    bool IsGrounded()
    {
        Ray[] rays = new Ray[4]
        {
            new Ray(transform.position + (transform.forward * 0.2f) + (transform.up * 0.01f), Vector3.down),
            new Ray(transform.position + (-transform.forward * 0.2f) + (transform.up * 0.01f), Vector3.down),
            new Ray(transform.position + (transform.right * 0.2f) + (transform.up * 0.01f), Vector3.down),
            new Ray(transform.position + (-transform.right * 0.2f) + (transform.up * 0.01f), Vector3.down)
        };

        for (int i = 0; i < rays.Length; ++i)
        {
            if (Physics.Raycast(rays[i], 0.1f, groundLayerMask))
            {
                return true;
            }               
        }
        return false;
    }

위의 코드는 플레이어가 땅에 닿았는지 체크하는 코드이다.

`transform.up`을 더해주는 이유는 플레이어랑 땅이랑 완전 딱 붙어있으면 충돌 체크가 안될 가능성도 있기 때문에 약간 위에서 레이가 시작되게 하려는 것이다.

 

위의 코드를 그림으로 표현해봤다.

 

 

Ray를 1개만 쏴도 되지 않을까?

튜터님께 질문을 드렸었는데, 1개만 쏴도 되지만 4개를 쏘면 정확성이 향상된다고 하셨다.

예를 들면 위의 그림처럼 절벽에 떨어진다고 했을 때 레이가 하나였다면 충돌 체크가 되지 않았을 것이다.

 

 

땅과의 충돌체크하는 방법 : 콜라이더 VS Ray

땅과의 충돌체크 방법에는 Ray말고도 콜라이더로 충돌하는 방법이 있는걸로 알고 있다.

 

둘의 차이점이 뭘까?

Ray매 프레임마다 충돌 여부를 체크한다. 그래서 성능에 부담 줄 수 있다.

콜라이더물리 엔진이 물체 간의 충돌을 관리하므로 충돌이 발생할 때마다 물리적인 반응을 처리한다. 또한, Unity의 물리 시스템은 충돌을 효율적으로 처리하기 위해 최적화되어 있으므로 성능 면에서도 유리할 수 있다.

 

결론은 어떤 게임이냐에 따라 상황을 고려하여 선택하는 것이 좋다.

 

반응형

댓글