유니티/유니티 C#

Collision과 Trigger

monstro 2024. 11. 11. 21:34
728x90
반응형

Unity를 다루다 보면 물리 충돌은 매우 빈번하게 일어납니다.

물리 충돌게임에서 무언가를 판단하는 매우 중요한 기능이므로 

물리 충돌 없이는 사실상 게임이 돌아가지 않는다고 봐도 무방할 정도입니다.

 

그리고 Unity에서는 이러한 충돌을 위해 2가지의 기능을 제공합니다.

오늘은 위의 2가지 기능과 그 차이를 중점으로 한번 알아보겠습니다.

 

1) Collision

Collision실제 물리 충돌을 판단합니다.

총알이 피격당하거나 휘두른 검에 맞는 등의 실제 물리 충돌을 판단하는 것이 바로 Collision입니다.

 

Collision의 경우 판단하는 함수는 OnColiisionEnter() 입니다.

그렇다면 판단하는 조건에 대해서도 알아봐야 하는 것이 당연합니다.

Collision의 판단 조건은 다음과 같습니다.

 

  1. 충돌하는 대상 또는 충돌받는 대상에게 RigidBody 컴포넌트가 존재(단, IsKinematic는 끄기)
  2. 충돌하는 대상에게 Collider가 존재(단, Is Trigger는 끄기)
  3. 충돌받는 대상에게 Collider가 존재(마찬가지로 Is Trigger는 끄기)

 

위의 판단 조건을 만족한다면 Collider는 동작하게 됩니다.

그렇다면 예제를 통해 알아보겠습니다.

 

 

현재 Cylinder에게는 RigidBody 컴포넌트가 존재하지 않습니다.

 

CollisionTest에게는 RigidBody가 존재합니다.

이제 CollisionTest에게 다음의 코드로 동작하는 컴포넌트를 붙여보겠습니다.

 

public class CollisionController : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log($"I am {gameObject.transform.name}");
    }
}

 

실행하여 확인해보면

 

 

OnCollisionEnter가 잘 동작한 것을 확인할 수 있습니다.

 

2) Trigger

Trigger는 Collision과는 다르게 실제 물리의 충돌이 아닌 충돌 범위에 들어갔는지를 판단합니다.

따라서 실제 물리 연산을 수행하는 Collision과는 다르게 적은 연산량을 갖고 있습니다.

사용하는 함수는 OnTriggerEnter() 입니다.

 

Trigger의 판단 조건은 다음과 같습니다.

 

  1. 충돌하는 대상과 충돌받는 대상 모두 Collider가 존재해야 한다
  2. 두 Collider 중에서 적어도 하나는 Is Trigger가 켜져 있어야 한다
  3. 충돌하는 대상과 충돌받는 대상 중 적어도 하나는 RigidBody 컴포넌트가 존재해야 한다 

 

위의 조건을 만족한다면 Trigger 역시 동작하게 됩니다.

마찬가지로 실제 예시를 통해 알아보겠습니다.

 

 

Cylinder의 컴포넌트 옵션은 기존과 차이점이 없습니다.

그렇다면 다음은 TriggerTest를 보겠습니다.

 

 

TriggerTest의 경우 위와 같이 컴포넌트가 구성되어 있습니다.

이제 TriggerTest에게 다음의 코드로 동작하는 컴포넌트를 붙여보겠습니다.

 

public class TriggerController : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log($"I am {gameObject.transform.name}");
    }
}

 

실행결과를 살펴보면,

 

 

위와 같이 문제없이 실행되는 것을 확인할 수 있습니다.

따라서 설계하는 경우에 따라 Collision을 사용할지, Trigger를 사용할지 결정해주시면 되겠습니다.

728x90
반응형