공부 기록

[Unity 3D] 유니티 오브젝트 충돌 이벤트 처리 본문

Unity

[Unity 3D] 유니티 오브젝트 충돌 이벤트 처리

혜멘 2020. 12. 2. 16:52

오늘은 오브젝트가 서로 충돌할 때 특정 이벤트를 수행하는 것을 구현해볼 예정이다.

#1 충돌을 감지할 오브젝트 설정

 

충돌 함수를 처리하기 위해서는 충돌하는 두 물체 중 한가지는 리지드바디로 설정되어있어야 한다.

설정 방법은 유니티 환경에서 오브젝트를 클릭하여 inspector 창을 열고 add component에서 rigid를 검색하면 나온다.

이때 3D 오브젝트는 Rigidbody로, 2D 오브젝트는 Rigidbody 2D 로 설정해야한다.

 

 

두 오브젝트 중 움직이는 것에 리지드바디를 설정하는것이 좋다고 한다.

 

주의할 점은 바닥을 놓지 않고 실행하면 큐브가 수직낙하한다. 이때 공중에 가만히 멈춰두고싶다면 is kinematic을 체크하여 중력과 충돌에 반응하지 않도록 한다.

 

충돌에 반응하면서 해당 위치를 벗어나지 않는 것을 원한다면 Constraint의 freeze Position을 설정하면 된다.

 

 

#2 충돌 이벤트 처리 함수

 

충돌 함수는 크게 두 종류가 있는데, 각각 이러하다.

 

1. Collision : 오브젝트간 물리적 연산을 하며 충돌감지

2. Trigger : 오브젝트간 물리적 연산을 하지 않고 충돌만 감지

 

쉽게 말하자면 collision은 충돌이 일어나면 튕겨나가고 Trigger는 통과해서 지나친다.

 

 

다음으로 충돌함수의 세 유형을 정리해보자.

 

1) 충돌이 시작될 때 호출

void OnCollisionEnter(Collision col) 

 

2) 충돌이 지속되고 있을 때 매 프레임마다 호출 

void OnCollisionStay(Collision col)

 

3) 충돌이 끝날 때, 즉 물체가 서로 떨어질때 호출

void OnCollisionExit(Collision col)

 

 

이 글에서는 Collision을 다룰 예정이므로 Collision으로 설명하였지만, Trigger도 함수명만 다를 뿐 유형 자체는 똑같다.

나의 경우는 타악기를 구현하고자 하므로 충돌이 감지되었을때 오브젝트에서 소리를 발생시키도록 OnCollision Enter를 사용하였다.

 

 

#3 특정 물체와의 충돌만 인정하고 싶을 경우

 

리지드바디로 설정해놓은 오브젝트를 바닥에 놓고 충돌 처리 함수를 작성하고 실행하면,

바닥에 닿아있는 것도 오브젝트간의 충돌로 인식하여 원하는 타이밍이 아니어도 충돌함수가 실행되어버린다.

 

이럴 경우, 함수의 파라미터로 충돌한 Collision 객체를 받아와서 객체의 이름이나 태그를 보고 판단하면 된다.

아래 코드는 내가 작성한 충돌감지 스크립트인데, 물체가 충돌을 감지하면 사운드클립을 재생한다.

 

void OnCollisionEnter(Collision col){
	if (col.gameObject.name == "handle") 
    	sound.PlayOneShot(sound.clip);  
}

 

나는 특정 물체와 충돌한 것만 감지하고 싶어서 오브젝트 이름으로 구분하는 코드를 쓰긴 했는데,

동일한 특성을 가진 여러 물체그룹과의 충돌감지를 원한다면 tag를 사용하는 것이 훨씬 깔끔할 것 같긴 하다.

태그 설정은 아래 사진에 나와있는 것 처럼 Inspector 창에서 할 수 있다.

 

 

혹은 아예 충돌 감지에 들어오지도 않도록 하고 싶다면,  Tag 옆의 Layer를 건드린 후 Project Settings > Physics > Layer Collision Matrix 에서 두 레이어 간 충돌 감지 체크를 해제해주면 된다. 

 

#4 물체에 스크립트 추가

 

스크립트 작성을 완료했다면 해당 스크립트를 동작시킬 물체에 스크립트를 추가해주면 된다.

스크립트 이름으로 검색하거나 Asset 폴더에서 드래그 앤 드롭 하면 된다.

 

더욱 간편하게는 add component -> script 를 통해 스크립트의 생성과 추가를 동시에 하는 방법이 있다.

 

충돌감지 스크립트를 추가한 모습.

 

스크립트 추가까지 완료하면 충돌 이벤트 처리가 완료된다. 

 

 

 

Comments