본문 바로가기

[Unity] 콜라이더(Collider)

·
2020. 3. 5. 11:24
반응형

콜라이더(Collider)

콜라이더는 충돌 감지를 위한 컴포넌트 입니다. 콜라이더는 3D 오브젝트를 위한 Box Collider, Capsule Collider, Shpere Collider 등이 있고, 2D 오브젝트를 위한 Box Collider 2D, Polygon Collider 2D, Circle Collider 2D 등이 있습니다. 여기서는 3D 오브젝트를 위한 콜라이더에 대해서만 설명하겠습니다.

콜라이더(Collider) 종류

박스 콜라이더(Box Collider)

박스 콜라이더

박스 콜라이더는 사각형 모양의 콜라이더 이며, 유니티에서 가장 많이 사용하는 콜라이더 입니다.

박스 콜라이더 컴포넌트

Edit Collider를 클릭하면 콜라이더의 모양을 마우스로 편집할 수 있습니다.

다음 표는 박스 콜라이더의 속성을 정리한 것입니다.

이름 설명
Is Trigger 트리거 사용 여부 (체크 시 물리적인 충돌이 발생하지 않음)
Material 콜라이더에 사용되는 재질을 나타냄
Center 콜라이더 중심 (로컬 기준)
Size 콜라이더 크기 (로컬 기준)

스피어 콜라이더(Sphere Collider)

스피어 콜라이더

스피어 콜라이더는 원형 모양의 콜라이더 입니다. 콜라이더의 연산속도가 가장 빠릅니다.

스피어 콜라이더 컴포넌트

Edit Collider를 클릭하면 콜라이더의 모양을 마우스로 편집할 수 있습니다.

다음 표는 스피어 콜라이더의 속성을 정리한 것입니다.

이름 설명
Is Trigger 트리거 사용 여부 (체크 시 물리적인 충돌이 발생하지 않음)
Material 콜라이더에 사용되는 재질을 나타냄
Center 콜라이더 중심 (로컬 기준)
Radius 콜라이더 반지름 (로컬 기준)

캡슐 콜라이더(Capsule Collider)

캡슐 콜라이더

캡슐 콜라이더는 캡슐 모양의 콜라이더 이며, 캐릭터에 주로 사용하는 콜라이더 입니다.

캡슐 콜라이더 컴포넌트

Edit Collider를 클릭하면 콜라이더의 모양을 마우스로 편집할 수 있습니다.

다음 표는 캡슐 콜라이더의 속성을 정리한 것입니다.

이름 설명
Is Trigger 트리거 사용 여부 (체크 시 물리적인 충돌이 발생하지 않음)
Material 콜라이더에 사용되는 재질을 나타냄
Center 콜라이더 중심 (로컬 기준)
Radius 콜라이더 반지름 (로컬 기준)
Height 캡슐의 높이
Direction 캡슐의 방향

메쉬 콜라이더(Mesh Collider)

메쉬 콜라이더

메쉬 콜라이더는 메쉬 모양의 콜라이더 이며, 정밀하게 충돌을 감지할 경우 사용합니다. 메쉬가 복잡할 경우 콜라이더의 충돌을 연산하는데 시간이 많이 걸리므로 성능 저하가 일어날 수 있습니다. 메쉬 콜라이더는 기본적으로 성능 저하 방지를 위해서 충돌 감지가 꺼져 있습니다.

메쉬 콜라이더 컴포넌트

다음 표는 메쉬 콜라이더의 속성을 정리한 것입니다.

이름 설명
Convex 충돌 감지 메쉬 오브젝트 사용 여부 (체크 시 충돌 감지)
Is Trigger 트리거 사용 여부 (체크 시 물리적인 충돌이 발생하지 않음)
Material 콜라이더에 사용되는 재질을 나타냄
Mesh 충돌 감지 메쉬 오브젝트

 

콜라이더의 연산 속도는 스피어 콜라이더가 가장 빠르며, 다음으로 캡슐 콜라이더, 박스 콜라이더, 메쉬 콜라이더 순으로 느립니다. 스피어 콜라이더 > 캡슐 콜라이더 > 박스 콜라이더 > 메쉬 콜라이더

콜라이더(Collider) 충돌 감지

콜라이더가 붙어있는 게임오브젝트가 서로 충돌할 경우 OnCollision 또는 OnTrigger가 호출됩니다.

충돌을 감지하기 위해서는 다음 두 가지 조건을 모두 만족해야 합니다.

  • 두 게임오브젝트 모두 콜라이더 컴포넌트가 추가되어야 합니다.
  • 움직이는 게임오브젝트에는 반드시 리지드바디(Rigidbody) 컴포넌트를 추가해야 합니다.

리지드바디(Rigidbody) 컴포넌트가 붙어 있을 경우 물리 동작을 수행할 수 있습니다.

OnCollision

콜라이더가 붙어있는 게임오브젝트가 서로 충돌할 경우 OnCollision 함수가 호출되며 물리적인 충돌 현상이 발생됩니다. (콜라이더의 IsTrigger 를 체크 해제할 경우 OnCollision 발생)

다음은 OnCollision의 예제 코드입니다.

using UnityEngine;

public class OnCollisionExample : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("OnCollisionEnter " + collision.gameObject.name);
    }

    private void OnCollisionStay(Collision collision)
    {
        Debug.Log("OnCollisionStay " + collision.gameObject.name);
    }

    private void OnCollisionExit(Collision collision)
    {
        Debug.Log("OnCollisionExit " + collision.gameObject.name);
    }
}
  • OnCollisionEnter : 두 게임오브젝트가 충돌이 일어날 경우 호출
  • OnCollisionStay : 두 게임오브젝트가 충돌이 지속될 경우 호출
  • OnCollisionExit : 두 게임오브젝트가 충돌이 끝난 경우 호출

 

이해를 돕기 위해 예를 들어 보겠습니다.
충돌을 위한 스피어, 큐브 게임오브젝트를 생성하고, 바닥을 위한 플레인 오브젝트를 생성한 후, 다음과 같이 배치합니다.

OnCollision 게임오브젝트 배치

스피어, 큐브 게임오브젝트 리지드바디 컴포넌트를 추가합니다. 스피어 게임오브젝트에 OnCollisionExample 스크립트를 추가합니다. 스피어를 큐브 쪽으로 힘을 가하기 위해 AddForce 스크립트를 스피어 게임오브젝트에 추가합니다.

다음은 AddForce 스크립트 코드입니다.

using UnityEngine;

public class AddForce : MonoBehaviour
{
    public float Force = 0.1f;

    private Rigidbody rigidbody;

    void Start()
    {
        rigidbody = GetComponent<Rigidbody>();
    }

    void Update()
    {
        // 매 프레임마다 Vector3.right 방향으로 Force 만큼 힘을 가함
        transform.Translate(Vector3.right * Force); 
    }
}

다음은 스피어와 큐브의 인스펙터 입니다.

OnCollision 스피어 인스펙터OnCollision 큐브 인스펙터

플레이를 하게 되면 실행 결과는 다음과 같습니다.

OnCollision 실행결과

OnTrigger

콜라이더가 붙어있는 게임오브젝트가 서로 충돌할 경우 OnTrigger 함수가 호출되며 물리적인 충돌은 현상은 발생되지 않고 물체를 통과하게 됩니다. (콜라이더의 IsTrigger 를 체크할 경우 OnTrigger 발생)

다음은 OnTrigger의 예제 코드입니다.

using UnityEngine;

public class OnTriggerExample : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("OnTriggerEnter " + other.name);
    }

    private void OnTriggerStay(Collider other)
    {
        Debug.Log("OnTriggerStay " + other.name);
    }

    private void OnTriggerExit(Collider other)
    {
        Debug.Log("OnTriggerExit " + other.name);
    }
}
  • OnTriggerEnter : 두 게임오브젝트가 충돌이 일어날 경우 호출
  • OnTriggerStay : 두 게임오브젝트가 충돌이 지속될 경우 호출
  • OnTriggerExit : 두 게임오브젝트가 충돌이 끝난 경우 호출

 

이해를 돕기 위해 예를 들어 보겠습니다.
충돌을 위한 스피어, 큐브 게임오브젝트를 생성하고, 바닥을 위한 큐브 오브젝트를 생성한 후 다음과 같이 배치합니다. (OnCollision 예제와 동일하게 배치)

OnTrigger 게임오브젝트 배치

스피어, 큐브 게임오브젝트에 있는 콜라이더 컴포넌트의 IsTrigger 를 체크합니다. 스피어 게임오브젝트에 리지드바디 컴포넌트를 추가합니다. 스피어 게임오브젝트에 OnTriggerExample 스크립트를 추가합니다. 스피어를 큐브 쪽으로 이동시키기 Mover 스크립트를 스피어 게임오브젝트에 추가합니다.

다음은 Mover 스크립트 코드입니다.

using UnityEngine;

public class Mover : MonoBehaviour
{
    public float Speed = 5f;

    void Update()
    {
        transform.Translate(Vector3.right * Speed * Time.deltaTime);
    }
}

 

다음은 스피어와 큐브의 인스펙터 입니다.

OnTrigger 스피어 인스펙터OnTrigger 큐브 인스펙터

플레이를 하게 되면 실행 결과는 다음과 같습니다.

OnTrigger 실행결과

참고

반응형
블로그 이미지
Frontend Engineer

댓글