콜라이더(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 : 두 게임오브젝트가 충돌이 끝난 경우 호출
이해를 돕기 위해 예를 들어 보겠습니다.
충돌을 위한 스피어, 큐브 게임오브젝트를 생성하고, 바닥을 위한 플레인 오브젝트를 생성한 후, 다음과 같이 배치합니다.
스피어, 큐브 게임오브젝트 리지드바디 컴포넌트를 추가합니다. 스피어 게임오브젝트에 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);
}
}
다음은 스피어와 큐브의 인스펙터 입니다.
플레이를 하게 되면 실행 결과는 다음과 같습니다.
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 예제와 동일하게 배치)
스피어, 큐브 게임오브젝트에 있는 콜라이더 컴포넌트의 IsTrigger
를 체크합니다. 스피어 게임오브젝트에 리지드바디 컴포넌트를 추가합니다. 스피어 게임오브젝트에 OnTriggerExample
스크립트를 추가합니다. 스피어를 큐브 쪽으로 이동시키기 Mover
스크립트를 스피어 게임오브젝트에 추가합니다.
다음은 Mover
스크립트 코드입니다.
using UnityEngine;
public class Mover : MonoBehaviour
{
public float Speed = 5f;
void Update()
{
transform.Translate(Vector3.right * Speed * Time.deltaTime);
}
}
다음은 스피어와 큐브의 인스펙터 입니다.
플레이를 하게 되면 실행 결과는 다음과 같습니다.
댓글