충돌의 판정(OnTriggerEnter)
두 물체가 충돌하려면 양쪽 다 콜라이더(Collider) 컴포넌트가 있어야 합니다. 오브젝트를 설치하면 자동으로 콜라이더도 함께 설치되는데, 콜라이더를 제거한 오브젝트는 충돌이 발생하지 않습니다. 지금 바닥으로 사용하고 있는 Plane은 Mesh Collider를 가지고 있습니다. 이것을 제거하고 게임을 실행하면, 리지드바디의 Gravity 속성이 있는 오브젝트는 모두 중력의 영향을 받아 그대로 바닥을 뚫고 추락해 버릴 것입니다.
물체가 충돌할 때 충돌 이벤트가 발생하려면 기본적으로 콜라이더가 있는 상태에서 적어도 어느 하나는 리지드바디 컴포넌트가 있어야 합니다. 현재 탱크와 장애물은 둘 다 리지드바디 컴포넌트가 없으므로 비록 콜라이더가 있더라도 탱크와 장애물의 충돌은 일어나지 않습니다. 실제로 게임을 실행하고 탱크를 장애물쪽으로 몰고 가면 탱크가 장애물을 뚫고 지나갈 것입니다.
이것을 막으려면 탱크에 리지드바디 컴포넌트를 추가합니다. 이때 리지드바디의 Gravity 속성을 Off로 하면 탱크가 장애물과 충돌할 때 그 반발력으로 하늘로 떠오르게 될 것입니다(무중력 상태이므로).
그렇다면 여기서 한 가지 의문이 생길 것입니다. 의문이 없다구요? 그렇다면 님은 천재이거나 생각없이 사는 사람인데, 천재이기를 바랍니다. ^__^
만 일 장애물에 리지드바디가 있고 탱크는 없는 경우, 탱크와 장애물의 충돌은 어떻게 될 것인가? 리지드바디는 물리적인 특성이라고 설명한 바 있습니다. 탱크에 리지드바디 컴포넌트가 없으면 탱크는 물리적인 영향을 받지 않으므로 비록 장애물에 리지드바디가 있더라도 장애물을 통과할 것입니다.
오브젝트가 충돌할 때 발생하는 이벤트는 다음과 같은 것이 있습니다(캐릭터 컨트롤러를 사용할 때 발생하는 이벤트는 제외합니다).
OnCollisionEnter(Collision) 충돌 후 반사 등의 수학적인 계산을 수행한다
OnTriggerEnter(Collider) 충돌 후 수학적인 계산을 수행하지 않는다
물체의 충돌 시 상황에 따라 둘 중 어느 하나가 발생하며, 둘 다 발생하는 경우는 없습니다. 충돌하는 물체 중 적어도 어느 하나가 Trigger 속성이 있으면 OnTriggerEnter()가 호출됩니다. 총알이나 화살처럼 슈팅으로 사용하는 오브젝트는 대부분 Trigger를 설정한 상태로 사용합니다. 그렇게 해야 벽에 부딪쳐도 반사되지 않습니다. 총알이 벽에 맞아 파편이 튀는 것은 파티클로 처리하는 것이지 실제로 총알이 반사되는 것은 아닙니다.
이 제 충돌을 판정하는 스크립트를 작성합니다. 포탄과 장애물이 충돌할 때의 처리입니다. 충돌의 처리는 장애물에서 해도 되고, 포탄에서 해도 됩니다. 그런데 포탄은 장애물 뿐만 아니라 장차 적군 탱크가 나타나면 적군 탱크와의 충돌도 생길 것이므로 충돌의 판정은 포탄에서 처리허는 것으로 하겠습니다.
댓글 쓰기