DNF LOVE
[Unity-2D 러닝 게임 만들기 6] Unity의 충돌 처리(Collision, Trigger) 본문
Unity에선 여러 충돌 처리를 지원해준다. 그 중 가장 대표적인 두 가지는 Trigger와 Collision이다.
이 둘의 차이와 함께 충돌 처리를 해보도록 하자.
1. 충돌처리 조건
충돌이 일어나기 위해서는 충돌이 일어나는 두 오브젝트 모두 Collider를 가지고 있어야 한다. 그리고 동적으로 움직이는 상대에게는 Rigidbody가 붙여져 있어야 한다.
우리는 이전 포스팅에서 Coin Object만 셋팅했지 Collider를 붙이진 않았었다.
이렇게 드래그 해서 컴포넌트를 붙이면 드래그 한 4개 모두 동시에 Box Collider 2D가 붙여진다.
Collider를 붙이면 Scene에서 Object 주변에 초록색으로 Collider가 붙여져 있는것을 확인 할 수 있다.
초록색으로 되어 있는 부분은 충돌체의 범위이다. 즉 충돌을 감지하는 영역이다.
또 이 Collider를 Inspector창을 통해 수정할 수 있다. 보통은 Object의 크기에 알맞게 자동으로 주어 지지만, 게임 난이도를 수정하기 위해서라던지 다양한 이유로 충돌체의 크기를 수정할 수 있다.
또, Collider에는 여러 종류가 있으니 유니티 API를 참조하길 바란다.
2. Collision
Collision은 물리적인 연산을 하며 충돌을 감지한다. Collision 처리를 하려면 둘 중 하나에는 반드시 Rigidbody가 붙여져 있어야 하며, 이 Rigidbody의 Kinematic 속성이 꺼져 있어야 한다.
Collision에는 3가지 종류가 있다.
함수명 |
쓰임새 |
Void OnCollisionEnter(Collision o) |
충돌이 시작되는 순간 호출 |
Void OnCollisionStay(Collision o) |
충돌이 되고 있을 때 매 프레임 마다 호출 |
Void OnCollisionExit(Collision o) |
충돌이 끝날 때 호출 |
이것은 3D기준이다.
collider2D혹은 Rigidbody2D를 붙일 수 있는 2D인 경우 void OnCollisionEnter2D(Collision2D o)이렇게 해야 한다.
void OnCollisionEnter2D(Collision2D other)
{
print(other.gameObject.name);
if (other.gameObject.name == "coin")
{
print(other.gameObject.name);
}
}
이렇게 쓸 수 있다. 이 코드는 PlayerController스크립트에 붙여져 있으며, 충돌할때 OnCollisionEnter2D함수를 불러온다. 함수의 파라미터로 Collision2D 객체가 들어오면 other을 이용하여 이와 충돌한 Object에 대해 처리를 할 수 있게 된다.
충돌하자마자 충돌한 Object의 이름을 console에 출력하고, 만약 충돌한 상태 Object의 이름이 "Coin"이면, 그 Object의 이름을 또 다시 console에 출력하라는 뜻이다.
3. Trigger
Trigger은 두 오브젝트 간의 물리적 연산을 하지 않고 충돌을 감지할 때 사용된다.
함수명 |
쓰임새 |
Void OnTriggerEnter(Collider c) |
충돌이 시작되는 순간 호출 |
Void OnTriggerStay(Collider c) |
충돌이 되고 있을 때 매 프레임 마다 호출 |
Void OnTriggerExit(Collider c) |
충돌이 끝날 때 호출 |
두 Object가 충돌할 때, Object가 밀려나거나 튕겨 나가지 않고 그대로 통과하게 된다는 뜻이다.
유의해야할 점은 충돌하는 두 Object의 Collider에 Is Trigger를 활성화 해야 한다.
우리는 Player에게 Rigidbody가 붙여져 있고 중력을 설정해 두었다. 얘의 Trigger가 활성화가 된다면 바닥체를 뚫고 아래로 끊임없이 내려갈 거다.
그러므로 Is Trigger는 Coin들에게 붙여주도록 하자.
void OnTriggerEnter2D(Collider2D o){
if(o.gameObject.name == "Coin")
{
print(o.gameObject.name);
}
}
우리는 Coin이 움직이지 않고 부딪치면 이 Coin이 사라지며 Score의 점수가 올라가는 것을 구현해야 하기 때문에
물리적 연산이 이루어 지지 않은 Trigger를 사용하도록 하겠다.
이렇게 말이다!
그런데 문제가 생겼다. 코인은 여러개 이고 각 순서에 맞게 Coin, Con 2, Coin 3, Coin 4 이라는 이름을 붙였는데 우리의 코드는 Coin하나만 조건문에 있다! 이럴 때 조건문을 계속 만들어 줘야 하는가?
아니다. Unity에서 Tag기능이 있다.
4. Tag
Tag는 말 그대로 태그이다. 오브젝트들의 속성들에 맞게 정리? 해주기 위해 사용된다.
태그틑 인스펙터 창에서 해당 오브젝트의 Tag를 지정해줄 수 있고, Add Tag를 통해 새로운 태그를 만들 수 있다.
우리는 Coin이라는 이름의 새로운 태그를 만들어주고, Coin들을 드래그 하여 한번에 태그를 추가해주도록 하자.
이 태그의 쓰임새는,
void OnTriggerEnter2D(Collider2D o){
if(o.gameObject.tag == "Coin")
{
print(o.gameObject.name);
}
}
이렇게 쓸 수 있다. 충돌한 o의 Object의 tag가 Coin이면 충돌한 오브젝트의 이름을 출력하겠다는 뜻이다.
다음은 정말 러닝 게임 만들기 튜토리얼의 마지막 포스팅이다.
코인과 Player가 부딪치면 코인은 사라지고 Score에 점수가 올라가는 것을 구현해보도록 하자.