Unity

트리거 콜라이더

게임 개발 2024. 2. 11. 16:55

 

 

콜라이더 설정하기

 

 총알과 총알이 충돌했을 때,  튕겨나지 않고 그냥 통과하도록 만들 고 싶을 수도 있다.

이때 트리거로 설정된 콜라이더를 사용하면 해당 의도를 반영한 프로젝트를 만들 수 있다.

 

 

트리거 콜라이더

 

 

 트리거 콜라이더는 충돌한 물체를 밀어내는 물리적인 표면이 없다.

그래서 트리거 콜라이더는 다른 일반 콜라이더와 겹치거나 서로를 뚫고 지나갈 수 있지만,

충돌 자체는 감지한다.

따라서 트리거 콜라이더는 충돌이 감지되었을 때 어떤 기능을 실행하는 방아쇠로 많이 사용한다.

 

예를 들어 플레이어가 특정 영역으로 진입했는지 검사할 때 트리거 콜라이더를 많이 사용한다.

보이지 않는 트리거 콜라이더를 어떤 위치에 배치하고,

플레이어가 해당 트리거 콜라이더를 통과할 때 새로운 적을 출현시키거나 컷씬을 재생하는 방식으로 사용한다.

 

 

트리거 콜라이더 활용법

 

 

이외에도 트리거 콜라이더를 활용하는 방법은 굉장히 많다.

 

해당 예제에서는 트리거 콜라이더를 탄알이 충돌 차제는 감지하되

다른 게임 오브젝트를 밀어내지 않도록 하는 데 사용하겠다.

 

 

 

과정 1. 인스펙터 창에서 Sphere Collider 컴포넌트의 Is Trigger 체크

 

 

 

과정 2. 프리팹으로 총알 게임 오브젝트를 실시간 복제 생성하기

 

 

프리팹이란?

 프리팹은 얼마든지 재사용할 수 있는 미리 만들어진 게임 오브젝트 에셋으로,
비슷한 게임 오브젝트를 여러 개 만들 때 매번 다시 설정하는 번거로움을 줄이기 위해
프리팹을 상용한다.

게임 오브젝트를 프리팹으로 만들면 나중에 해당 게임 오브젝트와
똑같은 게임 오브젝트를 프리팹에 복제 생성할 수 있다.

프리팹은 파일로 저장되기 때문에 현재 씬뿐만 아니라 다른 씬에서도 사용가능하다.

프리팹으로 게임 오브젝트 복제본 생성

 

 

 

 

 

과정 3. 충돌 이벤트 메서드

 

 

유니티에서 콜라이더를 가진 게임 오브젝트 A와 B가 서로 충돌한 상황을 가정해보자.

이때 게임 오브젝트 A와 B는 모두 자신이 충돌했다는 사실을 모른다.

 

게임 오브젝트는 자신이 충돌한 사실을 스스로 알 수 없다.

그 대신 충돌했음을 알려주는 메시지 A와 B가 보내진다.

충돌 메시지를 통해 게임 오브젝트와 해당 게임 오브젝트에 추가된 컴포넌트들은 

충돌 사실을 알게 되고 충돌에 대응하는 메서드를 실행한다.

 

충돌한 게임 오브젝트에 전파되는 충돌 메시지

 

 

 

 게임 오브젝트와 컴포넌트는 충돌 종류에 따라 OnTriggerEnter 혹은 OnCollisionEnter 메시지를 받는다.

 

Start() 메서드나 Update() 메서드가 자동으로 실행되는 이유는,

Start, Update 메시지와 같은 이름으로 메서드를 작성했기 때문이다.

마찬가지로 충돌 메시지에 대응하려면 충돌 메시지와 같은 이름으로 메서드를 작성하면 된다.

 

또한 추올 메시지에는 충돌한 상대방 게임 오브젝트에 대한 정보도 함께 첨부된다.

A에는 충돌한 상대방 B 게임 오브젝트의 정보가 전달되며,

B에는 충돌한 상대방 A 게임 오브젝트의 정보가 전달된다.

따라서 충돌한 상대방 게임 오브젝트가 어떠한 오브젝트인지 충돌 메시지를 통해 알 수 있으며,

어떤 대응을 해야 하는지도 결정할 수 있다.

 

결론적으로는 메시지 기반 방식 덕분에,

충돌을 어떻게 감지할까 고민하지 않아도 된다는 것이다.

단지 충돌했을 때 무엇을 실행할지만 결정하면 된다.

 

 

리지드바디 컴포넌트와 충돌 메시지

위에 언급한 충돌 메시지를 발생시키는 것은 리지드바디 컴포넌트이다.
따라서 충돌 이벤트 메서드를 사용하려면 서로 충돌 중인 게임 오브젝트 중에서 
최소 하나의 게임 오브젝트는 리지드바디 컴포넌트를 가지고 있어야 한다.

 

충돌 메시지에 대응하는 메서드를 충돌 이벤트 메서드라고한다.

충돌 종류에 따라 이벤트 메서드 중 알맞은 것을 선택하여 구현해야 한다.

 

 

OnCollision 계열 : 일반 충돌

 

일반적인 콜라이더를 가진 두 게임 오브젝트가 충돌할 때 자동으로 실행된다.

충돌한 두 콜라이더는 서로 통과하지 않고 밀어낸다

 

  • OnCollisionEnter(Collision collsion) : 충돌한 순간
  • OnCollisionStay(Collsion collision) : 충돌하는 동안
  • OnCollisionExit(Collsion collision) : 충돌했다가 분리되는 순간

 

OnCollision 계열 메서드가 실행될 때는 메서드 입력으로 충돌 관련 정보가 Collision 타입으로 들어온다.

 

Collision 타입은 충돌 관련 정보를 담아두는 단순한 정보 컨테이너이다.

따라서 입력으로 들어온 Collision을 통해 충돌한 상대방 게임 오브젝트,

충돌 지점, 충돌 표면의 방향 등을 알 수 있다.

 

 

OnTrigger 계열 : 트리거 충돌

 

 

충돌한 두 게임 오브젝트의 콜라이더 중 최소 하나가 트리거 콜라이더라면 자동으로 실행된다.

이 경우 두 게임 오브젝트가 충돌했을 때 서로 그대로 통과한다.

 

  • OnTriggerEnter(Collider other) : 충돌한 순간
  • OnTriggerStay(Collider other) : 충돌하는 동안
  • OnTriggerExit(Collider ohter) : 충돌했다가 분리되는 순간

 

OnTrigger 계열의 메서드가 실행될 때는

메서드 입력으로 충돌한 상대방 게임 오브젝트의 콜라이더 컴포넌트가 Collider 타입으로 들어온다.

여기서 Collision이 아닌 Collider 타입을 입력받는 이유는

트리거 충돌에는 상세한 충돌 정보가 필요 없기 때문이다.

 

트리거 충돌은 일반적인 충돌과 달리 서로를 밀어내지 않고 그대로 통과한다.

따라서 물리적인 반발력이나 정확한 충돌 지점, 충격량 등이 존재하지 않으므로

충돌한 상대방 게임 오브젝트(의 콜라이더 컴포넌트)를 곧장 받는다.

 

OnTrigger 계열의 메서드는 자신이 트리거 콜라이더가 아니어도 실행된다.

충돌한 두 콜라이더 중 하나 이상이 트리거 콜라이더 일 때
양쪽 모두에서 OnTrigger 계열의 메서드가 실행된다.
따라서 자신의 콜라이더가 일반 콜라이더라고 해도
충돌한 상대방 게임 오브젝트의 콜라이더가 트리거 콜라이더라면
자신과 상대방 모두 OnCollision이 아닌 OnTrigger 계열의 충돌 이벤트 메서드가 실행된다.

'Unity' 카테고리의 다른 글

코루틴  (0) 2024.02.26
Instantitate()와 Destroy()함수  (0) 2024.02.15
유니티 기본 설정 값 작업  (1) 2024.02.11
컴포넌트 패턴  (0) 2024.02.05
Unity 기본 설정  (0) 2024.02.05