이번 주에는 플레이어 점프 구현에서 충돌 처리를 할 때 Collider을 쓰지 않고 Raycast를 쓴 이유와, 두 가지 충돌 처리 방법에 대해 알아보았다.
왜 Collider방식이 아닌 Raycast방식을 사용했을까?
Collider 방식
Collider로 충돌 처리를 하는 방식은 오브젝트에 Collider 컴포넌트와 Rigidbody 컴포넌트를 추가해 직접적인 오브젝트 간 물리적 충돌 체크를 하는 방법이다. 즉, 직접적으로 투사체가 이동 후 충돌 판정이 가능하다.
이 방식은 MeshCollider(물체의 모양에 따른 Collider 형태 조정) 기능을 사용해 물체의 Mesh와 완벽하게 일치하는 충돌체크를 하게 만들어준다.
그러나 충돌 시 Collider이 투사체에 완벽하게 일치한 상태로 이동 후 판정이 되어 버려서 장애물에 충돌한 지점이 겹쳐지거나 투사체의 속도가 빠른 경우 장애물을 넘어가버릴 수도 있다.
(++또한 Trigger속성을 사용할 경우, **contects속성(부딪힌 장애물의 정확한 접촉 지점을 알려주는 유니티 지원 API)**을 사용할 수 없다. 그러므로 정확한 접촉 지점을 알 수 없어 해당 지점에 추가 작업을 할 수 없게 된다.)
Raycast 방식
Raycast방식은 투사체의 위치에서 시작되는 Ray를 생성해 투사체가 이동하기 전 Ray에 충돌하는 오브젝트 여부를 확인하는 방식이다.
이 방식은 Collider 방식과 다르게 컴포넌트를 붙여서 사용하는 방식이 아닌 LayMask를 매개변수로 받게 하여 특정 Layer 기준으로 충돌 여부를 조정한다.
(++직접적으로 충돌하지 않아도 충돌 여부를 판정 가능하다. 즉, 물체가 움직일 때 프레임을 사용해 움직임 여부를 판단하므로 물체의 속도에 deltaTime을 곱해 한 프레임동안 이동될 투사체의 거리만큼만 Ray를 체크한다.)
(++그리고 Raycast 시작 지점과 충돌한 상태인 Collider은 감지되지 않는다.)
현재 위치에서 생성한 Ray를 가지고 충돌판정을 해 다른 프레임에서의 충돌을 파악할 수 있다. 그러므로. Collider의 맹점처럼 장애물에 끼거나 속도로 인해 장애물을 넘어가는 현상은 발생하지 않는다.
그러나 충돌하는 투사체의 Ray를 1개만 생성하고 Ray가 장애물을 빗겨나간다면 잘못된 충돌 처리를 할 수 있다. Ray를 여러개 만들어 문제를 해결할 수도 있지만, 물체의 Mesh가 복잡한 경우 정확도가 떨어질 수 있다. 즉, 충돌시 정확한 표면 처리의 한계가 존재한다.
종합적으로 정리해 보면, Collider은 정적이거나 속도가 느린 투사체에, Raycast는 속도가 빠른 투사체에 적합하다는 것이다.
위 강의에서는 점프 후 착지를 할 때 플레이어의 애니메이션에 변화를 주기 위해 충돌 처리를 하였다. 해당 충돌에 대해 분석해 본다면 크게 복잡하지 않은 메쉬(사각형 형태)를 가졌고, 플레이어가 투사체이기 때문에, 많은 물리적 움직임이 존재한다. 충돌의 주요 목적이 투사체에 직접적인 접촉이 아니라, 충돌 상황에서 애니메이션이 변하는 모션 보여주는 것이기 때문에 Ray를 통해 직접적으로 접촉하지 않더라도 빠르게 변화할 수 있도록 구현했다고 생각한다.
'unity' 카테고리의 다른 글
[Obstacle_Course] 0. 게임 기획 (0) | 2023.01.16 |
---|---|
[유니티 스터디 3주차] Invoke와 Coroutine의 차이 (0) | 2022.10.01 |
Get Item All [1-2. 점프 기능 추가] (0) | 2022.09.20 |
[유니티 스터디 1주차] 선형 보간 알고리즘 (0) | 2022.09.17 |
Mesh Filter과 Mesh Renderer이 둘 다 존재해야 하는 이유 (0) | 2022.09.01 |