Unity - Collision & Trigger

이승덱·2021년 12월 27일
0

UnityEngine

목록 보기
7/11

Unity - Collision & Trigger

Collision

  • Collision은 오브젝트간의 충돌을 검사하기 위해 사용한다

  • Collision은 Collider 컴포넌트와 RigidBody 컴포넌트를 이용해 Collider간의 충돌을 검사한다.

  • 충돌할 오브젝트들 중 최소 하나는 rigidbody를 가져야 한다.

  • Collider은 대부분 캡슐, 박스, 구 등의 정해진 모양을 캐릭터에 추가해 사용하는데, 이 이유는 메쉬 자체를 콜라이더로 하면 메쉬의 모양이 단순하지 않을 경우 부하가 발생할 가능성이 높고 메쉬는 애니메이션에 따라 모양이나 위치가 바뀌기 때문에 Collider Component를 사용하여 Collision검사를 한다.

  • isKinematic을 사용하면 유니티의 물리 엔진 적용을 무시한다.

  • Freeze Rotation을 사용하면 회전을 막을 수 있다.

  • OnCollisionTrigger을 Collider끼리 충돌 시 통해 충돌 시 호출할 기능을 구현할 수 있다.

  • 부딪힌 물체에 대한 정보를 매개변수로 갖는다.

Trigger

  • 물리와는 관계 없이 범위 내에 들어갔는가를 판단하고 싶다면 Trigger를 사용한다.
  • 충돌할 두 오브젝트 중 최소 하나이상 Trigger가 켜져 있어야 한다.
  • 충돌할 두 오브젝트 중 최소 하나이상 rigidbody가 있어야 한다.
  • 두 오브젝트 모두 Collider가 있어야 한다.

LayerMask

  • 충돌 검사는 굉장히 헤비한 연산을 동반하는 기능이다.
  • 때문에 충돌 연산을 위한 충돌 연산용 Collider을 따로 추가해주는 방법이 있다.
  • 그럼에도 불구하고 오브젝트 수 자체가 많을 경우 충돌 검사가 많은 연산을 필요로 하여 부하가 생길 수 있다.
  • 이 문제를 해결하는 방법은 LayerMask이다.
  • LayerMask를 통해 Collider에게 종류를 부여하고 충돌검사 시 검사하고자 하는 LayerMask를 미리 설정하여 연산을 줄인다.
  • LayerMask는 32bit를 사용하여 비트단위로 표현한다.
RaycastHit hit;
//int mask = 1 << 8 | 1 << 9;
int mask = LayerMask.GetMask("Wall") | LayerMask.GetMask("Enemy");
if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
    Debug.Log($"picking {hit.collider.gameObject.name}");
}
profile
공부 기록용 블로그입니다

0개의 댓글